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

三台机器部署 ClickHouse 高可用集群实战记录

本文是一份可发布版部署记录。真实 IP、域名、账号、密码、下载链接、业务目录名、机器唯一标识等敏感信息已经替换为占位符。命令中的 <...> 需要按自己的环境替换。 目标与拓扑 这次目标是用三台数据节点部署一套 ClickHouse 高可用集群,拓扑采用: 1 shard x 3 replicas 含义是:集群只有一个逻辑分片,三台机器都保存同一份数据的完整副本。任意一台数据节点宕机时,只要 ClickHouse Keeper 仍然有多数派,剩余节点仍可继续提供读写服务。 规划节点如下: 主机名示例地址角色ch-01<ch-01-ip>ClickHouse Server + ClickHouse Keeperch-02<ch-02-ip>ClickHouse Server + ClickHouse Keeperch-03<ch-03-ip&

By ladydd

折腾记(二):接入火山引擎实时语音 API,家庭语音助手体验直接拉满

接上篇 上一篇用全开源组件(Whisper + Hermes + Edge-TTS)搭了个语音助手,能跑,但体验就是"能用"二字: * 中文识别只有 70 分,方言基本歇菜 * 英文唤醒词"Alexa"喊着别扭 * 说完到回复要等 4-8 秒 * 它说话的时候你插不了嘴 这些问题靠堆开源组件很难根治。于是我去试了火山引擎(字节跳动)的语音服务,结果直接换了条路。 这篇分两段:先讲怎么用火山引擎的 ASR/TTS 替换掉开源组件(小改),再讲怎么上端到端实时语音模型(大改)。 第一段:先把 ASR 和 TTS 换成火山引擎 为什么换 我用豆包输入法的时候发现它语音识别准得离谱。一查,豆包用的就是字节自家的火山引擎 Seed-ASR。开通后有免费额度(

By ladydd

折腾记(一):用全开源组件给家里搭一个语音助手,对接自己的 Hermes Agent

起因 事情是从一块 ESP32-S3 开发板开始的。 我手上有一块 Seeed Studio XIAO ESP32-S3 Sense,带摄像头和麦克风。最初的想法很美好:用这块板子做一个无线语音终端,对着它说话,连到我服务器上跑的 Hermes Agent(一个自托管的 AI agent),让它回答我。 但折腾到一半我突然意识到一件事:我的麦克风、音响、服务器全在家里,为什么要绕一圈用 ESP32?直接把麦克风和音响插到服务器上不就行了? ESP32 那条路(做无线拾音终端)当然也有价值,但那是"为了学嵌入式而学",不是解决问题的最短路径。于是这个项目就从"嵌入式项目"变成了"在服务器上拼一个语音助手"。这篇就记录后者。 教训零:先想清楚你要解决的是什么问题。很多时候最优解比你最初设想的简单得多。 目标

By ladydd

Kiro 的三种代理设置方法:本地、服务端、Remote

作为kiro的骨灰级用户,这篇是我自己折腾 Kiro / Kiro Remote / Ubuntu Server 代理问题后的复盘。 核心不是“怎么配一个代理”,而是先判断:到底是谁在访问外网? 谁访问外网,代理就要配给谁。 0. 先说结论 Kiro 相关代理大概分三类: 场景真正访问外网的进程在哪里代理应该配在哪里本地 KiroWindows / Mac 本机本机 Clash / Proxifier / 系统代理服务端 Kiro / CLIUbuntu Server 上的 shell、CLI、node、kiro 进程Ubuntu 的环境变量,比如 HTTP_PROXY / HTTPS_PROXYKiro Remote远程 Ubuntu 上的 ~/.kiro-server 和 extensionHost远程 Ubuntu 的 Kiro Server

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