LangChain create_agent() 関数

create_agent() は LangChain の中核となる関数で、モデル呼び出し、ツール実行、ループ制御など、すべてのロジックを含む完全な Agent グラフ(StateGraph)を作成します。

構文

create_agent() 関数の構文は次のとおりです:

from langchain.agents import create_agent

agent = create_agent(
    model,                     # str | BaseChatModel:语言模型
    tools=None,                # Sequence:工具列表
    *,
    system_prompt=None,        # str | SystemMessage:系统提示
    middleware=(),             # Sequence[AgentMiddleware]:中间件列表
    response_format=None,      # ResponseFormat | type:结构化输出配置
    state_schema=None,         # type[AgentState]:自定义状态结构
    context_schema=None,       # type:运行时上下文结构
    checkpointer=None,         # Checkpointer:对话持久化
    store=None,                # BaseStore:跨会话存储
    interrupt_before=None,     # list[str]:在哪些节点前暂停
    interrupt_after=None,      # list[str]:在哪些节点后暂停
    debug=False,               # bool:是否输出详细日志
    name=None,                 # str:Agent 名称
    cache=None,                # BaseCache:缓存配置
)

model パラメータ——モデル設定

model は2つの形式を受け付けます:文字列(init_chat_model() で処理される)または構築済みの BaseChatModel インスタンスです。

例

from langchain.agents import create_agent
from langchain.chat_models import init_chat_model

# 方法1:文字列を渡す(最も一般的)
# create_agent の内部で init_chat_model() が呼び出されて処理される
agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    system_prompt="あなたはサンプルのアシスタントです",
)

# 方法2:構築済みのモデルインスタンスを渡す
# モデルパラメータを細かく制御する必要があるシナリオに適している
model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0.3, max_tokens=500)
agent = create_agent(
    model=model,
    system_prompt="あなたはサンプルのアシスタントです",
)

# 方法3:ツールがバインド済みのモデルインスタンスを渡す
# あまり一般的ではない。通常は create_agent にツールのバインドを管理させる
model_with_tools = init_chat_model("deepseek:deepseek-v4-flash").bind_tools([...])

方法1(文字列を渡す)を推奨します。create_agent() は内部でモデルの初期化、ツールのバインド、構造化出力などのロジックを自動的に処理します。方法2は、Agent の外部でも同じモデルインスタンスを使用する必要があるシナリオに適しています。

tools パラメータ——ツールリスト

tools は3つの形式のツールを受け付けます:

例

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

# 形式1:@tool デコレータを付けた関数(最も一般的)
@tool
def search_course(keyword: str) -> str:
    """サンプルのコースを検索する"""
    return f"検索結果:{keyword} 関連コース"


# 形式2:Pydantic の BaseModel クラス
from pydantic import BaseModel, Field

class WeatherQuery(BaseModel):
    """天気を照会する"""
    city: str = Field(description="都市名")


# 形式3:辞書(リモートツールや組み込みツールを記述する)
mcp_tool = {
    "type": "mcp",
    "server_label": "weather_server",
    "server_url": "https://weather.example.com/sse",
    "allowed_tools": ["get_forecast"],
}

# 混在して使用する
agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    tools=[search_course, WeatherQuery, mcp_tool],
)

None または空のリストを渡すと、Agent が使用できるツールがないことを意味し、その場合は純粋な対話モデルになります:

例

from langchain.agents import create_agent
from langchain.messages import HumanMessage

# ツールなしの Agent——モデルを直接呼び出すのと同等
agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    tools=None,
    system_prompt="あなたはサンプルのアシスタントです",
)

result = agent.invoke({
    "messages": [HumanMessage(content="Pythonはゼロから学ぶのに適していますか?")]
})
print(result["messages"][-1].content)

system_prompt パラメータ——システムプロンプト

Agent の動作ロールと制約ルールを定義します。文字列と SystemMessage オブジェクトをサポートします。

例

from langchain.agents import create_agent
from langchain.messages import SystemMessage

# 方法1:文字列(シンプルで直接的)
agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    system_prompt="あなたはサンプルの学習アドバイザーです。回答は簡潔に、100文字以内にしてください。",
)

# 方法2:SystemMessage オブジェクト(複数の Agent 間で再利用できる)
system_msg = SystemMessage(
    content="あなたはサンプルの学習アドバイザーです。回答は簡潔に、100文字以内にしてください。"
)
agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    system_prompt=system_msg,
)

system_prompt はオプションですが、指定しない場合、モデルは「汎用アシスタント」のロールで回答します。明確なビジネスシナリオがあるアプリケーションでは、常に system_prompt を設定してモデルの動作範囲を制約することをお勧めします。

state_schema パラメータ——カスタム状態

デフォルトの AgentState には messages、jump_to、structured_response のみが含まれます。追加の状態フィールドが必要な場合は、これを拡張できます:

例

from typing import Annotated
from langchain.agents import create_agent, AgentState
from langchain.messages import HumanMessage
from langchain.tools import tool, InjectedState
from typing_extensions import TypedDict


# AgentState を拡張してカスタムフィールドを追加する
class LearningAgentState(AgentState):
    """カスタム状態。学習進捗に関連するフィールドを追加する"""
    user_level: str                       # ユーザーレベル
    completed_topics: list[str]           # 完了したトピックのリスト


@tool
def track_progress(
    topic: str,
    state: Annotated[dict, InjectedState],
) -> str:
    """ユーザーの学習進捗を記録します。

    Args:
topic: 学習し終えたトピック名
    """

    completed = state.get("completed_topics", [])
    completed.append(topic)
    return (
        f"学習進捗を記録しました。現在 {len(completed)} 個のトピックが完了しています:"
        f"{', '.join(completed)}"
    )


agent = create_agent(
    model="deepseek:deepseek-v4-flash",
    tools=[track_progress],
    state_schema=LearningAgentState,  # カスタム状態を使用する
    system_prompt="あなたはサンプルの学習アシスタントです。",
)

# 実行時にはカスタム状態の初期値を指定する必要がある
result = agent.invoke({
    "messages": [HumanMessage(content="Pythonの基礎を学び終えました。記録してください")],
    "user_level": "入門",
    "completed_topics": ["HTML 基礎"],
})

print(f"ユーザーレベル: {result.get('user_level')}")
print(f"完了したトピック: {result.get('completed_topics')}")
print(f"返信: {result['messages'][-1].content[:100]}")

実行結果:

ユーザーレベル: 入门
完了したトピック: ['HTML 基础', 'Python 基础']
返答: 学習進捗を記録しました。完了したトピック: 2件(HTML基礎、Python基礎)

戻り値——CompiledStateGraph

create_agent() は1つのCompiledStateGraphオブジェクトを返します。これは LangGraph のコンパイル済みグラフであり、複数の実行方法を提供します:

メソッド説明適用シーン
invoke(input, config)同期実行。完全な結果を待つスクリプト、シンプルなインターフェース
ainvoke(input, config)非同期実行。完全な結果を待つWeb サービス
stream(input, config, stream_mode)同期ストリーミング実行中間ステップをリアルタイムに表示
astream(input, config, stream_mode)非同期ストリーミング実行WebSocket、SSE
get_state(config)現在の状態を取得対話状態の表示/復元
update_state(config, values)状態を更新対話状態を手動で変更
その他の拡張