学習目標
- LangSmithを使用した監視とデバッグ
- LCELからLangGraphへの移行タイミングを理解する
- MCP(Model Context Protocol)ツールを統合する
- 本番環境のベストプラクティスと最適化を適用する
- 高度なLangChain開発の次のステップを計画する
5.1 LangSmith:LLMアプリケーションの可観測性
LangSmithは、本番環境でLLMアプリケーションのトレース、デバッグ、監視を行うためのLangChainのプラットフォームです。
graph TB
subgraph App["あなたのアプリケーション"]
A[LangChainコード]
end
subgraph LS["LangSmithプラットフォーム"]
B[トレース]
C[デバッグ]
D[評価]
E[モニタリング]
end
A -->|自動ログ| B
B --> C
B --> D
B --> E
style A fill:#667eea,color:#fff
style LS fill:#f8f9fa
LangSmithのセットアップ
コード例1:LangSmithの設定
import os
# 環境変数を設定(または.envファイルを使用)
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-langsmith-api-key"
os.environ["LANGCHAIN_PROJECT"] = "my-project" # オプション:トレースを整理
# これで、すべてのLangChain操作が自動的にトレースされます!
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4")
prompt = ChatPromptTemplate.from_messages([
("system", "あなたは親切なアシスタントです。"),
("human", "{question}")
])
chain = prompt | llm
# この呼び出しは自動的にLangSmithに記録されます
response = chain.invoke({"question": "フランスの首都はどこですか?"})
print(response.content)
# トレースを確認: https://smith.langchain.com
LangSmithで確認できること
- 完全なトレース階層:チェーン内のすべてのステップを確認
- レイテンシ分析:遅いコンポーネントを特定
- トークン使用量:リクエストごとのコストを追跡
- エラー詳細:完全なコンテキストで失敗をデバッグ
- 入出力ペア:何が入力され、何が出力されたかを確認
LangSmithの料金(2025年)
- 無料枠:月5,000トレース、1シート
- 有料プラン:より高い制限、チーム機能
- セルフホスト:オンプレミスデプロイ用エンタープライズプラン
5.2 LangGraphを使用するタイミング
LangGraphは、複雑でステートフルなエージェントワークフローを構築するためのLangChainのフレームワークです。シンプルなLCELチェーンを超える必要がある場合に使用します。
LCEL vs LangGraph 判断マトリックス
| ユースケース | LCEL | LangGraph |
|---|---|---|
| シンプルな prompt → model → parser | ✅ | |
| 検索付きRAG | ✅ | |
| ツール付き基本エージェント | ✅ | |
| 複雑な分岐ロジック | ✅ | |
| マルチエージェントコラボレーション | ✅ | |
| Human-in-the-loop承認 | ✅ | |
| 永続的な会話状態 | ✅ | |
| サイクル/ループを含むワークフロー | ✅ |
コード例2:LangGraphエージェントのプレビュー
# LangGraphは状態を持つ複雑なワークフローを可能にする
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator
# 状態スキーマを定義
class AgentState(TypedDict):
messages: Annotated[list, operator.add]
next_step: str
# グラフを作成
workflow = StateGraph(AgentState)
# ノードを追加(各ノードは関数)
workflow.add_node("research", research_node)
workflow.add_node("write", write_node)
workflow.add_node("review", review_node)
# エッジを追加(フローを定義)
workflow.add_edge("research", "write")
workflow.add_conditional_edges(
"write",
should_continue, # 次のノードを返す関数
{"review": "review", "end": END}
)
# コンパイルして実行
app = workflow.compile()
result = app.invoke({"messages": ["AIについてブログ記事を書いて"]})
5.3 MCP(Model Context Protocol)統合
MCPは、アプリケーションがLLMにツールを提供する方法を標準化するオープンプロトコルです。LangChainはアダプターを通じてMCPをサポートしています:
コード例3:MCPツールの使用
from langchain_mcp_adapters import MultiServerMCPClient
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
# MCPサーバーに接続
async with MultiServerMCPClient(
{
"filesystem": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-filesystem", "/path/to/allowed/dir"]
},
"web": {
"url": "http://localhost:8080/mcp" # HTTPベースのMCPサーバー
}
}
) as client:
# 接続されたすべてのサーバーからツールを取得
tools = client.get_tools()
# MCPツールでエージェントを作成
agent = create_agent(
model=ChatOpenAI(model="gpt-4"),
tools=tools,
system_prompt="あなたはファイルを読み取り、Webを閲覧できます。"
)
result = await agent.ainvoke({
"messages": [{"role": "user", "content": "README.mdファイルを読んでください"}]
})
MCP(Model Context Protocol)
アプリケーションがLLMにツールを公開する方法を標準化するオープンプロトコル(2025年にLinux Foundationに寄贈)。OpenAI、Anthropic、Googleなどが主要な採用者です。2026年までに、ほとんどの主要APIがREST APIと並んでMCPサーバーを提供すると予想されています。
5.4 本番環境のベストプラクティス
パフォーマンス最適化
コード例4:キャッシングとストリーミング
import asyncio
from langchain_openai import ChatOpenAI
from langchain_core.globals import set_llm_cache
from langchain_community.cache import SQLiteCache
# 冗長なAPI呼び出しを避けるためにキャッシングを有効化
set_llm_cache(SQLiteCache(database_path=".langchain.db"))
# より良いUXのためにストリーミングを使用
llm = ChatOpenAI(model="gpt-4", streaming=True)
# より良いスループットのためにAsyncを使用
async def process_many(questions):
tasks = [llm.ainvoke(q) for q in questions]
return await asyncio.gather(*tasks)
エラーハンドリング
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnableWithFallbacks
# フォールバックチェーンを作成
primary = ChatOpenAI(model="gpt-4")
fallback = ChatOpenAI(model="gpt-3.5-turbo")
robust_llm = primary.with_fallbacks([fallback])
# gpt-4を試し、失敗したらgpt-3.5-turboを試す
response = robust_llm.invoke("こんにちは")
セキュリティチェックリスト
- ✅ APIキーを環境変数またはシークレットマネージャーに保存する
- ✅ LLMに渡す前にユーザー入力を検証・サニタイズする
- ✅ コスト暴走を防ぐためにトークン制限を設定する
- ✅ 公開APIにはレート制限を使用する
- ✅ 異常なパターンをログに記録し監視する
- ✅ ツールの権限を確認する(特にシェル/ファイルアクセスを持つエージェント)
5.5 次のステップ
この入門の完了おめでとうございます!次に進むべき方向は以下の通りです:
知識を深める
- LangGraph:サイクルと状態を持つ複雑なマルチエージェントシステムを構築
- 高度なRAG:リランキング、クエリ拡張、ハイブリッド検索を探求
- 評価:LangSmithを使用してチェーンを体系的に評価
- カスタムモデル:OllamaやvLLMでローカルLLMを統合
リソース
演習
演習:本番対応RAG
第4章のRAGシステムを本番対応にしてください:
- LangSmithトレースを有効化する
- 埋め込みとLLM呼び出しのキャッシングを追加する
- フォールバックモデルを実装する
- 入力検証を追加する
- APIエンドポイントとしてデプロイする(FastAPI推奨)
まとめ
- LangSmithはトレース、デバッグ、監視を提供
- 分岐、サイクル、または状態を持つ複雑なワークフローにはLangGraphを使用
- MCPはツール統合の新しい標準
- 本番アプリにはキャッシング、フォールバック、エラーハンドリングが必要
- 常にセキュリティを考慮:入力検証、レート制限、監視