本文是对 langgraph.prebuilt.create_react_agent
函数的详细且全面的介绍,涵盖其定义、功能、设计理念、参数、返回值、使用场景、实现原理、示例代码、高级用法、注意事项、与其他方法的对比,以及学习建议。
langgraph.prebuilt.create_react_agent
是 LangGraph 库中的一个预构建函数,位于 langgraph.prebuilt
模块,用于快速创建基于 ReAct(Reasoning + Acting)架构的智能代理。LangGraph 是 LangChain 生态的扩展,专注于构建复杂、有状态的工作流,通过状态图(State Graph)管理节点和边,支持动态路由、循环和多代理协作。
ReAct 是一种结合推理和行动的代理架构,基于论文 ReAct: Synergizing Reasoning and Acting in Language Models。它通过语言模型(LLM)生成推理步骤(思考)和行动指令(工具调用),动态决定是否直接回答用户或调用工具获取信息。create_react_agent
封装了 ReAct 的标准逻辑,简化了代理的构建过程,使开发者无需手动定义状态图即可快速实现功能。
以下是 create_react_agent
函数的定义和参数:
from langgraph.prebuilt import create_react_agent
def create_react_agent(
model: BaseLanguageModel,
tools: Sequence[BaseTool],
checkpointer: Optional[BaseCheckpointSaver] = None,
state_modifier: Optional[Union[str, BasePromptTemplate]] = None,
interrupt_before: Optional[List[str]] = None,
interrupt_after: Optional[List[str]] = None,
debug: bool = False,
stream_mode: Literal["values", "messages"] = "values",
) -> CompiledGraph:
"""
创建一个 ReAct 风格的代理。
参数:
model: 语言模型实例,用于生成推理和工具调用。
tools: 工具列表,代理可调用以执行任务。
checkpointer: 可选,检查点保存器,用于状态持久化。
state_modifier: 可选,提示模板或字符串,用于自定义代理的行为。
interrupt_before: 可选,指定在某些节点执行前中断。
interrupt_after: 可选,指定在某些节点执行后中断。
debug: 是否启用调试模式,输出详细日志。
stream_mode: 流式输出模式,"values" 或 "messages"。
返回:
CompiledGraph: 编译后的状态图,可通过 invoke 或 stream 调用。
"""
model
:
BaseLanguageModel
(LangChain 的语言模型基类)。ChatOpenAI(model="gpt-4")
。gpt-3.5-turbo
或 gpt-4
。函数会自动绑定工具,无需手动调用 bind_tools
。tools
:
Sequence[BaseTool]
(LangChain 工具列表)。DuckDuckGoSearchRun
)、计算器或自定义 API 工具。tools=[DuckDuckGoSearchRun(), Calculator()]
。checkpointer
:
Optional[BaseCheckpointSaver]
。MemorySaver
(内存中保存)或数据库检查点(如 SQLite)。None
,表示无状态交互。state_modifier
:
Optional[Union[str, BasePromptTemplate]]
。None
,使用默认 ReAct 提示。interrupt_before
:
Optional[List[str]]
。None
,无中断。interrupt_after
:
Optional[List[str]]
。None
,无中断。debug
:
bool
。False
。stream_mode
:
Literal["values", "messages"]
。"values"
:返回完整的消息(消息级流式)。"messages"
:返回每个令牌(令牌级流式)。"values"
。CompiledGraph
。invoke
(同步)、ainvoke
(异步)或 stream
(流式)方法调用。agent_executor.invoke({"input": "查询天气"})
返回状态字典。create_react_agent
内部自动构建一个 ReAct 风格的状态图,包含以下核心组件:
messages
字段(List[BaseMessage]
),存储对话历史、用户输入、LLM 响应和工具调用结果。checkpointer
,状态会持久化,支持多轮对话。示例状态:
{
"messages": [
HumanMessage(content="查询天气"),
AIMessage(content=None, tool_calls=[{"name": "search", "args": {"query": "天气"}}]),
ToolMessage(content="天气结果", tool_call_id="call_123")
]
}
ToolNode
预构建逻辑,结合 model
和 tools
。langgraph.prebuilt.ToolNode
,处理 LLM 生成的 ToolCall
请求。END
。invoke
或 stream
传入初始状态(包含 input
)。AIMessage
)。AIMessage
包含 tool_calls
)。ToolMessage
添加到状态。messages
字段。ReAct 代理的核心是交替进行推理和行动:
create_react_agent
自动实现这一逻辑,通过状态图管理迭代过程。
以下是使用 create_react_agent
的标准步骤:
pip install langgraph langchain langchain-openai langchain-community
langgraph
:核心库。langchain
:提供 LLM 和工具支持。langchain-openai
:OpenAI 模型集成。langchain-community
:社区工具(如搜索)。配置 OpenAI API 密钥:
import os
os.environ["OPENAI_API_KEY"] = "你的API密钥"
使用 LangChain 的工具接口(@tool
装饰器或 BaseTool
子类)。
from langchain_core.tools import tool
@tool
def search(query: str) -> str:
"""模拟搜索引擎"""
return f"搜索结果:{query}"
选择支持工具调用的模型。
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo")
调用 create_react_agent
,传入 LLM 和工具。
from langgraph.prebuilt import create_react_agent
tools = [search]
agent_executor = create_react_agent(llm, tools)
通过 invoke
或 stream
执行。
result = agent_executor.invoke({"input": "搜索 LangGraph 文档"})
print(result["messages"][-1].content)
以下是一个完整的示例,展示如何使用 create_react_agent
构建一个支持搜索和多轮对话的代理。
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage
# 定义工具
@tool
def search(query: str) -> str:
"""模拟搜索引擎"""
return f"搜索结果:{query} 的相关文档"
# 初始化 LLM
llm = ChatOpenAI(model="gpt-3.5-turbo")
# 创建检查点
memory = MemorySaver()
# 创建代理
tools = [search]
agent_executor = create_react_agent(
model=llm,
tools=tools,
checkpointer=memory,
stream_mode="values"
)
# 运行多轮对话
config = {"configurable": {"thread_id": "conversation_1"}} # 用于状态持久化
inputs = [
{"input": "搜索 LangGraph 的最新功能"},
{"input": "我之前问了什么?"}
]
for input_data in inputs:
print(f"\n用户输入:{input_data['input']}")
for chunk in agent_executor.stream(input_data, config=config):
last_message = chunk["messages"][-1]
print(f"代理输出:{last_message.content}")
用户输入:搜索 LangGraph 的最新功能
代理输出:搜索结果:LangGraph 的最新功能的文档
用户输入:我之前问了什么?
代理输出:你之前问了“搜索 LangGraph 的最新功能”。
search
工具,模拟搜索功能。gpt-3.5-turbo
,支持工具调用。MemorySaver
保存对话历史,thread_id
标识对话线程。create_react_agent
创建,支持流式输出。使用 state_modifier
参数自定义代理行为。
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template(
"你是一个专业助手,严格遵循用户指令。回答前仔细思考,并优先使用工具获取准确信息。\n用户输入:{input}"
)
agent_executor = create_react_agent(llm, tools, state_modifier=prompt)
支持异步调用,适合高并发场景。
import asyncio
async def run_agent():
result = await agent_executor.ainvoke({"input": "搜索天气"})
print(result["messages"][-1].content)
asyncio.run(run_agent())
使用 stream_mode="messages"
实现令牌级流式。
for chunk in agent_executor.stream({"input": "搜索 LangGraph"}, stream_mode="messages"):
print(chunk)
使用 interrupt_before
或 interrupt_after
在特定节点暂停执行。
agent_executor = create_react_agent(
llm,
tools,
interrupt_before=["tools"] # 在工具调用前中断
)
支持多个工具,LLM 动态选择。
@tool
def calculator(expression: str) -> str:
return f"计算结果:{eval(expression)}"
tools = [search, calculator]
agent_executor = create_react_agent(llm, tools)
使用 SQLite 或其他数据库保存状态。
from langgraph.checkpoint.sqlite import SqliteSaver
checkpointer = SqliteSaver.from_conn_string("checkpoint.db")
agent_executor = create_react_agent(llm, tools, checkpointer=checkpointer)
create_react_agent
内部构建了一个状态图,基于以下组件:
MessagesState
(默认),包含 messages
字段。agent
节点:调用 LLM,生成 AIMessage
或工具调用。tools
节点:基于 ToolNode
,执行工具调用。agent
到 tools
(如果有工具调用)。messages
中的 tool_calls
,决定循环或终止。核心逻辑基于 ReAct 的迭代过程:
model
是基础模型,create_react_agent
会自动绑定工具。BaseTool
接口。description
),帮助 LLM 正确选择。checkpointer
时,代理是无状态的。thread_id
区分不同对话线程。debug=True
查看详细日志。graph.get_graph().to_dot()
可视化状态图。langgraph.prebuilt.create_react_agent
是一个强大的预构建函数,用于快速创建 ReAct 风格的代理。它通过封装 LLM、工具和状态管理,简化了开发流程,支持多轮对话、工具调用和流式输出。适用于聊天机器人、自动化工作流和智能助手等场景。高级功能如异步执行、自定义提示和检查点进一步增强了其灵活性。对于复杂需求,可结合 LangGraph 的手动状态图实现定制化。