🇯🇵 JP | 🌐 EN

第5章:本番環境へのデプロイ

LangSmith、LangGraph、ベストプラクティス

📖 読了時間: 15-20分 📊 難易度: 中級 💻 コード例: 4 📝 演習: 1

学習目標

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("こんにちは")

セキュリティチェックリスト

5.5 次のステップ

この入門の完了おめでとうございます!次に進むべき方向は以下の通りです:

知識を深める

リソース

演習

演習:本番対応RAG

第4章のRAGシステムを本番対応にしてください:

  1. LangSmithトレースを有効化する
  2. 埋め込みとLLM呼び出しのキャッシングを追加する
  3. フォールバックモデルを実装する
  4. 入力検証を追加する
  5. APIエンドポイントとしてデプロイする(FastAPI推奨)

まとめ

免責事項

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