ReAct:在语言模型中协同推理与行动

发表于 ICLR 2023 会议论文

作者: Shunyu Yao*¹, Jeffrey Zhao², Dian Yu², Nan Du², Izhak Shafran², Karthik Narasimhan¹, Yuan Cao²

¹ 普林斯顿大学计算机科学系 · ² Google Research, Brain 团队

项目主页: https://react-lm.github.io/


摘要

尽管大型语言模型(LLM)在语言理解和交互式决策任务中展现出了令人印象深刻的能力,但其推理(如链式思维提示)和行动(如动作计划生成)能力主要被作为独立课题研究。在本文中,我们探索使用 LLM 以交替方式同时生成推理轨迹和任务特定动作,从而在两者之间实现更大的协同效应:推理轨迹帮助模型归纳、追踪和更新行动计划并处理异常情况,而行动则允许模型与知识库或环境等外部来源交互以获取额外信息。

我们将该方法命名为 ReAct,并将其应用于多种语言和决策任务,证明了其相较于最先进基线的有效性,以及相较于不含推理或行动组件的方法在人类可解释性和可信度方面的改进。具体而言:

  • 在问答任务(HotpotQA)和事实验证任务(Fever)上,ReAct 通过与简单的 Wikipedia API 交互,克服了链式思维推理中常见的幻觉和错误传播问题,并生成了比无推理轨迹基线更具可解释性的类人任务求解轨迹。
  • 在两个交互式决策基准(ALFWorld 和 WebShop)上,ReAct 在仅使用一到两个上下文示例的情况下,分别以 34%10% 的绝对成功率优于模仿学习和强化学习方法。

1 引言

人类智能的一个独特特征是能够将面向任务的行动语言推理(或内部语言)无缝结合。这种能力在理论上对于实现自我调节或策略化以及维持工作记忆发挥着重要作用。

以在厨房烹饪为例。在任意两个具体动作之间,我们可能会用语言进行推理:

  • 追踪进度:"现在所有东西都切好了,我应该烧一壶水"
  • 处理异常或调整计划:"我没有盐了,让我用酱油和胡椒代替"
  • 识别何时需要外部信息:"如何揉面团?让我在网上搜索一下"

我们也可能执行行动(打开食谱阅读配方、打开冰箱、检查食材)来支持推理并回答问题("我现在能做什么菜?")。这种"行动"与"推理"之间的紧密协同使人类能够快速学习新任务并进行稳健的决策或推理,即使在前所未见的情况下或面对信息不确定性时也是如此。

近期的研究已经暗示了将语言推理与交互式决策相结合的可能性:

  • 一方面,经过适当提示的 LLM 已展现出涌现能力,可以执行多步推理轨迹以在算术、常识和符号推理任务中推导出答案。然而,这种"链式思维"推理是一个静态黑盒——模型使用其内部表示来生成思维,并未基于外部世界进行 grounding,这限制了其反应性推理或更新知识的能力,可能导致事实幻觉错误传播
  • 另一方面,近期工作探索了使用预训练语言模型在交互式环境中进行规划和行动,重点是通过语言先验预测动作。然而,这些方法并未利用语言模型对高层目标进行抽象推理或维持工作记忆来支持行动。

