ReAct 是 Agent 范式的「原始版」。自它 2022 年提出后,一系列工作针对它的不同短板做了改进:Reflexion 让它学会「吃一堑长一智」、Self-Ask 让它「自己问自己」、ReWOO 让它「先打包再批量跑」、LATS 让它「在树里搜着干」。这些变体构成了 Agent 范式的家族树。
回顾 ReAct,它有四个明显短板,每个短板催生了一类变体:
| 短板 | 表现 | 催生的变体 |
|---|---|---|
| 不学习 | 失败一次下次还会犯 | Reflexion |
| 不分解 | 复杂问题不会拆成子问题 | Self-Ask |
| 慢且贵 | 每步等观察、串行执行 | ReWOO |
| 不探索 | 一条路走到底,走错全废 | LATS |
下面逐个展开。
问题:ReAct 在一个任务里能纠错(靠 Observation 反馈),但换一个任务,它又从零开始——上次的失败经验不会带过去。
Reflexion 的解法(Shinn et al. 2023):在 ReAct 基础上加一层反思记忆(Reflective Memory)——任务失败后,让 LLM 写一段「反思笔记」,存进上下文,下次类似任务时调出来用。
| 步骤 | 内容 |
|---|---|
| Actor | 用 ReAct 执行任务(含 Thought-Action-Observation) |
| Self-Reflection | 任务失败后,LLM 自我分析「为什么失败、下次该怎么改」 |
| Reflective Memory | 反思笔记存进记忆,下次任务开始时检索出来 |
任务: 把红色杯子端到厨房 [Episode 1 - 失败] Thought 1: 抓杯子 Action 1: grasp("red cup") Observation 1: Grasp failed: cup slipped ... (多次失败,任务未完成) [Self-Reflection] 我刚才抓杯子失败,因为抓得太靠杯口,杯子滑落。 杯子重心在中下部,应该抓中下部更稳。 记忆笔记: "抓杯子要避开杯口,抓中下部。" [Episode 2 - 应用反思] (任务开始时,检索出反思笔记) Thought 1: 根据之前的经验,抓杯子要抓中下部。 Action 1: grasp_middle("red cup") Observation 1: Grasp succeeded ... 任务完成 ✓
💡 Reflexion 的深刻意义:它把「经验学习」引入 LLM Agent。LLM 不再每次从零开始,而是通过语言反思从自己的失败中学习——类似人类的「复盘」。这种「把失败经验显式化为可调用资源」的思路,是 Agent 从「单次任务」走向「持续进化」的关键。具身场景下的 Reflexion 详见《具身智能技术原理》第 4.3 节。
| 维度 | ReAct | Reflexion |
|---|---|---|
| 反思 | 单次 Thought | 跨任务的反思记忆 |
| 学习 | 不学习 | 从失败中学习 |
| 适用 | 单次任务 | 多次尝试的复杂任务 |
| 上下文 | 当前任务 | 当前任务 + 反思记忆 |
问题:ReAct 面对复杂问题时,会一步直接调工具,但工具返回的信息可能还不够,需要进一步追问。ReAct 不强制 LLM「先把问题拆成子问题」。
Self-Ask 的解法:让 LLM 自己向自己提问,把大问题分解成一串子问题,逐个用工具回答,最后合并。
问题: 雕娥鱼的天敌是什么,这种天敌又吃什么? [Self-Ask 分解] Follow-up 1: 雕娥鱼的天敌是什么? → 工具查 → "鲈鱼" Follow-up 2: 鲈鱼吃什么? → 工具查 → "小鱼、虾、昆虫" 合并: 雕娥鱼的天敌是鲈鱼,鲈鱼吃小鱼、虾、昆虫。
| 维度 | ReAct | Self-Ask |
|---|---|---|
| 分解 | 隐式(靠 Thought) | 显式(Follow-up 链) |
| 调工具 | 直接调 | 先分解再调 |
| 适用 | 通用 | 多跳问答(multi-hop QA) |
💡 Self-Ask 的优势在多跳问答:像「A 的天敌吃啥」这种需要先查 A 再查 A 的天敌的问题,Self-Ask 的显式分解比 ReAct 的隐式 Thought 更稳。但对一般任务,Self-Ask 的强制分解反而累赘。
问题:ReAct 每步都要等 Observation 才能想下一步——强制串行。如果工具调用之间没有依赖,本来可以并行,但 ReAct 做不到。
ReWOO 的解法(Xu et al. 2023):把规划与执行分离——Plan 阶段一次性把所有工具调用打包出来,Execute 阶段批量并行跑,Solve 阶段合并结果。
ReWOO 用「占位符」表达依赖,规划阶段不需等待真实结果:
[Plan] Step 1: search("苹果 2024 营收") → #E1 Step 2: search("苹果 2023 营收") → #E2 Step 3: calculate("(#E1 - #E2) / #E2") → #E3 (引用 #E1, #E2) [Execute] Step 1, Step 2 并行跑(无依赖) Step 3 等 Step 1, 2 完成(有依赖) [Solve] 根据 #E1, #E2, #E3 合并出最终答案
| 维度 | ReAct | ReWOO |
|---|---|---|
| LLM 调用数 | N(每步 1 次) | 2-3(Plan + Solve) |
| 延迟 | 高(串行) | 低(并行) |
| 鲁棒性 | 高(边走边调) | 低(计划错了全废) |
| 适用 | 不确定环境 | 工具结果可预测 |
⚠️ ReWOO 的硬前提:规划阶段必须能预见所有工具调用。一旦某步工具返回意外(如搜索没结果),后续依赖它的 Step 全部失效,需要重规划。ReWOO 适合「信息检索类」任务(结果可预测),不适合「探索类」任务。
问题:ReAct 是一条线——一步走错全链废。复杂任务需要「试几条路、走不通回头」。
LATS 的解法(Zhou et al. 2023):把 ReAct(边想边做)与 ToT(树搜索)+ MCTS(蒙特卡洛树搜索)融合——让 Agent 在「想+做」的复合空间里搜索。
| 要素 | 内容 |
|---|---|
| 节点 | 一个 Agent 状态(含完整轨迹) |
| 边 | 一次「想+做」(Thought + Action) |
| 评估 | LLM 给状态打分(价值函数) |
| 搜索 | MCTS(选择-扩展-评估-回溯) |
| 维度 | ReAct | LATS |
|---|---|---|
| 推理结构 | 线性 | 树形 |
| 回溯 | 无 | 有 |
| LLM 调用 | 中 | 极多(5-20 倍) |
| 效果上限 | 中 | 高 |
| 适用 | 一般任务 | 极难任务 |
⚠️ LATS 是研究范式:它的效果上限很高(在难任务上显著优于 ReAct),但工程与运行成本极高。生产几乎不用 LATS,而是用「ReAct + 局部回溯 + 任务分解」来近似它的好处。
| 变体 | 改进点 | LLM 调用 | 鲁棒性 | 适用 |
|---|---|---|---|---|
| ReAct | 基础范式 | 中 | 中 | 通用 |
| Reflexion | + 反思记忆 | 中(多次尝试) | 高(学习) | 多次尝试任务 |
| Self-Ask | + 显式分解 | 中 | 中 | 多跳问答 |
| ReWOO | + 分离规划执行 | 少 | 低(计划脆) | 工具结果可预测 |
| LATS | + 树搜索 | 极多 | 极高 | 极难任务 |
| 场景 | 推荐变体 | 理由 |
|---|---|---|
| 通用 Agent | ReAct | 兜底选择,最通用 |
| 多次尝试、需积累经验 | Reflexion | 跨任务学习 |
| 多跳问答 | Self-Ask | 显式分解更稳 |
| 信息检索、可并行 | ReWOO | 延迟低、成本低 |
| 极难任务、不计成本 | LATS | 效果上限最高 |
| 生产主流 | ReAct + 局部 Reflexion | 平衡效果与成本 |
💡 变体不是互斥的:生产级 Agent 常组合多种思想。例如「ReAct 主体 + 失败时触发 Reflexion 反思 + 关键节点局部 ToT 搜索」。这种混合范式是工程上的最优解,比单一变体更鲁棒。
ReAct 系列的演进方向,可以归纳为三条线:
| 演进线 | 思想 | 代表 |
|---|---|---|
| 记忆增强 | 让 Agent 跨任务积累经验 | Reflexion、Generative Agents |
| 效率优化 | 减少串行等待 | ReWOO、Plan-and-Execute |
| 搜索增强 | 多路探索、回溯 | LATS、ToT |
这三条线继续往前,就走向第 7 章的多智能体协作——与其让一个 Agent 越来越强,不如让多个 Agent 分工合作。多智能体可以看作 ReAct 范式的「横向扩展」:每个 Agent 内部是 ReAct,Agent 之间通过消息协作。
下一节《4.4 ReAct 的适用边界与局限》将坦诚讨论 ReAct 的三大局限(延迟、上下文膨胀、错误累积),回答「什么时候别用 ReAct」。