LangChain 1.0 : コアコンポーネント – エージェント

エージェントは言語モデルを ツール と組み合わせて、タスクについて推論し、どのツールを使用するか決定し、解決に向けて繰り返し作業できるシステムを作成します。create_agent は本番環境で利用できるエージェント実装を提供します。

LangChain 1.0 : コアコンポーネント – エージェント

作成 : クラスキャット・セールスインフォメーション
作成日時 : 11/20/2025
バージョン : 1.0.8

* 本記事は docs.langchain.com の以下のページを独自に翻訳した上で、補足説明を加えてまとめ直しています。スニペットはできる限り日本語を使用しています :

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット AI 研究開発支援サービス ⭐️ 創立30周年(30th Anniversary)🎉💐

クラスキャット は AI に関する各種サービスを提供しています。お気軽にご相談ください :

  • AI 研究開発支援 [詳細]

    1. AI エージェント構築支援
    2. 画像認識 (医療系含む) / 画像生成

  • AI 導入個別相談会(無償)実施中! [詳細]

  • PoC(概念実証)を失敗させないための支援 [詳細]

お問合せ : 下記までお願いします。

  • クラスキャット セールス・インフォメーション
  • sales-info@classcat.com
  • ClassCatJP

 

 

LangChain 1.0 : コアコンポーネント – エージェント

エージェントは言語モデルを ツール と組み合わせて、タスクについて推論し、どのツールを使用するか決定し、解決に向けて繰り返し作業できるシステムを作成します。

create_agent は本番環境で利用できるエージェント実装を提供します。

LLM エージェントは目標を達成するためにループ内でツールを実行します。エージェントは停止条件が満たされるまで、つまり、モデルが最終的な出力を生成するか、反復回数の制限に達するまで実行されます。

補足

💡 create_agent() は、論文 ReAct: Synergizing Reasoning and Acting in Language Models に基づいた ReAct (Reasoning + Acting) エージェントの実装を提供します。

ReAct はエージェントの動作を、思考 (thought) -> 行動 (action) -> 観察 (observation) のステップとして捉えます、そこではモデルは推論を書き出し、ツールを選択し、ツールの結果を確認し、そしてそれを繰り返します。ReAct はハルシネーションを減らし、意思決定プロセスを監査できます : エージェントは仮説を立て (思考)、ツールで検証し (行動)、フィードバックに基づいて計画をアップデートします (観察)。

ReAct ループは停止条件まで実行されます – i.e., モデルが最終的な答えを出力したり、最大反復回数の制限に達した場合です。

Info

create_agent() は LangGraph を使用して、グラフ ベースのエージェント・ランタイムを構築します。グラフは、エージェントが情報を処理する方法を定義する、ノード (ステップ) とエッジ (接続) から構成されます。エージェントはこのグラフ内を移動し、(モデルを呼び出す) モデルノード、(ツールを実行する) ツールノード、またはミドルウェアようなノードを実行します。

Learn more about the graph API.

 

コア・コンポーネント

モデル

モデル はエージェントの推論エンジンです。モデルは複数の方法で指定できて、静的なモデルと動的なモデルの選択の両方をサポートします。


 

静的モデル

静的モデルはエージェントを作成する際に一度だけ構成設定され、実行中に変更されません。これは最も一般的で分かりやすいアプローチです。モデル識別子文字列で静的モデルを初期化します :

from langchain.agents import create_agent

agent = create_agent(
    "gpt-5",
    tools=tools
)

💡 モデル識別子文字列は自動推論をサポートしています (例: “gpt-5” は “openai:gpt-5” として推論されます)。モデル識別子文字列のマッピングの完全なリストについては、リファレンス を参照してください。

 
モデル構成設定をより制御するには、プロバイダーパッケージを使用してモデルインスタンスを直接初期化します。この例では、ChatOpenAI を使用しています。他の利用可能なチャットモデル・クラスについては Chat models をご覧ください。

from langchain.agents import create_agent
from langchain_openai import ChatOpenAI

model = ChatOpenAI(
    model="gpt-5",
    temperature=0.1,
    max_tokens=1000,
    timeout=30
    # ... (other params)
)
agent = create_agent(model, tools=tools)

モデル・インスタンスは設定を完全に制御できます。temperature, max_tokens, timeouts, base_url のような特定の パラメータ や、その他のプロバイダー固有の設定をセットする必要がある場合に、それらを使用します。利用可能なパラメータやメソッドを確認するには、リファレンス を参照してください。

 

動的モデル

動的モデルは、現在の状態とコンテキストに基づいて、実行時に選択されます。これは洗練されたルーティング・ロジックとコストの最適化を可能にします。

動的モデルを使用するには、リクエスト内のモデルを変更する @wrap_model_call デコレータを使用してミドルウェアを作成します :

from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponse


basic_model = ChatOpenAI(model="gpt-4o-mini")
advanced_model = ChatOpenAI(model="gpt-4o")

@wrap_model_call
def dynamic_model_selection(request: ModelRequest, handler) -> ModelResponse:
    """Choose model based on conversation complexity."""
    message_count = len(request.state["messages"])

    if message_count > 10:
        # Use an advanced model for longer conversations
        model = advanced_model
    else:
        model = basic_model

    request.model = model
    return handler(request)

agent = create_agent(
    model=basic_model,  # Default model
    tools=tools,
    middleware=[dynamic_model_selection]
)

 

ツール