在本工作中,我们提出了 ReAct,一种结合语言模型推理和行动的通用范式,用于解决多种语言推理和决策任务。ReAct 提示 LLM 以交替方式生成与任务相关的语言推理轨迹和动作,使模型能够:

  1. 执行动态推理——创建、维护和调整高层行动计划(reason to act
  2. 与外部环境交互(如 Wikipedia)——将额外信息纳入推理(act to reason

2 ReAct:协同推理 + 行动

2.1 基本设定

考虑一个智能体与环境交互进行任务求解的通用设定。在时间步 t,智能体从环境中接收观察 oₜ,并按照某个策略 π(aₜ|cₜ) 采取动作 aₜ,其中 cₜ = (o₁, a₁, ···, oₜ₋₁, aₜ₋₁, oₜ) 是智能体的上下文。

2.2 核心思想

ReAct 的思想很简单:将智能体的动作空间扩充为 Â = A ∪ L,其中 L 是语言空间。语言空间中的动作(称为思维推理轨迹)不影响外部环境,因此不会产生观察反馈。相反,思维旨在通过对当前上下文进行推理来组合有用信息,并更新上下文以支持未来的推理或行动。

有用思维的类型包括:

  • 分解任务目标并创建行动计划
  • 注入与任务求解相关的常识知识
  • 从观察中提取重要部分
  • 追踪进度并转换行动计划
  • 处理异常并调整行动计划

2.3 实现方式

在本文中,我们主要关注使用冻结的大型语言模型 PaLM-540B,通过少样本上下文示例来提示其生成领域特定动作和自由形式语言思维。每个上下文示例是一个人类完成动作、思维和环境观察的轨迹。

  • 对于推理为主的任务:交替生成思维和动作,任务求解轨迹由多个"思维-动作-观察"步骤组成
  • 对于决策任务(可能涉及大量动作):思维仅需要在轨迹中最相关的位置稀疏出现

2.4 ReAct 的独特特性

  • A) 直观且易于设计:设计 ReAct 提示很简单,人类标注者只需在所采取的动作之上用语言写下思维即可
  • B) 通用且灵活:适用于具有不同动作空间和推理需求的多种任务
  • C) 高性能且稳健:在仅从一到六个上下文示例中学习的情况下表现出强泛化能力
  • D) 与人类对齐且可控:提供可解释的顺序决策和推理过程,人类可以轻松检查推理和事实正确性

3 知识密集型推理任务

3.1 实验设定

数据集:

  1. HotPotQA:多跳问答基准,需要对两个或更多 Wikipedia 段落进行推理
  2. FEVER:事实验证基准,每个声明被标注为 SUPPORTS(支持)、REFUTES(反驳)或 NOT ENOUGH INFO(信息不足)

动作空间: 设计了简单的 Wikipedia Web API,包含三种动作:

  1. search[entity]:返回对应实体维基百科页面的前 5 个句子
  2. lookup[string]:返回页面中包含该字符串的下一个句子(模拟浏览器的 Ctrl+F 功能)
  3. finish[answer]:以给定答案完成当前任务

3.2 方法

ReAct 提示: 从训练集中随机选择 HotpotQA 的 6 个和 Fever 的 3 个案例,手动编写 ReAct 格式的轨迹作为少样本示例。思维用于:

  • 分解问题
  • 从 Wikipedia 观察中提取信息
  • 执行常识或算术推理
  • 引导搜索重新表述
  • 综合最终答案

基线方法:

  • (a) 标准提示(Standard):移除所有思维、动作、观察
  • (b) 链式思维提示(CoT):移除动作和观察(纯推理基线);另有自洽性基线 CoT-SC
  • (c) 纯行动提示(Act):移除 ReAct 轨迹中的思维

结合内部和外部知识:

  • ReAct → CoT-SC:当 ReAct 在给定步数内未能返回答案时,退回到 CoT-SC
  • CoT-SC → ReAct:当 CoT-SC 样本中的多数答案出现次数少于 n/2 时,退回到 ReAct

3.3 结果与分析

提示方法 HotpotQA (EM) Fever (Acc)
Standard 28.7 57.1
CoT 29.4 56.3
CoT-SC 33.4 60.4
Act 25.7 58.9
ReAct 27.4 60.9
CoT-SC → ReAct 34.2 64.6
ReAct → CoT-SC 35.1 62.0

关键发现

1. ReAct 始终优于 Act

证明了推理对于指导行动的价值,尤其是在综合最终答案方面。

2. ReAct vs. CoT 的行为差异

通过对 200 个样本的人工分析,发现:

  • 幻觉是 CoT 的严重问题:CoT 的虚假正例率(14%)远高于 ReAct(6%),且幻觉占 CoT 失败模式的 56%。相比之下,ReAct 的问题求解轨迹更加基于事实、数据驱动且可信
  • 结构约束限制了 ReAct 的灵活性:交替推理、行动和观察步骤虽然提高了 ReAct 的 grounding 和可信度,但也降低了制定推理步骤的灵活性,导致更高的推理错误率。
  • 成功检索信息对 ReAct 至关重要:无信息的搜索(占错误案例的 23%)会使模型推理偏离轨道。

