LangChain 出力戦略

LangChain は3つの構造化出力戦略を提供しています。それらの違いと動作原理を理解することで、さまざまなシナリオで最適な選択ができます。


3つの戦略の概要

戦略原理モデル対応応答速度
ToolStrategySchema をツールに見せかけ、モデルがこのツールを「呼び出して」構造化データを出力するfunction calling をサポートするすべてのモデル遅い(ツール呼び出しが1回多い)
ProviderStrategyモデルネイティブの構造化出力機能を使用する(例:OpenAI の response_format)一部のモデル(GPT-4o+、Claude 3+ など)速い(直接出力)
AutoStrategyモデルの能力を自動検出し、最適な戦略を選択する自動適応自動で最適を選択

ToolStrategy——ツール呼び出しモード

ToolStrategy は互換性が最も高い方法です。Schema を「偽のツール」に変換し、モデルがこのツールを呼び出すことで構造化データを出力します。

例

from pydantic import BaseModel, Field
from langchain.agents import create_agent
from langchain.agents.structured_output import ToolStrategy
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage


class WeatherReport(BaseModel):
    """天气报告"""
    city: str = Field(description="城市名称")
    temperature: float = Field(description="温度(摄氏度)")
    condition: str = Field(description="天气状况")
    humidity: int = Field(description="湿度百分比")


model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)

# 显式指定使用 ToolStrategy
agent = create_agent(
    model=model,
    response_format=ToolStrategy(schema=WeatherReport),
    system_prompt="あなたは天気アシスタントです。ユーザーの説明に基づいて構造化された天気レポートを生成します。",
)

result = agent.invoke({
    "messages": [HumanMessage(content="杭州今天晴天,温度25度,湿度60%")]
})

report = result["structured_response"]
print(f"城市: {report.city}")
print(f"温度: {report.temperature}°C")
print(f"状况: {report.condition}")
print(f"湿度: {report.humidity}%")

# 実行プロセスを確認する——ツール呼び出しのメッセージが1つ増えていることがわかる
print(f"\n消息总数: {len(result['messages'])}")
for msg in result["messages"]:
    print(f"  [{msg.type}]", end="")
    if hasattr(msg, 'tool_calls') and msg.tool_calls:
        print(f" 调用: {[tc['name'] for tc in msg.tool_calls]}")
    elif msg.type == "tool":
        print(f" {msg.content[:60]}")
    else:
        print(f" {str(msg.content)[:60]}")

実行結果:

都市: 杭州
気温: 25.0°C
状況: 晴天
湿度: 60%

メッセージ総数: 4
  [human] 杭州今天晴天,温度25度,湿度60%
  [ai] 调用: ['WeatherReport']
  [tool] Returning structured response: ...
  [ai]

ToolStrategy にはツール呼び出しのステップ(WeatherReport という「偽のツール」の呼び出し)が追加され、その後に構造化出力が行われることがわかります。

handle_errors——エラーリトライ

ToolStrategy は、構造化出力でエラーが発生した場合に自動リトライをサポートしています:

例

from langchain.agents.structured_output import ToolStrategy

# handle_errors=True:输出格式错误时,将错误信息反馈给模型重试
strategy_with_retry = ToolStrategy(
    schema=WeatherReport,
    handle_errors=True,  # 默认 False
)

# handle_errors はカスタムエラーメッセージテンプレートにすることもできます。
strategy_custom_error = ToolStrategy(
    schema=WeatherReport,
    handle_errors="格式有误,请按 {error} 修正后重新输出",
)

ProviderStrategy——ネイティブ構造化出力

ProviderStrategy は、モデルプロバイダーのネイティブ機能(例:OpenAI の response_format パラメータ)を使用します。すべてのモデルが対応しているわけではありません。

例

from pydantic import BaseModel, Field
from langchain.agents import create_agent
from langchain.agents.structured_output import ProviderStrategy
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage


class CourseInfo(BaseModel):
    """课程信息"""
    name: str = Field(description="课程名称")
    level: str = Field(description="难度:入门/进阶/高级")
    price: str = Field(description="价格信息")


model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)

# 显式指定 ProviderStrategy
agent = create_agent(
    model=model,
    response_format=ProviderStrategy(schema=CourseInfo),
    system_prompt=「あなたはサンプルのコースアシスタントです。」,
)

result = agent.invoke({
    "messages": [HumanMessage(content=Python3の基本チュートリアルは初心者向けの無料コースです。)]
})

course = result["structured_response"]
print(f"课程: {course.name}")
print(f"难度: {course.level}")
print(f"价格: {course.price}")
print(f"\n消息数: {len(result['messages'])}")  # 比 ToolStrategy 少

実行結果:

コース: Python3 基础教程
難易度: 入门
価格: 免费

メッセージ数: 2

ToolStrategy と比較すると、ProviderStrategy は追加のツール呼び出しステップが不要なため、メッセージ数が少なくなります(2件 vs 4件)。

ProviderStrategy は現在、主に OpenAI の GPT-4o 以降と Claude 3 以降でサポートされています。モデルが非対応の場合、LangChain は自動的に ToolStrategy にフォールバックします。モデルが対応しているかどうかは、model.profile で確認できます。


AutoStrategy——自動選択

最も推奨される方法です。Pydantic モデル(戦略オブジェクトではなく)を渡すと、LangChain が自動的に最適な戦略を選択します:

例

from pydantic import BaseModel, Field
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage


class Analysis(BaseModel):
    """分析结果"""
    summary: str = Field(description="一句话总结")
    score: int = Field(description="评分 1~10")
    pros: list[str] = Field(description="优点列表")
    cons: list[str] = Field(description="缺点列表")


# 直接传入 Pydantic 模型——LangChain 自动选择策略
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0)
agent = create_agent(
    model=model,
    response_format=Analysis,  # 直接传模型,自动选择策略
    system_prompt="あなたはコース評価の専門家であり、ユーザーが説明したコースを評価します。",
)

result = agent.invoke({
    "messages": [HumanMessage(
        content=サンプル の Python コース:内容は体系のかつ包括の、
                "实例丰富,而且完全免费。但视频教程较少,"
                "高级内容覆盖不够。"
    )]
})

analysis = result["structured_response"]
print(f"总结: {analysis.summary}")
print(f"评分: {analysis.score}/10")
print(f"优点: {', '.join(analysis.pros)}")
print(f"缺点: {', '.join(analysis.cons)}")

実行結果:

要約: サンプル Python 课程内容系统且免费,但缺乏视频教学和高级内容
評価: 7/10
長所: 内容系统全面, 实例丰富, 完全免费
短所: 视频教程较少, 高级内容覆盖不够

3つの戦略の選択ガイド

シナリオ推奨戦略理由
モデルがネイティブ出力をサポートしているか不明AutoStrategy(Pydantic を直接渡す)自動で最適な戦略を選択
さまざまなモデルとの互換性が必要ToolStrategyfunction calling をサポートするすべてのモデルで利用可能
最高のパフォーマンスを追求ProviderStrategyツール呼び出しのステップをスキップして高速化
エラーリトライが必要ToolStrategy(handle_errors=True)handle_errors をサポートするのは ToolStrategy のみ

ほとんどの場合、Pydantic モデルを直接渡す(つまり AutoStrategy を使用する)だけで十分です。エラーリトライが必要な場合や、戦略の動作を明示的に制御したい場合にのみ、ToolStrategy または ProviderStrategy を明示的に指定する必要があります。

その他の拡張