Agent系列(二):ReAct——Agent 的“思考-行动“循环

发布时间:2026/5/23 14:49:12

Agent系列(二):ReAct——Agent 的“思考-行动“循环 你以为 Agent 在"思考",其实它只是在猜下一个词先讲一个真实的现象。你让 Agent 帮你写一份竞品分析报告。它信心十足地给你输出了满满三页。报告看起来很专业,有数据、有结论、有建议。但有一个问题:所有数据都是它"记忆"里的,截止时间可能是一年前。它没有搜索,没有验证,只是用语言模型的能力生成了听起来合理的内容。这不是在思考,这是在流畅地瞎编。Chain-of-Thought(CoT)也是同样的问题。CoT 让模型在回答前先"逐步推理",确实能提升很多推理任务的准确率——但它仍然是在语言空间里打转。模型可以非常流畅地"推理"出一个完全错误的答案,因为它的信息来源只有训练数据。ReAct 的出现,就是为了解决这个问题。ReAct:Reasoning + Acting 的结合2022 年,普林斯顿和谷歌的研究团队发表了论文 ReAct: Synergizing Reasoning and Acting in Language Models。论文的核心思想极其简洁:让模型交替进行"推理"(Reasoning)和"行动"(Acting),而不是先推理完再行动,或只行动不推理。具体形式是一个三元组循环:Thought → Action → Observation ↑ │ └─────────────────────────┘Thought:模型在"想"什么——当前的分析、下一步打算做什么、为什么这么做Action:模型实际调用的工具和参数Observation:工具执行后返回的真实结果关键在于:Observation 会作为新的上下文喂回给模型,让它根据真实结果继续推理。这就形成了"思考—行动—观察—再思考"的循环。听起来简单,但这一个循环解决了 CoT 最核心的缺陷:模型不再只是在语言空间里自言自语,它可以与真实世界交互,并根据真实反馈修正推理路径。一个具体的例子:看 Agent 是怎么"想"的我写了一个完整的 ReAct Agent 演示,用的是 LangGraph + GLM-4-Flash,两个工具:calculator(安全计算器)和web_search(Bing 搜索)。代码在这里:agent-01-react-agent/react_agent.py我们来看一个真实的执行追踪——Demo 3:搜索北京和上海的面积,然后计算差值。════════════════════════════════════════════════════════════ Demo 3 ▸ 多轮搜索(同一工具多次调用) ════════════════════════════════════════════════════════════ [用户提问] 先搜索一下北京的面积,再搜索上海的面积, 最后计算北京比上海大多少平方公里。 ──────────────────────────────────────────────────────────── [步骤 1] THOUGHT → ACTION Action : web_search(query='北京面积 平方公里') Observation : • 北京市面积: 北京市总面积为16410.54平方公里... ──────────────────────────────────────────────────────────── [步骤 2] THOUGHT → ACTION Action : web_search(query='上海面积 平方公里') Observation : • 上海市面积: 上海市陆域面积约6340.5平方公里... ──────────────────────────────────────────────────────────── [步骤 3] THOUGHT → ACTION Action : calculator(expression='16410.54 - 6340.5') Observation : 10070.04 ──────────────────────────────────────────────────────────── [最终答案] 北京的面积约为16410.54平方公里,上海的面积约为6340.5平方公里。 北京比上海大约10070.04平方公里。 ════════════════════════════════════════════════════════════注意这里发生了什么:Agent自己决定先搜北京,再搜上海,然后计算——没有任何硬编码的执行顺序每次搜索的结果(Observation)都被模型读取,并用来决定下一步最终的计算直接用了从真实搜索中提取的数字这就是 ReAct 的价值:执行路径是模型在运行时动态规划的,而不是开发者事先写死的。和 Chain-of-Thought 的区别可以做个直接对比:特性Chain-of-ThoughtReAct信息来源仅训练数据训练数据 + 工具返回值执行路径语言空间内推理思考 → 真实行动 → 观察结果能获取实时信息✗✓(通过工具)能执行计算/代码✗✓(通过工具)推理过程可验证难以验证每一步 Observation 都是真实结果失控风险低(无副作用)高(需要安全边界)用一句话总结:CoT 让模型想清楚;ReAct 让模型边想边做。动手实现:用 LangGraph 构建 ReAct Agent下面是核心代码。代码使用 LangGraph 的create_react_agent,这是目前最简洁的 ReAct 实现之一。1. 安全计算器工具importastimportoperatorfromtypingimportAnyfromlangchain_core.toolsimporttool _SAFE_OPS:dict[type,Any]={ast.Add:operator.add,ast.Sub:operator.sub,ast.Mult:operator.mul,ast.Div:operator.truediv,ast.Pow:operator.pow,ast.Mod:operator.mod,ast.USub:operator.neg,}def_eval_ast(node:ast.AST)-float:ifisinstance(node,ast.Constant):returnfloat(node.value)ifisinstance(node,ast.BinOp):op_fn=_SAFE_OPS.get(type(node.op))ifop_fnisNone:raiseValueError(f"不支持的运算符:{type(node

相关新闻