你好,ReAct特工!------LangGraph的create_react_agent
终极生存手册
想用10行代码造一个会自己"思考"何时调用工具、何时直接回答的AI特工?恭喜你,找到了LangGraph里的那把"瑞士军刀"。
在AI智能体的世界里,ReAct(Reasoning + Acting)模式 就像给你的语言模型装上了一颗"决策大脑"。它不再只是机械应答,而是学会了先琢磨再行动 :这个问题我能答吗?还是要查个工具?而LangGraph的create_react_agent
,就是让你三行代码召唤这种"思考型特工"的秘密武器。
一、初识庐山真面目:什么是create_react_agent?
想象你有个超级助理。你问"旧金山天气如何?",它不会直接瞎猜,而是:
- 推理(Reason):用户要天气 → 我得查实时数据
- 行动(Act):调用天气查询工具
- 再推理:拿到结果后组织语言回复
这就是create_react_agent
干的活!它把语言模型(LLM)和工具(Tools)打包成一个能自主决策的智能体(Agent),核心三件套:
- 大脑:LLM(如Claude、GPT)
- 双手:工具集(搜索、计算、API等)
- 决策流程图:内置ReAct状态机(自动生成!)
对比原生LangChain,LangGraph的Agent最大优势是支持循环决策。简单任务?一条链走到底没问题。复杂任务(如需要反复验证数据)?图结构让它能"绕回去"重试,如同人类思考。
二、极速上手:5分钟打造你的第一个Agent
环境准备
python
# 安装必备库(确保Python≥3.9)
pip install langgraph langchain-anthropic
代码实战:天气查询小助手
python
from langchain_anthropic import ChatAnthropic
from langgraph.prebuilt import create_react_agent # 注意新版可能直接导入langgraph
# 1. 定义工具 - 模拟天气查询API
def search_weather(query: str) -> str:
"""查询指定城市天气的利器,输入应为城市名"""
if "旧金山" in query or "san francisco" in query:
return "旧金山:15°C,多云,微风"
elif "北京" in query:
return "北京:28°C,晴,紫外线强"
return "天气数据暂缺,建议查询纽约、东京等城市"
# 2. 配置模型和工具
tools = [search_weather]
model = ChatAnthropic(model="claude-3-haiku-20240307") # 速度快又便宜
# 3. 创建Agent!魔法发生在此刻
agent = create_react_agent(model, tools)
# 4. 提问!
response = agent.invoke(
{"messages": [{"role": "user", "content": "旧金山和金门大桥的天气如何?"}]}
)
print(response["messages"][-1]["content"])
输出示例:
scss
正在思考:用户询问旧金山天气,我需要调用天气工具。
工具调用:search_weather("旧金山")
旧金山:15°C,多云,微风。金门大桥区域可能有薄雾。
三、解剖麻雀:ReAct Agent如何运转?
你以为create_react_agent
是黑盒?其实内部悄悄建了个微型决策工厂:
txt
graph LR
A[Agent节点] -->|生成工具调用| B[Tool节点]
B --> C{是否继续?}
C -->|需要新决策| A
C -->|结束| D[输出结果]
- 状态(State) :核心是
messages
列表,记录用户输入、AI回复、工具结果 - Agent节点:LLM分析当前状态,决定回复内容或调用工具
- Tool节点:执行工具并返回结果(如调用API、查数据库)
- 循环条件:若有工具调用结果,返回Agent重新决策;否则结束
关键内存结构示例:
python
{
"messages": [
{"role": "user", "content": "旧金山天气?"},
{"role": "assistant", "tool_calls": [{"name": "search_weather", "args": {"query": "旧金山"}}]},
{"role": "tool", "content": "旧金山:15°C,多云", "tool_call_id": "call_123"}
]
}
四、避坑指南:血泪换来的经验
坑1:配置神秘消失
现象 :设置好的model_name
调用后失效,报400错误
原因 :工具绑定(cast)操作覆盖了配置
解决方案 :用init_chat_model
初始化模型
python
from langchain.chat_models import init_chat_model
llm = init_chat_model("anthropic:claude-3-sonnet", configurable_fields=("model",))
agent = create_react_agent(llm, tools)
坑2:系统提示语失效
现象 :设了"请用德语回答",但输出仍是英文
原因 :response_format
场景下提示未正确传递
解决方案:使用元组传参
python
# 错误写法
agent = create_react_agent(llm, tools, prompt="用德语回答")
# 正确写法
agent = create_react_agent(llm, tools, response_format=("用德语回答", JsonOutput))
坑3:导包地狱
报错 :ImportError: cannot import name 'create_react_agent'
原因 :LangGraph版本调整了导包路径
解决方案:直接主包导入
python
# 旧版(<0.1.0)
from langgraph.prebuilt import create_react_agent
# 新版(≥0.1.0)
from langgraph import create_react_agent # 官方推荐!
五、高手进阶:打造企业级Agent
场景1:带记忆的对话代理
python
from langchain.memory import ConversationBufferMemory
# 添加记忆组件
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
llm = ChatOpenAI(model="gpt-4-turbo")
# 创建Agent时注入记忆
agent = create_react_agent(
llm,
tools,
state_modifier=memory.load_memory_variables # 关键!
)
# 调用时自动携带历史
response = agent.invoke(
{"input": "这比上次查询温度高吗?", "chat_history": [...]}
)
场景2:人工审核拦截
让Agent在敏感操作前暂停等待审批:
python
agent = create_react_agent(
llm,
[user_data_update_tool],
interrupt_before=["update_user_data"] # 更新前暂停
)
# 调用时检测到中断信号
if response.get("interrupt") == "update_user_data":
if admin_approve(request):
agent.resume(response["state"])
六、面试直通车:高频考点解析
-
Q:ReAct模式中,Reasoning和Acting如何协作?
A:Reasoning生成思考步骤(如"需要查天气"),Acting转化为工具调用(如调用search_weather)。两者循环直至问题解决。
-
Q:
create_react_agent
与initialize_agent
(LangChain)区别?A:前者基于状态图支持循环调用(图灵完备),后者是线性链式结构。复杂任务如多轮校验选LangGraph。
-
Q:工具调用失败时Agent如何处理?
A:默认超时重试2次,可通过自定义ToolNode实现fallback逻辑:
pythonfrom langgraph.prebuilt import ToolNode class SafeToolNode(ToolNode): def run(self, state): try: return super().run(state) except Exception: return "工具调用失败,请稍后再试"
-
Q:如何优化Agent的响应速度?
A:三板斧:
- 启用流式响应(
stream_mode="messages"
) - 对工具加缓存(如
@lru_cache
装饰搜索工具) - 用小模型做简单决策(如Haiku配Sonnet)
- 启用流式响应(
七、终极大乱斗:Agent框架选型指南
当有人对你说"LangGraph够用了",请优雅地甩出这张表:
能力 | LangGraph | AutoGen | Dify |
---|---|---|---|
循环决策 | ✅ 原生支持 | ✅ | ❌ |
可视化编排 | ❌ | ✅ | ✅ |
低代码部署 | ❌ | ❌ | ✅ |
多Agent协作 | ✅ | ✅ | ❌ |
学习曲线 | 陡峭🗻 | 中等⛰️ | 平缓🏖️ |
选型建议:
- 快速上线选Dify
- 科研/复杂逻辑选LangGraph
- 企业流程集成选AutoGen
八、未来已来:你还能这样玩转Agent
- 知识库问答机器人:结合RAG工具,让Agent查公司文档
- 代码评审助手:集成代码解析工具+安全规则库
- AI游戏NPC:用状态图管理角色决策树
python
npc_agent = create_react_agent(
llm,
tools=[check_inventory, use_skill, move_to],
state_modifier="你是一个中世纪的骑士,说话带'阁下'后缀"
)
九、结语:创造者的利器
create_react_agent
的精髓,在于它把认知决策 (LLM)和物理执行(Tools)的边界打通了。从此AI不再是"嘴强王者"------它能思考、能动手、能迭代,像人类一样解决问题。
正如某位LangGraph核心开发者所说:
"我们不是在造问答机器,而是在培育数字生命体。ReAct就是它第一次学会'用工具'走路。"
各位创造者们,工具在此,魔法在你们手中。现在就去造点令人惊叹的东西吧!