🇯🇵 JP | 🌐 EN

第2章:基本コンポーネント

Chat Models、Prompts、LCEL

📖 読了時間: 20-25分 📊 難易度: 初級 💻 コード例: 5 📝 演習: 2

学習目標

2.1 Chat Models

Chat ModelsはLangChainアプリケーションの基盤です。あらゆるプロバイダーのLLMと対話するための統一インターフェースを提供します。

graph LR subgraph Providers["LLMプロバイダー"] P1[OpenAI] P2[Anthropic] P3[Google] P4[その他...] end subgraph Interface["LangChainインターフェース"] CM[ChatModel] end subgraph Methods["共通メソッド"] M1[.invoke] M2[.stream] M3[.batch] end Providers --> CM CM --> Methods style CM fill:#667eea,color:#fff

Chat Model

メッセージの送信とレスポンスの受信のための一貫したインターフェースを提供するLLMのラッパー。すべてのチャットモデルは同じコアメソッド(invoke()stream()batch())をサポートしています。

コード例1:Chat Modelsの使用
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を使用すると、再利用可能でパラメータ化されたプロンプトを作成できます:

コード例2: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のテキストレスポンスを構造化データに変換します:

コード例3:Pydanticを使用した構造化出力
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をサポートします。

コード例4:LCELでチェーンを構築
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の利点

LCELとLangGraphの使い分け

シンプルで線形なチェーン(prompt → model → parser)にはLCELを使用してください。分岐、サイクル、または状態管理を伴う複雑なワークフローには、代わりにLangGraphを使用してください。LangGraphノード内でLCELを使用することも常に可能です。

演習

演習1:カスタムPrompt Template

コードレビューアシスタント用のPrompt Templateを作成してください。language(プログラミング言語)とcodeをパラメータとして受け取り、バグと改善点についてコードをレビューするようモデルに依頼します。

演習2:構造化出力

求人情報から構造化情報を抽出するチェーンを作成してください。次のフィールドを持つPydanticモデルを定義します:job_titlecompanysalary_range(オプション)、required_skills(文字列のリスト)。

まとめ

免責事項

本コンテンツは教育目的で提供されています。LangChainはLangChain Inc.によって開発・保守されています。