LangChain Expression Language (LCEL) 記法について解説(LangChain 0.3系)

LangChainは、AIアプリケーション開発のフレームワークとして人気が高まっており、特にプロンプト設計やモデルの連携を効率化するための強力なツールを提供します。その中で、最近注目されているのが **LangChain Expression Language (LCEL)** という記法です。本記事では、LCEL記法の基本から応用までを解説し、具体例を交えてその利便性を説明します。

本記事で使用しているライブラリのバージョンを以下に示します。
```
langchain-core           0.3.22
langchain-openai         0.2.12
```
※執筆時点のバージョンです。バージョンによって一部のAPIや挙動が異なる可能性があります。

## 1. LCEL記法とは何か
LCEL記法は、LangChainにおけるプロンプト設計、モデル連携、出力処理を直感的かつ簡潔に記述するための記法です。従来のコード記述では複雑になりがちな部分を、記号やシンプルな構文を用いて分かりやすく表現できるのが特徴です。

LangChainを使った開発では、「プロンプト」「モデル」「出力パーサー」など複数のコンポーネントを組み合わせることが多く、この記法により各コンポーネントの連携がシンプルになります。

## 2. LCEL記法の基本構文
LCEL記法では、以下のようなパイプ（|）記号を使用して、データフローを明示的に表現します。

```
chain = prompt | model | outputparser
```

それぞれの役割は以下の通りです：
* prompt: 入力データを生成するためのプロンプトテンプレート。
* model: 実際にプロンプトを処理する言語モデル。
* outputparser: モデルの出力を処理するためのパーサー。

この構文により、順次処理されるデータの流れが直感的に理解できます。

## 3. LCEL記法を用いた具体例

以下は、指定されたスキルを学ぶための1週間の学習計画を生成する簡単な例です。

```Python
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser


# プロンプトの定義
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "指定されたスキルを習得するための1週間の学習計画を提案してください。"),
        ("human", "{skill}"),
    ]
)

# モデルの設定
model = ChatOpenAI(model="gpt-4o-mini", temperature=0, max_completion_tokens=1000)

# 出力パーサーの設定
outputparser = StrOutputParser()

# LCEL記法によるチェーンの作成
chain = prompt | model | outputparser

# チェーンの実行
result = chain.invoke({"skill": "NLPの概要"})

print(result)
```

| >出力
```
自然言語処理（NLP）の概要を理解するための1週間の学習計画を提案します。この計画は、基本的な概念から実践的なスキルまでをカバーします。

### 1日目: NLPの基礎
- **目標**: NLPの基本概念を理解する
- **学習内容**:
  - NLPとは何か
  - NLPの歴史と進化
  - 主な応用例（機械翻訳、感情分析、チャットボットなど）
- **リソース**:
  - オンライン講座（CourseraやedXのNLP入門コース）
  - NLPに関する書籍（例: "Speech and Language Processing" by Jurafsky and Martin）

### 2日目: テキスト前処理
- **目標**: テキストデータの前処理技術を学ぶ
- **学習内容**:
  - トークン化、ストップワードの除去、ステミング、レンマタイゼーション
  - テキストの正規化（小文字化、記号の除去など）
- **リソース**:
  - PythonのNLTKやspaCyのドキュメント
  - 実践的なチュートリアル（KaggleやTowards Data Science）

### 3日目: 特徴抽出
- **目標**: テキストから特徴を抽出する方法を学ぶ
- **学習内容**:
  - Bag of Words（BoW）モデル
  - TF-IDF（Term Frequency-Inverse Document Frequency）
  - Word Embeddings（Word2Vec、GloVe）
- **リソース**:
  - オンラインチュートリアル（MediumやKaggle）
  - 実際のデータセットを使った演習

### 4日目: モデルの構築
- **目標**: NLPモデルの構築方法を学ぶ
- **学習内容**:
  - 基本的な機械学習アルゴリズム（ロジスティック回帰、SVMなど）
  - テキスト分類の実践（スパムフィルタリングなど）
- **リソース**:
  - Scikit-learnのドキュメント
  - 実践的なプロジェクト（Kaggleのコンペティション）

### 5日目: 深層学習とNLP
- **目標**: 深層学習を用いたNLPの手法を理解する
- **学習内容**:
  - RNN（再帰神経ネットワーク）とLSTM（長短期記憶）
  - Transformerモデルの基本（BERT、GPTなど）
- **リソース**:
  - TensorFlowやPyTorchのチュートリアル
  - 研究論文（Attention is All You Need）

### 6日目: 実践プロジェクト
- **目標**: 学んだ知識を活かしてプロジェクトを実施する
- **学習内容**:
  - 自分の興味のあるテーマでNLPプロジェクトを選定
  - データ収集、前処理、モデル構築、評価を行う
- **リソース**:
  - KaggleやGitHubのプロジェクトを参考にする
  - コードの実装と結果の分析

### 7日目: 振り返りと今後の学習
- **目標**: 学んだ内容を振り返り、今後の学習計画を立てる
- **学習内容**:
  - 1週間の学習内容をまとめる
  - さらなる学習リソースやコミュニティ（フォーラム、勉強会など）を探す
- **リソース**:
  - NLP関連の書籍やオンラインコース
  - 学習コミュニティ（Kaggle、RedditのNLPサブレディットなど）

この計画を通じて、NLPの基礎から実践的なスキルまでを習得することができます。興味のある分野に応じて、さらに深掘りして学習を続けてください。
```

### 3.1 各コンポーネントの詳細
* ChatPromptTemplate:  
    * プロンプトテンプレートを作成するクラス。
from_messagesメソッドを用いて、複数のメッセージを順序付けて定義できます。

* ChatOpenAI:  
    * OpenAIのモデルを操作するクラス。
モデルの種類や動作のパラメータ（例: temperatureやmax_completion_tokens）を設定可能。

* StrOutputParser:  
    * モデルの出力を文字列形式で処理するシンプルなパーサー。

## 4. LCEL記法のメリット

### 4.1 読みやすさと簡潔さ
パイプ（|）記法により、データフローが簡潔に表現され、コードの可読性が向上します。例えば、以下のような従来の記述と比較して、簡単に理解できます。

従来の記述例:

```Python
prompt_result = prompt.invoke(input_data)
model_result = model.invoke(prompt_result)
res = outputparser.invoke(model_result)
```

LCEL記法:
```Python
chain = prompt| model | outputparser
res = chain.invoke(input_data)
```

### 4.2 保守性の向上
各コンポーネントが独立しているため、変更や再利用が簡単です。例えば、プロンプトやモデルだけを差し替える際も他の部分に影響を与えません。

### 4.3 コードのモジュール性
コンポーネントの順序を明確に保ちながら、柔軟に組み合わせが可能です。

## 5. 注意点
### 5.1 ChatOpenAIの実行
ChatOpenAIの実行には環境変数に以下の設定が必要になります。
* OPENAI_API_KEY: ChatOpenAIは環境変数からAPIキーを取得して実行します
### 5.2 max_completion_tokensの指定
max_completion_tokensを適切に設定しないと、生成されるトークン数が想定以上に増加し、結果としてOpenAIの利用料金が増える可能性があります。特に、長文の応答を必要としない場合はこの値を制限することをお勧めします。

## まとめ
LCEL記法は、LangChainを用いたAIアプリケーション開発を直感的かつ効率的に進めるための強力なツールです。本記事で紹介した記法や具体例を活用することで、より読みやすく保守性の高いコードを記述できます。