Skip to content

LangChain create_agent() 函数

create_agent() 是 LangChain 最核心的函数,它会创建一个完整的 Agent 图(StateGraph),包含模型调用、工具执行、循环控制等全部逻辑。

语法

create_agent() 函数语法格式如下:

python
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 可以接受两种形式:字符串(由 init_chat_model() 处理)或已构建好的 BaseChatModel 实例。

实例

python

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="你是菜鸟教程 RUNOOB 的助手",

)

# 方式 2:传已构建好的模型实例

# 适合需要精细控制模型参数的场景

model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0.3, max_tokens=500)

agent = create_agent(

    model=model,

    system_prompt="你是菜鸟教程 RUNOOB 的助手",

)

# 方式 3:传已绑定工具的模型实例

# less common,通常让 create_agent 自己管理工具绑定

model_with_tools = init_chat_model("deepseek:deepseek-v4-flash").bind_tools([...])

推荐使用方式 1(传字符串)。create_agent() 内部会自动处理模型初始化、工具绑定、结构化输出等逻辑。方式 2 适合你需要在 Agent 之外也使用同一个模型实例的场景。

tools 参数——工具列表

tools 接受三种格式的工具:

实例

python

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 无工具可用,此时它就是一个纯粹的对话模型:

实例

python

from langchain.agents import create_agent

from langchain.messages import HumanMessage

# 无工具 Agent——等价于直接调用模型

agent = create_agent(

    model="deepseek:deepseek-v4-flash",

    tools=None,

    system_prompt="你是菜鸟教程 RUNOOB 的助手",

)

result = agent.invoke({

    "messages": [HumanMessage(content="Python 适合零基础学习吗?")]

})

print(result["messages"][-1].content)

system_prompt 参数——系统提示

定义 Agent 的行为角色和约束规则。支持字符串和 SystemMessage 对象。

实例

python

from langchain.agents import create_agent

from langchain.messages import SystemMessage

# 方式 1:字符串(简单直接)

agent = create_agent(

    model="deepseek:deepseek-v4-flash",

    system_prompt="你是菜鸟教程 RUNOOB 的学习顾问。回答要简洁,不超过 100 字。",

)

# 方式 2:SystemMessage 对象(可在多个 Agent 间复用)

system_msg = SystemMessage(

    content="你是菜鸟教程 RUNOOB 的学习顾问。回答要简洁,不超过 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。如果你需要额外的状态字段,可以扩展它:

实例

python

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="你是菜鸟教程 RUNOOB 的学习助手。",

)

# 运行时需要提供自定义状态的初始值

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]}")

运行结果:

python
用户等级: 入门
已完成主题: ['HTML 基础', 'Python 基础']
回复: 已记录学习进度。当前已完成 2 个主题:HTML 基础, Python 基础

返回值——CompiledStateGraph

create_agent() 返回一个 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)更新状态手动修改对话状态

AI 思考中...

LangChain 工具访问 — InjectedState 与 InjectedStore

LangChain Agent 工作流程

基于 VitePress 构建,部署于 GitHub Pages