ReAct:Reasoning与Acting协同,让Agent边想边做的奠基之作
Paper Info
- Title: ReAct: Synergizing Reasoning and Acting in Language Models
- Authors: Shunyu Yao 等 (Princeton University, Google Research)
- arXiv: https://arxiv.org/abs/2210.03629
- 视频讲解: [Agent Loop智能体循环] 01期 | Bilibili
Overview
-
背景问题:2023 年前后的大模型要么只会直接生成答案、要么只会链式推理,推理过程是黑箱、幻觉问题严重,且无法访问训练数据之外的实时信息。
-
核心思路:把"思考过程显性化"与"调用外部工具"两件事结合起 来,让模型在自然语言中写出推理步骤的同时,按需执行搜索、计算、查表等行动获取外部证据。
-
命名由来:
Reasoning(推理)与Acting(行动)的首字母组合即为ReAct,与化学反应中的"反应"同音,暗示两者结合产生新能力。 -
核心循环:以
Thought → Action → Observation三元组为基本单元不断循环,直至模型判断任务完成;每一步的 Observation 都会拼回上下文供下一步 Thought 使用。 -
思考显性化:模型用自然语言写出推理步骤(如"我需要先查询爱因斯坦获得诺贝尔奖的年份"),让原本黑箱的推理路径可被人类读取、调试与纠正。
-
行动能力:在思考之后,模型可触发预定义的工具(如搜索引擎、计算器、Wikipedia 查询接口),由框架解析工具调用并把结果以 Observation 形式回填。
-
工具设计要点:必须为模型提供清晰的工具描述与输入格式,否则模型容易调用错误的工具或传入错误参数;工具接口的"友好度"直接影响 Agent 的可靠性。
-
观察整合:Observation 不只是工具返回值,而是与历史 Thought / Action 一起被拼接到上下文,模型据此继续推理;这让多步依赖、跨工具组合成为可能。
-
实验验证:在常识推理(HotpotQA)、事实验证(Fever)、多步问答、知识密集型任务以及 ALFWorld、WebShop 等交互式环境中,ReAct 均显著优于纯 CoT 或纯 Act 的基线。
-
历史地位:现代 Agent Loop 的事实标准,几乎所有后续 Agent 框架(Reflexion、AutoGPT 、ReWOO、Toolformer 等)都可视为对 ReAct 这一循环结构的扩展或改进;论文提出后即开源,极大加速了 Agent 技术普及。
核心内容解读
2023 年大模型的两类"偏科"
ReAct 诞生前,主流的大模型使用方式呈现明显的两极分化:
一类是直接生成(Standard Prompting)。模型读入问题后直接吐出最终答案,省去了中间步骤。这种方式快但不可控——答案可能是对的,也可能是模型"自信地胡说",即所谓的幻觉问题;对于需要多步推理或多信息源整合的问题尤为吃力。
另一类是纯思维链(Chain-of-Thought, CoT)。让模型在作答前先写出一串推理步骤,再给出最终答案。这种方式显著提升了可解释性与复杂推理能力,但 CoT 本质仍是"闭门造车"——推理过程发生在模型内部,且所有依赖的信息都被压缩在模型的参数化记忆里,无法访问外部实时数据。
这两类方法各有强项却彼此割裂:前者缺乏过程,后者缺乏与外部世界的交互。与此同时,工具调用(Tool Use / Toolformer)、搜索引擎增强(WebGPT)等方向各自发展,却鲜有人把它们与链式推理系统性地整合到同一个 prompt 框架里。
论文的洞察:把推理与行动放到同一条链上
Shunyu Yao 等人观察到一个朴素但关键的现象——人类解决复杂问题时,本就是"边想边做"的:先在脑中形成假设,再去查阅资料或执行操作,根据结果更新假设,循环往复直至问题解决。他们由此提出:
让语言模型在同一段上下文中交替生成
Thought(推理)与Action(行动),并把外部工具返回的Observation拼回上下文,作为下一步推理的依据。
这一设计带来三点收益:
- 推理路径可读。Thought 用自然语言写就,人可以直接审视每一步是否合理,不再面对一个不可解释的"黑箱答案"。
- 幻觉被显性抑制。当模型不确定某个事实时,可以直接发起搜索,把权威结果作为 Observation 引用,避免凭空编造。
- 知识可扩展。再大的模型也无法穷尽实时或长尾信息;通过工具调用,模型的"知识边界"被动态外推到了整个互联网与各种 API。
ReAct 的循环结构:Thought → Action → Observation
ReAct 的核心是一个极简的三元组循环:

Thought t: 我接下来需要知道 X,因此调用搜索工具。
Action t: Search[X]
Observation t: 关于 X 的搜索结果 ...
Thought t+1: 根据搜索结果我可以推断 Y ...
Action t+1: Lookup[Y] 或 Finish[Y]
Observation t+1: ...
每轮循环中:
- Thought 由模型自由生成,可以是分解子目标、规划下一步、解释上一步 Observation、跟踪整体进度等任意形式的内心独白;
- Action 受限于预定义的工具空间(如
Search[query]、Lookup[entity]、Calculate[expr]、Finish[answer]),由框架解析后实际执行; - Observation 是工具的返回值,被拼回 prompt 上下文,进入下一轮 Thought。
循环终止于 Finish[answer] 行动(或达 到预设的最大步数)。整个过程对模型而言就是一段连续文本的续写,对开发者而言则是一条可回放、可调试的执行轨迹。
思考显性化:用自然语言做推理
Thought 的设计哲学是"用自然语言做推理",而不是符号逻辑或形式化计划。这一选择带来几个关键优势:
- 无需任务专属的解析器。模型直接写中文 / 英文句子,省去了为每个领域编写 grammar 或 DSL 的成本。
- 可解释性自然达成。Thought 直接暴露给用户和下游调试工具,比从模型 logits 中反推意图更可靠。
- 支持跨任务迁移。同一套"边想边做"的模板可以套用到问答、决策、网页导航等完全不同的领域,只需要替换 Action 空间。
论文也指出 Thought 的局限:自然语言推理本质上是"自由发挥",有时会冗余、跳跃甚至自相矛盾;后续工作(如 Reflexion、Self-Refine)正是通过在 Thought 之上叠加反思 / 修订步骤来弥补这一不足。
不过用一个更现实的视角看 Thought 的"开销"问题:模型需要多生成一段推理文本,确实会增加 token 消耗,但在 2023 年的时点之后,大模型算力越来越强,这点计算量其实越来越不是瓶颈——真正值钱的,是 Thought 带来的可解释性与可纠错性,而非那几行额外的输出 token。