学習目標
- 様々なプロバイダーのChat Modelsを使用する
- Prompt Templatesを使用して動的なプロンプトを作成する
- LLM出力を構造化データに解析する
- LangChain Expression Language(LCEL)を理解する
- コンポーネントを組み合わせて最初のチェーンを構築する
2.1 Chat Models
Chat ModelsはLangChainアプリケーションの基盤です。あらゆるプロバイダーのLLMと対話するための統一インターフェースを提供します。
Chat Model
メッセージの送信とレスポンスの受信のための一貫したインターフェースを提供するLLMのラッパー。すべてのチャットモデルは同じコアメソッド(invoke()、stream()、batch())をサポートしています。
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
# チャットモデルを初期化
llm = ChatOpenAI(
model="gpt-4",
temperature=0.7, # 創造性レベル(0-1)
max_tokens=500 # 最大レスポンス長
)
# メッセージはチャットモデルの入力形式
messages = [
SystemMessage(content="あなたは親切なコーディングアシスタントです。"),
HumanMessage(content="階乗を計算するPython関数を書いてください。"),
]
# invoke() - 単一のレスポンスを取得
response = llm.invoke(messages)
print(response.content)
# stream() - 生成されるにつれてレスポンスを取得
for chunk in llm.stream(messages):
print(chunk.content, end="", flush=True)
# batch() - 複数の入力を効率的に処理
batch_messages = [
[HumanMessage(content="2+2は?")],
[HumanMessage(content="3+3は?")],
]
responses = llm.batch(batch_messages)
for r in responses:
print(r.content)
2.2 Prompt Templates
Prompt Templatesを使用すると、再利用可能でパラメータ化されたプロンプトを作成できます:
from langchain_core.prompts import ChatPromptTemplate
# 変数を含むテンプレートを作成
template = ChatPromptTemplate.from_messages([
("system", "あなたは{topic}の専門家です。概念を明確に説明してください。"),
("human", "{question}")
])
# 特定の値でフォーマット
messages = template.invoke({
"topic": "機械学習",
"question": "勾配降下法とは何ですか?"
})
print(messages)
# 出力: [SystemMessage(content="あなたは機械学習の専門家です..."),
# HumanMessage(content="勾配降下法とは何ですか?")]
# モデルと一緒に使用
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
response = llm.invoke(messages)
print(response.content)
2.3 Output Parsers
Output ParsersはLLMのテキストレスポンスを構造化データに変換します:
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field
# 出力構造を定義
class MovieReview(BaseModel):
title: str = Field(description="映画タイトル")
rating: int = Field(description="1-10のレーティング")
summary: str = Field(description="レビューの簡潔な要約")
# 構造化出力を持つモデルを作成
llm = ChatOpenAI(model="gpt-4")
structured_llm = llm.with_structured_output(MovieReview)
# プロンプトを作成
prompt = ChatPromptTemplate.from_messages([
("system", "あなたは映画評論家です。与えられた映画を分析してください。"),
("human", "映画をレビューしてください:{movie}")
])
# チェーンして実行
chain = prompt | structured_llm
result = chain.invoke({"movie": "インセプション"})
# 結果はPydanticオブジェクト!
print(f"タイトル: {result.title}")
print(f"レーティング: {result.rating}/10")
print(f"要約: {result.summary}")
2.4 LangChain Expression Language(LCEL)
LCELは、パイプ(|)演算子を使用してチェーンを構成する宣言的な方法です:
LCEL(LangChain Expression Language)
LangChainコンポーネントをチェーンに構成するための構文。|で接続されたコンポーネントは、その出力を次のコンポーネントへの入力として渡します。すべてのLCELチェーンは自動的にinvoke、stream、batchをサポートします。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# コンポーネントを定義
prompt = ChatPromptTemplate.from_messages([
("system", "あなたは親切なアシスタントです。"),
("human", "'{text}'を{language}に翻訳してください。")
])
model = ChatOpenAI(model="gpt-4")
parser = StrOutputParser() # AIMessageから文字列を抽出
# LCELで構成(パイプ演算子)
chain = prompt | model | parser
# チェーンを使用
result = chain.invoke({
"text": "Hello, world!",
"language": "日本語"
})
print(result) # 出力: "こんにちは、世界!"
# ストリーミングは自動的に動作!
for chunk in chain.stream({"text": "Good morning", "language": "フランス語"}):
print(chunk, end="", flush=True)
LCELの利点
- 自動ストリーミング:ストリームサポートが無料で付属
- 自動バッチ処理:複数の入力を効率的に処理
- 自動リトライ:組み込みのエラー処理
- 自動ロギング:LangSmith統合
- 並列実行:
RunnableParallelで並行操作
LCELとLangGraphの使い分け
シンプルで線形なチェーン(prompt → model → parser)にはLCELを使用してください。分岐、サイクル、または状態管理を伴う複雑なワークフローには、代わりにLangGraphを使用してください。LangGraphノード内でLCELを使用することも常に可能です。
演習
演習1:カスタムPrompt Template
コードレビューアシスタント用のPrompt Templateを作成してください。language(プログラミング言語)とcodeをパラメータとして受け取り、バグと改善点についてコードをレビューするようモデルに依頼します。
演習2:構造化出力
求人情報から構造化情報を抽出するチェーンを作成してください。次のフィールドを持つPydanticモデルを定義します:job_title、company、salary_range(オプション)、required_skills(文字列のリスト)。
まとめ
- Chat ModelsはすべてのLLMプロバイダーに統一インターフェースを提供
- さまざまなユースケースに
invoke()、stream()、batch()を使用 - Prompt Templatesで再利用可能でパラメータ化されたプロンプトを作成
- Output Parsersでテキストを構造化データに変換
- LCELはパイプ(
|)演算子でコンポーネントを構成 - LCELチェーンは自動的にストリーミング、バッチ処理、ロギングをサポート