ツールはエージェントにアクションを行う機能を与えます。エージェントは、単純なモデルのみのツール・バインディングを超えて、以下を提供します :

  • (単一のプロンプトでトリガーされる) 一連の複数のツール呼び出し

  • 適切な場合のツールの並列呼び出し

  • 以前の結果に基づく、動的なツール選択

  • ツール再試行ロジックとエラー処理

  • ツール呼び出しにわたる状態の永続化

For more information, see Tools.

 

ツールの定義

ツールのリストをエージェントに渡します。

💡ツールは plain Python 関数かコルーチンとして指定できます。tool デコレータは、ツール名、説明、引数スキーマや他のプロパティをカスタマイズするために使用できます。

from langchain.tools import tool
from langchain.agents import create_agent


@tool
def search(query: str) -> str:
    """Search for information."""
    return f"Results for: {query}"

@tool
def get_weather(location: str) -> str:
    """Get weather information for a location."""
    return f"Weather in {location}: Sunny, 72°F"

agent = create_agent(model, tools=[search, get_weather])

空のツールリストが提供された場合、エージェントはツール呼び出し機能のない単一の LLM ノードから構成されます。

 

ツールエラー処理

ツールエラーを処理する方法をカスタマイズするには、@wrap_tool_call デコレータを使用してミドルウェアを作成します :

from langchain.agents import create_agent
from langchain.agents.middleware import wrap_tool_call
from langchain.messages import ToolMessage


@wrap_tool_call
def handle_tool_errors(request, handler):
    """Handle tool execution errors with custom messages."""
    try:
        return handler(request)
    except Exception as e:
        # Return a custom error message to the model
        return ToolMessage(
            content=f"Tool error: Please check your input and try again. ({str(e)})",
            tool_call_id=request.tool_call["id"]
        )

agent = create_agent(
    model="gpt-4o",
    tools=[search, get_weather],
    middleware=[handle_tool_errors]
)

エージェントは、ツールが失敗した場合にはカスタム・エラーメッセージとともに ToolMessage を返します :

[
    ...
    ToolMessage(
        content="Tool error: Please check your input and try again. (division by zero)",
        tool_call_id="..."
    ),
    ...
]

 

ReAct ループにおけるツールの使用

エージェントは ReAct (「推論 + 行動」) パターンに従い、簡潔な推論ステップと的を絞ったツール呼び出しを交互に繰り返し、結果としての観察を後続の意思決定に供給することで、最終的な答えを提供できます。

ReAct ループの例

Prompt: 現在最も人気のあるワイヤレスヘッドホンを識別子、入手可能性を確認してください。

================================ Human Message =================================

Find the most popular wireless headphones right now and check if they're in stock
  • Reasoning:「人気は時間によるので、提供された検索ツールを使用する必要がある。」

  • Acting: search_products(“wireless headphones”) の呼び出し
================================== Ai Message ==================================
Tool Calls:
  search_products (call_abc123)
 Call ID: call_abc123
  Args:
    query: wireless headphones
================================= Tool Message =================================

Found 5 products matching "wireless headphones". Top 5 results: WH-1000XM5, ...
  • Reasoning:「回答する前に、トップランクの商品の在庫を確認する必要がある。」

  • Acting: Call check_inventory(“WH-1000XM5”)
================================== Ai Message ==================================
Tool Calls:
  check_inventory (call_def456)
 Call ID: call_def456
  Args:
    product_id: WH-1000XM5
================================= Tool Message =================================

Product WH-1000XM5: 10 units in stock
  • Reasoning:「最も人気のあるモデルとその在庫状況を把握しています。ユーザの質問に答えられるようになりました。」

  • Acting: 最終的な答えの生成
================================== Ai Message ==================================

I found wireless headphones (model WH-1000XM5) with 10 units in stock...

To learn more about tools, see Tools.

 

システムプロンプト

プロンプトを提供することで、エージェントがタスクにアプローチする方法を形成できます。system_prompt パラメータは文字列として提供できます :

agent = create_agent(
    model,
    tools,
    system_prompt="You are a helpful assistant. Be concise and accurate."
)

system_prompt が提供されない場合、エージェントはメッセージから直接、タスクを推測します。

 

動的システムプロンプト

実行時コンテキストやエージェント状態に基づいてシステムプロンプトを変更する必要がある高度なユースケースでは、ミドルウェア を使用できます。

@dynamic_prompt デコレータは、モデル要求に従ってシステムプロンプトを動的に生成するミドルウェアを作成します :

from typing import TypedDict

from langchain.agents import create_agent
from langchain.agents.middleware import dynamic_prompt, ModelRequest


class Context(TypedDict):
    user_role: str

@dynamic_prompt
def user_role_prompt(request: ModelRequest) -> str:
    """Generate system prompt based on user role."""
    user_role = request.runtime.context.get("user_role", "user")
    base_prompt = "You are a helpful assistant."

    if user_role == "expert":
        return f"{base_prompt} Provide detailed technical responses."
    elif user_role == "beginner":
        return f"{base_prompt} Explain concepts simply and avoid jargon."

    return base_prompt

agent = create_agent(
    model="gpt-4o",
    tools=[web_search],
    middleware=[user_role_prompt],
    context_schema=Context
)

# The system prompt will be set dynamically based on context
result = agent.invoke(
    {"messages": [{"role": "user", "content": "Explain machine learning"}]},
    context={"user_role": "expert"}
)

 

Invocation (起動)

状態への更新情報を渡すことで、エージェントを起動 (invoke) できます。すべてのエージェントはその 状態 内に メッセージのシークエンス を含みます; エージェントを起動するには、新しいメッセージを渡します :

result = agent.invoke(
    {"messages": [{"role": "user", "content": "What's the weather in San Francisco?"}]}
)

 

以上