什么是 ReAct?如何基于 ReAct 模式构建具备自主规划能力的 AI 智能体?
- 标签:后端、编程导航
🏛 业务架构师
ReAct = Reasoning + Acting 交替循环:模型先推理(Thought:当前进展、下一步该做什么)→ 执行动作(Action:调用某工具)→ 观察结果(Observation:工具返回)→ 再推理……直到判断任务完成,输出最终答案。它把"思维链"升级为"边想边做、根据反馈调整"的闭环。
基于它构建自主规划智能体的设计:
- 提示工程:system prompt 定义角色、目标、可用工具、输出协议(Thought/Action/Observation 的格式约束)——协议越明确,循环越稳定;
- 循环控制:框架层执行"解析动作→调工具→拼观察→再请求"的循环——业务代码管循环的边界(最大轮数、总 token 预算、总时长);
- 任务分解:复杂目标("规划北京三日游并生成 PDF")模型自行拆解为"查天气→搜景点→规划路线→算预算→生成文档"的动作序列——规划能力来自模型的推理,架构提供的是执行与反馈的通道。
业务上的适用判断(这条最值钱):ReAct 适合多步骤、依赖中间结果的任务(行程规划、调研报告);简单问答用它是浪费(多轮调用、延迟高、成本翻倍)——我按任务复杂度路由:简单问题直答,复杂任务才进 Agent 循环。
成本与失控管理:每轮都是一次模型调用,N 轮任务 = N 倍成本——预算熔断(token 超限强制收敛)、循环检测(连续相同动作判定卡死)是生产必备。
一句话:ReAct 给了智能体"做事的方法论",架构师的工作是给它配上"刹车的预算表"。
🏗 系统架构师
ReAct = Reasoning + Acting 交替循环的智能体模式(论文 2022):让 LLM 以"思考 → 行动 → 观察"的循环解决任务,直到得出最终答案。它把 Chain-of-Thought(推理)与 Tool Calling(行动)结合,是几乎所有 Agent 框架(含 OpenManus、LangChain Agent)的内核。
循环结构:
Thought: 我需要先查今天的股价
Action: webSearch("XX公司 今日股价")
Observation: 股价为 95.5 元...
Thought: 数据拿到,结合用户持仓可以计算收益了
Action: calculator(...)
Observation: 收益率 12%
Thought: 信息完整,可以回答了
Answer: ...基于 ReAct 构建自主规划 Agent 的实现:
- 系统提示词定义角色、可用工具清单(名称/描述/参数)、ReAct 输出格式(结构化 JSON:thought/action/action_input)与终止条件(产出 Final Answer 或达到步数上限);
- 执行引擎(Agent Loop):while 循环——组装(历史 + 工具结果)→ 调模型 → 解析结构化输出 → 若是 Action 则执行工具、把结果作为 Observation 追加 → 继续下一轮;Final Answer 则退出;
- 规划增强:复杂任务先让模型生成任务计划(Plan 列表),逐步执行并允许动态修订计划(Plan-and-Execute 变体);
- 护栏:最大步数(如 15)、单步超时、循环检测(相同 action 连续出现即中断)、token 预算上限。
我的工程体会:ReAct 的自主性来自"模型拥有决策权",可靠性来自"工程护栏"——两者必须配平;工具描述质量直接决定 Action 选择准确率;结构化输出(JSON 的 thought/action)比自由文本解析稳定得多。
💻 全栈开发专家
ReAct = Reason + Act 交替的智能体循环:思考(Thought) → 行动(Action/工具调用) → 观察(Observation/工具结果) → 再思考... 直到能给出最终答案。和"一次性生成"的区别是模型可以多步自主决策——先查什么、结果不够再查什么。
基于 Spring AI 的实现骨架:
java
public class ReActAgent {
public String run(String goal, int maxSteps) {
List<Message> messages = initMessages(goal); // system + ReAct 协议 + user
for (int step = 0; step < maxSteps; step++) { // 死循环保险丝
ChatResponse resp = chatClient.prompt()
.messages(messages)
.tools(toolRegistry.all()) // 工具集决定能力边界
.call().chatResponse();
if (isFinalAnswer(resp)) { // 无 tool_call = 收敛
return resp.getResult().getOutput().getText();
}
messages.addAll(extractNewMessages(resp)); // tool call + result 入历史
}
return "达到最大步数,返回当前结论:" + partialSummary(messages);
}
}关键工程组件(光有循环不够):
- System prompt 定义角色与目标:明确任务、可用工具总览、何时停止;
- 工具集设计:能力 = 工具集合,自主规划空间由工具边界圈定;
- 步数/ token 预算:maxSteps 保险丝(防死循环);
- 执行轨迹保留:每步 Thought/Action/Observation 全记录,可回放排障。
典型运行样例:"对比 A、B 两款产品价格" → 思考"先查 A" → 调搜索 → 观察 → 思考"再查 B" → 调搜索 → 对比输出。规划能力来自模型的推理 + 工具的结构化反馈,框架只负责循环和上下文管理。