ReAct
交错推理与动作的基础 agent 循环——thought / action / observation。
模型侧背景,取自 ReAct 原论文(Yao et al., 2022,arXiv:2210.03629v3,“ReAct: Synergizing Reasoning and Acting in Language Models”,ICLR 2023)。harness 综述把 observe-think-act 循环作为 生命周期 (L) 的执行原语。
方法
论文标题里的关键词是 Synergizing——协同。要理解 ReAct 是什么,先要看清它同时否定的两个已有做法,因为 ReAct 正是这两者各自失败模式的交集处补丁:
- 纯推理(reason-only,即 Chain-of-Thought):论文的原话是它“是一个静态 的黑箱”(a static black box)——模型只用自身的内部表示生成思路,不与外部世界锚定,因此无法反应式地纠正或更新知识, 容易 fact hallucination 与 error propagation。
- 纯行动(act-only,如 WebGPT 式检索 agent):模型只会“发指令、看结果、再发指令”,不用语言对高层目标做抽象推理, 也不维护工作记忆来支撑行动,因此容易在动作空间里盲目游走、丢失状态。
ReAct 的做法论文说“很简单”:把动作空间从 A 扩成 Â = A ∪ L,其中 L 是语言空间。在 L 里取的动作 â_t 称为一个 thought(思考 / 推理轨迹),它的关键性质是不改变外部环境、因而没有观察反馈;它只是基于当前上下文 c_t 组织出有用 信息,把上下文更新为 c_{t+1} = (c_t, â_t),供后续推理或行动使用。这一步看似微不足道,却是整个方法的支点:它把模型的 内部推理空间与外部动作空间接到了同一条轨迹上,循环推进:
Thought → Action → Observation → Thought → Action → Observation → … → Finish
论文枚举了 thought 的几种典型用途:分解目标并制定计划、注入常识、从观察中抽取关键信息、追踪进度并调整计划、处理异常并
重规划。动作在外部执行——知识任务里被设计为对 Wikipedia API 的三个动作:search[实体](返回该词条页前 5 句,或给出最
相近的 5 个候选词条)、lookup[串](返回页面中含该串的下一句,模拟浏览器 Ctrl+F)、finish[答案];交互任务里则是环境的
原生命令。观察是动作的真实返回,被原样追加回上下文,成为下一次 thought 的事实依据。
一个常被忽略的设计选择:thought 的密度按任务不同。在“推理为主”的知识任务里,思考与动作逐步交错(每步都是 thought-action-observation,即 dense thought);在动作很多的决策任务里,思考只需稀疏地出现在最关键的位置,由模型自行 决定何时插入 thought。
一条真实轨迹长什么样
论文 Figure 1 的 HotpotQA 例子——问题是“除了 Apple Remote,还有什么设备能控制它最初被设计用来交互的那个程序?”。同一问
题,纯 Standard 提示答“iPod”(错);纯 CoT 先幻想出一个中间环节“Apple Remote 最初用于控制 Apple TV”,再据此答“iPhone、
iPad、iPod Touch”(错);Act-only 检索了几步却没有推理来综合答案,直接 Finish[yes](错)。ReAct 的轨迹则是:
Thought 1: 我需要先搜 Apple Remote,找出它最初被设计用来交互的那个程序。
Action 1: Search[Apple Remote]
Observation 1: Apple Remote 是一款遥控器……最初设计用于控制 Front Row 媒体中心程序。
Thought 2: Apple Remote 最初控制 Front Row。接下来搜 Front Row,看还有什么设备能控制它。
Action 2: Search[Front Row]
Observation 2: 未找到 [Front Row]。相近条目:['Front Row Seat to Earth', 'Front Row Motorsports', 'Front Row (software)', …]
Thought 3: Front Row 没查到,改搜 Front Row (software)。
Action 3: Search[Front Row (software)]
Observation 3: Front Row 是一款已停止开发的媒体中心软件……可由 Apple Remote 或键盘功能键控制。
Thought 4: Front Row (software) 可由 Apple Remote 或键盘功能键控制。所以答案是键盘功能键。
Action 4: Finish[键盘功能键]
看 Observation 2 到 Thought 3:检索失败了,但因为失败结果被回喂进上下文,模型当场识别出“查错了名字”,改用消歧
后的条目重新检索——这一步动态重规划是纯 CoT 拿不到的,CoT 没有外部反馈,也就没有“发现自己错了”的时机。
本质:推理与行动互为对方补上短板
ReAct 比两个基线都强,不是因为“既推理又行动”这种叠加,而是因为二者形成了闭环互补——这正是论文反复强调的 synergy, 它给了这个双向关系两个名字:
- reason to act(推理指导行动):thought 帮模型归纳、追踪、更新行动计划并处理异常,让动作从盲目游走变成有目标的检索 ——补上 act-only 缺的那层高层推理与工作记忆。
- act to reason(行动约束推理):每个 observation 都是一次外部事实核对,把推理重新锚定到真实状态上,切断了 reason-only 里“错误前提→错误结论”的传播链——这是把 CoT 那个“静态黑箱”打开的钥匙。
一句话概括本质:thought 动作把外部世界的反馈引入了模型的思考回路。模型不再一次性把答案想完,而是“想一点→用一个外部 动作验证/获取事实→根据真实返回再想”。轨迹因此可读、可诊断、可人工编辑——论文特别指出这点:人能一眼区分信息来自模型内部 知识还是外部环境,甚至能通过编辑 thought在中途纠正 agent 的行为。
但要讲诚实:这种接地不是免费的。把推理绑到每一步外部反馈上,同时也牺牲了一部分推理的灵活度——论文的人工归因显示 ReAct 消灭了幻觉却带来更高的推理错误率,检索一旦失败还会把整条轨迹带偏。所以论文真正的立场不是“行动优于推理”,而是 内部推理与外部行动各有失效模式,要并用、并在两者间按需切换(见下)。
论文与实验结果
-
设置:知识密集任务 HotpotQA(多跳问答)、Fever(事实核查),配一个简化 Wikipedia API;交互决策任务 ALFWorld(文本 家务游戏)、WebShop(真实商品网购)。主力基座是冻结的 PaLM-540B,全程少样本提示,示例数在 1–6 之间(HotpotQA 6-shot、Fever 3-shot、ALFWorld/WebShop 仅 1–2-shot),示例是人手写的 thought-action-observation 轨迹。
-
知识任务的真实结论——比“ReAct 全面胜出”复杂:单独的 ReAct 在 Fever 上胜过 CoT(60.9 vs 56.3),但在 HotpotQA EM 上反而略逊 CoT(27.4 vs 29.4)。原因见论文对 200 条轨迹的人工归因(Table 2):
指标(HotpotQA 人工标注) ReAct CoT 成功中的“幻觉性假阳性” 6% 14% 失败中的幻觉 0% 56% 失败中的推理错误(含重复循环) 47% 16% 失败中的检索无效 23% — ReAct 几乎消灭了幻觉(56%→0%),轨迹更接地气可信;代价是交错的结构约束降低了推理灵活度,推理错误率反升(16%→47%, 其中一个高频错误是模型反复重复此前的 thought/action 跳不出循环,作者推测与次优的贪心解码有关),且 23% 的失败源于检索本身无 效把轨迹带偏。这一“事实性 vs 灵活性”的取舍,正是论文提出把 ReAct 与 CoT-SC 组合的动机:让模型在检索失败或内部知识 不自信时相互回退。组合后取得最佳——HotpotQA 35.1(ReAct→CoT-SC)、Fever 64.6(CoT-SC→ReAct),且仅用 3–5 个样本就 达到 21 样本 CoT-SC 的水平。(不过所有提示方法仍远低于监督 SoTA 的 67.5 / 89.5。)
-
决策任务——ReAct 大幅领先:在 ALFWorld,最佳 ReAct 试验成功率 71%,远超最佳 Act 的 45% 与模仿学习基线 BUTLER 的 37%(绝对 +34%,即摘要所述数字);连最差的 ReAct 试验(48%)都高过另两者的最佳,且 ReAct 在全部 6 组对照里稳 超 Act(相对增益 33%–90%,均值 62%)。在 WebShop,ReAct 成功率 40.0,超过 IL 的 29.1 与 IL+RL 的 28.7(绝对 +10%)。另有 ReAct-IM 消融(71 vs 53)证明:起作用的是内部高层推理,而非仅仅把环境反馈当“内心独白”回读。
-
贡献:确立推理-行动协同的通用范式;首个在交互环境里用 LLM 做“推理+行动”闭环的演示;轨迹可解释、可编辑,提升可信度 与可诊断性。
局限
- 受检索/工具质量约束:检索反复失败会把轨迹带偏,此时单独 ReAct 可能不及带自洽投票的 CoT-SC(这正是论文提出二者组合的 原因)。结构化动作空间需按任务设计。
- 小模型上提示 ReAct 反而最差:论文的缩放实验显示,在 PaLM-8B/62B 上,靠少样本同时学会推理与行动很难,提示 ReAct 是四 法中最差;但微调能翻转——用 3,000 条正确轨迹微调后,ReAct 成为最佳,且微调后的 62B 超过全部 540B 提示方法。复杂任务 需要更多示范,又容易顶破上下文长度上限。
- 范畴上的边界:它解决的是“单条轨迹内如何交织推理与行动”——没有跨尝试的学习(做错一次不会记住),也没有对多条候 选路径的搜索与回溯。前者是 Reflexion 的主题,后者要到 LATS 引入树搜索才补上。
对 agent 设计的价值
ReAct 首先是一个工程原语:它是当代 agent 内循环的规范原型,今天几乎所有工具调用 agent 都是它的变体——模型的 reasoning 文本就是 thought,一次 function/tool call 就是 action,工具返回就是 observation。由此得到最硬的一条实现纪律:每次动作后 必须把观察回喂上下文,这是 ReAct 相对 act-only 的全部优势来源(幻觉 56%→0% 即出自此),也是工程里最容易被省掉、进而退 化成盲目调用的一环。
但 ReAct 更深的启发不在“怎么搭这个循环”,而在它验证的三个观念:
- 语言推理是一种极其廉价的策略。在 ALFWorld/WebShop 上,仅 1–2 个示例的 ReAct 就压过了用 10³–10⁵ 条数据训练的模仿 学习/强化学习 agent——因为它把“决策”表述成了一段自然语言推理,而不是一份需要昂贵采集的策略数据。启发:面对长程决策, 先让模型用几句话把目标分解、子目标追踪、常识定位讲清楚,常比堆训练数据更划算,且换来一个能读懂的策略。
- 接地是有代价的——不要造只会行动的 agent。ReAct 消灭了幻觉,却也因外部检索失败多出一类新失败(23% 检索无效把轨迹带 偏)。论文自己的答案不是“全靠工具”,而是内部知识与外部知识并用、按需在 ReAct 与 CoT / CoT-SC 间切换。启发:一个只会调工具、没有“回退到自身推理”能力的 agent,在工具失灵时会脆断;稳健的设计要让它知道 何时该信工具、何时该信自己。
- 显式的 thought 换来可观测与可操控。因为推理和环境观察在轨迹里是分开、可读的,人能一眼分辨信息来自模型内部还是外 部,能定位失败在哪一步,甚至能直接编辑某一步 thought 把 agent 拨回正轨——论文把它列为头号特性之一。启发:不要为省 token 把推理压成隐式,它是失败归因与人在环干预的抓手。(thought 密度可按任务调节:推理任务密、决策任务稀疏。)
最后,ReAct 不是上限:它是 Reflexion(在其外套一层跨尝试的记忆)与 LATS(把它嵌进一棵可搜索的树)的基础构件。