3. ReAct + CoT-SC 在 LLM 提示中表现最佳

在 HotpotQA 和 Fever 上分别通过 ReAct → CoT-SC 和 CoT-SC → ReAct 取得最佳结果。

4. ReAct 在微调中表现最佳

仅用 3,000 个示例微调后,ReAct 成为四种方法中最佳的方法。PaLM-8B 微调 ReAct 优于所有 PaLM-62B 提示方法,PaLM-62B 微调 ReAct 优于所有 540B 提示方法。


4 决策任务

4.1 ALFWorld

ALFWorld 是一个合成的基于文本的游戏,旨在与具身化 ALFRED 基准对齐。它包括 6 种类型的任务,智能体需要通过文本动作导航并与模拟家庭环境交互来实现高层目标(例如"在台灯下检查纸张")。

实验结果:

方法 Pick Clean Heat Cool Look Pick 2 All
Act (best of 6) 88 42 74 67 72 41 45
ReAct (avg) 65 39 83 76 55 24 57
ReAct (best of 6) 92 58 96 86 78 41 71
BUTLER (best of 8) 46 39 74 100 22 24 37

最佳 ReAct 试验达到了 71% 的平均成功率,显著优于最佳 Act(45%)和 BUTLER(37%)。

4.2 WebShop

WebShop 是一个包含 118 万真实商品和 1.2 万人类指令的在线购物网站环境。

方法 Score 成功率 (SR)
Act 62.3 30.1
ReAct 66.6 40.0
IL 59.9 29.1
IL+RL 62.4 28.7
Human Expert 82.1 59.6

ReAct 相比之前最佳成功率取得了 10% 的绝对提升

4.3 内部推理 vs. 外部反馈的价值

与 Inner Monologue(IM)方法的对比实验表明,ReAct 大幅优于 IM 风格的提示(总体成功率 71 vs. 53)。ReAct-IM 经常在识别子目标完成或确定下一个子目标时犯错,因为缺乏高层目标分解和常识推理。


5 相关工作

语言模型用于推理

最知名的工作是链式思维(CoT),后续工作包括:

  • Least-to-most 提示:用于解决复杂任务
  • Zero-shot-CoT:零样本链式思维
  • Self-consistency:自洽性推理
  • Selection-Inference:将推理分为"选择"和"推断"两步
  • STaR:通过模型自身生成的正确推理进行引导式微调
  • Faithful Reasoning:将多步推理分解为三个步骤

与这些方法不同,ReAct 不仅仅是孤立的、固定的推理,而是将模型动作及其相应观察整合到一个连贯的输入流中。

语言模型用于决策

  • WebGPT:使用 LM 与浏览器交互,但不显式建模思维和推理过程
  • SayCan:使用 LLM 进行机器人动作规划
  • Inner Monologue:添加了环境反馈注入,但其"内心独白"并非真正的内心思维

6 结论

我们提出了 ReAct——一种简单而有效的方法,用于在大型语言模型中协同推理和行动。通过在多跳问答、事实核查和交互式决策任务上的多种实验,我们表明 ReAct 在提供可解释决策轨迹的同时实现了优越的性能。

尽管方法简单,但具有大动作空间的复杂任务需要更多的示范来良好学习,这不幸地容易超出上下文学习的输入长度限制。我们在 HotpotQA 上探索了微调方法并取得了初步的积极结果,但从更多高质量的人类标注中学习将是进一步提高性能的理想途径。

未来方向: 通过多任务训练扩展 ReAct,并将其与强化学习等互补范式相结合,可能会产生更强的智能体,进一步释放大型语言模型在更多应用中的潜力。


