ReAct 模式 - 边做边想
什么是 ReAct 模式
通过提示词的方式,让大模型交替生成"思考","行动","观察"的循环。
为什么这个模式会被创造出来?
2022 年的论文《ReAct: Synergizing Reasoning and Acting in Language Models》。作者发现,把推理和行动放在一个闭环里面,能显著提升大模型在知识密集、多步推理任务上的表现。
工作原理
ReAct 会形成一个 Thought -> Action -> Observation -> Thought -> ... 的循环:
-
Thought(思考):模型分析当前状况,决定要做什么。
-
Action(行动):执行一个具体动作,例如调用搜索引擎、查询数据库、使用计算器、操作 API 等。
-
Observation(观察):接收到外部环境返回的结果(比如搜索到的文字、计算结果)。
然后模型再根据观察生成新的思考,如此循环直到得出最终答案。
工程中如何实现
- 在系统提示词中注入 ReAct 格式要求,让 LLM 主动用 Thought/Action/Observation 格式思考和输出。并强制要求必须通过 sub_agent_task Tool 创建独立上下文的验证子 Agent 检查工作。
prompt 大致如下:
text
## 🧠 ReAct 推理模式(带强制独立验证)
你必须使用 ReAct(Reasoning + Acting)模式来解决问题。请严格按照以下格式:
**循环执行以下步骤,直到可以给出最终答案:**
1. 🤔 **Thought(思考)**: 分析当前情况,说明你需要做什么、为什么这样做
2. 🔧 **Action(行动)**: 如果需要查找信息、读取文件、执行命令等,调用相应的工具
3. 👁️ **Observation(观察)**: 观察工具返回的结果,分析是否足够回答问题
4. 如果信息不足,回到步骤 1 继续推理
**🔍 强制验证步骤(重要!给出最终答案前必须执行):**
5. 在给出最终答案之前,你必须调用 `sub_agent_task` 工具,创建一个独立的验证子 Agent 来检查你的工作。这是强制性的,不可跳过!
需要注意的是: sub_agent_task 工具是需要你自己实现的,并且要限制循环的次数,避免陷入无限死循环,无限消耗 token
- 对于不同类型的 Agent,需要注入不同的 system prompt 强制 Agent 执行验证工作。下面是我自己项目中 Code Agent 的 prompt :
text
你是代码验证者,职责是批判性地检查代码输出。
你必须独立运行工具进行验证,不采信主 Agent 的声明。
验证步骤:
1. 使用 read_file 读取被修改或创建的代码文件
2. 使用 execute_command 运行 `mvn compile`(如果是 Java 项目)或对应的编译命令
3. 如果编译失败,报告具体的错误信息和行号
4. 如果编译通过,检查代码是否满足用户的原始需求(对照 prompt 中的需求描述)
5. 快速检查是否存在明显的逻辑错误、空指针或资源泄漏
返回格式(二选一):
PASS: <简要说明验证通过>
FAIL: <具体问题描述,包含文件名和行号>
重要:你必须切实执行验证工具,不能仅凭描述判断。
与我们普通的对话有什么区别?
好处很明显:在一些复杂任务上,输出的质量会更高。
坏处也很明显:消耗的 token 更多了,响应的时间也变长了。
ReWOO (Reasoning Without Observation) - 谋定而后动
什么是 ReWOO
先制定计划,在批量执行所有工具调用,最后收集所有结果,进行综合推理。
为什么会被创造出来
为了解决 ReAct 高成本、低效率的问题
工程中如何实现
ReWOO 一共有 3 个组件。
Planner -> Worker -> Solver
-
Planner:一次性制定出完整的执行计划,包括需要调用哪些工具、调用顺序以及参数,但此时并不真正执行
-
Worker:严格按照规划器的计划,批量执行所有工具调用,并收集结果
-
Solver:接收最初的计划和工作器收集到的所有结果,进行综合推理,生成最终答案给用户
LLMCompiler - 并行加速
什么是 LLMCompiler
以并行执行为核心,将规划建模为有向无环图,无依赖的任务并行执行。
可以理解为 LLMCompiler 是 ReWOO 的升级版,将串行调用改为并行调用
工程中如何实现
LLMCompiler 整体实现和 ReWOO 大差不差。区别在于,会要求大模型生成的规划是一个有向无环图,程序要将其解析为有向无环图,然后在同一层的并发执行。
Plan and Execute 模式 - 战略与战术分离
什么是 plan and Execute
先制定计划再根据计划执行,如果计划实施不了,则会重新生成计划。
为什么会被创造出来?
为了解决 ReAct 的在复杂、多步任务中的 2个核心问题。
-
走一步看一步,缺乏大局观。
-
执行过程无法预测。
工程中如何实现
plan and execute 由 3 个组件组成:Planner, Executor, Replanner
Planner
使用专门的 planner 模型构建系统提示,借助 TodoTool,要求模型按照接收入参返回。TodoTool 内部则对大模型返回的 task 进行校验,主要是检测是否为有向无环图。
Execute
遍历计划中的每一步,顺序执行。
执行完成后,LLM 作为评估器判断结果,分为三档:
-
PASS → 标记 COMPLETED,继续下一步
-
RETRY → 临时故障,最多重试 maxRetryPerStep 次(默认 3)
-
REPLAN → 计划有缺陷,触发重规划
Replan
当评估器返回 REPLAN 时触发。基于执行失败的原因,重新生成任务。