Skip to content

什么是 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 的实现:

  1. 系统提示词定义角色、可用工具清单(名称/描述/参数)、ReAct 输出格式(结构化 JSON:thought/action/action_input)与终止条件(产出 Final Answer 或达到步数上限);
  2. 执行引擎(Agent Loop):while 循环——组装(历史 + 工具结果)→ 调模型 → 解析结构化输出 → 若是 Action 则执行工具、把结果作为 Observation 追加 → 继续下一轮;Final Answer 则退出;
  3. 规划增强:复杂任务先让模型生成任务计划(Plan 列表),逐步执行并允许动态修订计划(Plan-and-Execute 变体);
  4. 护栏:最大步数(如 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);
    }
}

关键工程组件(光有循环不够):

  1. System prompt 定义角色与目标:明确任务、可用工具总览、何时停止;
  2. 工具集设计:能力 = 工具集合,自主规划空间由工具边界圈定;
  3. 步数/ token 预算:maxSteps 保险丝(防死循环);
  4. 执行轨迹保留:每步 Thought/Action/Observation 全记录,可回放排障。

典型运行样例:"对比 A、B 两款产品价格" → 思考"先查 A" → 调搜索 → 观察 → 思考"再查 B" → 调搜索 → 对比输出。规划能力来自模型的推理 + 工具的结构化反馈,框架只负责循环和上下文管理。