关键参考文献

  • Wei et al., 2022 — Chain-of-thought prompting elicits reasoning in large language models
  • Wang et al., 2022a — Self-consistency improves chain of thought reasoning
  • Chowdhery et al., 2022 — PaLM: Scaling language modeling with pathways
  • Yang et al., 2018 — HotpotQA: A dataset for diverse, explainable multi-hop question answering
  • Thorne et al., 2018 — FEVER: A large-scale dataset for fact extraction and verification
  • Shridhar et al., 2020b — ALFWorld: Aligning text and embodied environments
  • Yao et al., 2022 — WebShop: Towards scalable real-world web interaction
  • Nakano et al., 2021 — WebGPT: Browser-assisted question-answering
  • Huang et al., 2022b — Inner Monologue: Embodied reasoning through planning

Read more

把 Codex CLI 的登录态"搬"到一台新服务器

场景:你在一台老机器上早就登录好了 Codex CLI,现在开了台新服务器、装好了 codex,但它没登录。你不想在新机上重新走一遍 OAuth 网页授权(有时候服务器上根本打不开浏览器),只想把老机器上那份"已经登录好的身份"复制过去。 这篇讲的就是这个搬运动作的完整方法论——为什么能搬、怎么搬、有哪些坑。命令里所有隐私都用占位符,照着换成你自己的即可。 一、先理解一件事:Codex 的登录就是一个文件 这是整个操作的地基。Codex CLI(ChatGPT OAuth 登录模式下)的登录状态,不在什么系统钥匙串里,也不在环境变量里,就是家目录下一个单独的 JSON 文件: ~/.codex/auth.json 它长这样(字段名是真的,值我打码了): { "auth_mode": "

By ladydd

哨兵机制:让 Agent 一触即醒

0. 一句话点破本质 **让"等"发生在便宜的子进程里,让贵的 agent 只在有事时醒。**心跳解决"最迟多久必有人查岗",探针解决"事情一发生几乎立刻有人到场"——两个机制回答的是两个不同的问题,谁也替代不了谁。 1. 机制全貌:会自杀的轮询进程 + 宿主的"尸体通知" 我的实现只有两块积木: 积木一:一个有明确死法的后台循环 # 放行任务的同时,后台挂上(run_in_background) for i in $(seq 1 20); do 信号=$(ssh data "tmux capture-pane -t dna

By ladydd

Agent 心跳机制·设计与实现

0. 一句话点破本质 **心跳不是闹钟,是"带着完整世界快照的自我唤醒"。**闹钟只解决"什么时候醒";心跳真正要解决的是你点出的那个问题——醒来的那个瞬间,清楚自己是谁、任务到哪了、这一跳该干什么。我所有跑得好的心跳,提示词都写得像给一个失忆的陌生人看的;所有出过事的心跳,都是因为假设"我还记得"。 1. 第一性原理:为什么"醒来知道干啥"这么难 一个长期任务里的 agent 面临三重失忆: 1. 上下文会被压缩——多轮之后早期细节只剩摘要,心跳打进来时,那条心跳提示词可能是上下文里唯一高保真的任务描述 2. 世界在你睡着时变了——下属可能干完了、卡死了、跑偏了,你脑子里的"进度"从睡着那刻就开始过期 3. 任务本身会变—

By ladydd

我没手动映射 3000,公网为什么还能访问?一次 UPnP 误开孔复盘

写在前面:标题里的“自己打开”只是当时的主观感受。路由器没有失控,也不存在神秘穿透。真正发生的是:排障自动化从局域网主动调用了 UPnP AddPortMapping,路由器按协议新增了公网映射。 1. 原本的设计边界 家里的 Open WebUI 跑在一台 Ubuntu 主机的 Docker 中: 内网主机 192.168.x.x:3000 路由器上手动配置的入口是: 公网 TCP 13000 → 内网主机:3000 外部用户不直接访问家宽端口,而是先到云端 Caddy: 用户浏览器 → https://ai.example.com (云端 Caddy) → http://home.example.com:13000 (DDNS → 家宽公网

By ladydd
陕公网安备61011302002223号 | 陕ICP备2025083092号