ReAct(Reasoning and Acting,推理与行动)是一种让大语言模型交错产生推理轨迹和任务动作的方法。推理用于形成、跟踪和调整计划,动作则让模型从知识库、工具或环境取得新信息;环境返回的观察又成为下一轮判断的依据。
ReAct 由 Shunyu Yao 等人提出,并发表于 ICLR 2023。其项目主页提供论文示例和代码入口。
基本过程
ReAct 的典型轨迹可以表示为:
问题或目标
→ Thought:判断当前信息和下一步
→ Action:执行搜索、查询或环境操作
→ Observation:接收环境返回的结果
→ Thought:依据新信息继续判断
→ ……
→ Answer:形成最终回答或完成任务
其中:
- **Thought(推理)**帮助模型分解目标、选择动作、解释观察并处理异常;
- **Action(动作)**是面向外部环境的具体操作;
- **Observation(观察)**是动作执行后返回的真实结果,而不是模型对结果的猜测。
动作和观察可以重复多轮。每次观察都可能证实原计划,也可能迫使模型修正假设、改变动作或停止任务。
与其他方法的区别
与思维链的区别
思维链提示主要让模型展开中间推理,但不一定访问外部环境。ReAct 在推理之间插入动作和观察,使模型能够主动获取缺失信息,并用环境反馈约束后续判断。
与工具调用的区别
Agent 工具调用定义一次动作怎样表示、执行和返回;ReAct 描述推理、动作和观察怎样交错推进任务。现代工具调用 API 可以用结构化请求表示 Action、用工具结果表示 Observation,但采用工具调用并不自动意味着完整采用 ReAct。
与工具调用循环的关系
Agent 工具调用循环是运行时控制机制,负责反复调用模型和工具、维护状态并判断停止。ReAct 可以作为循环中的一种模型决策方式;Harness 仍需独立负责参数校验、权限、执行、错误恢复和最大步骤数。
与规划的区别
Agent 规划与任务分解可以预先生成完整计划,也可以动态重规划。ReAct 更强调获得一次观察后再决定下一步,适合信息不完整或环境不断变化的任务。实际系统可以先建立高层计划,再使用 ReAct 式循环执行和修正。
在现代 Agent 中的变化
原始 ReAct 示例使用可见的文字 Thought。现代模型可能在内部完成推理,只向应用返回工具调用、简短说明或最终答案。因此,ReAct 的关键不在于向用户展示完整思维链,而在于让决策与外部行动交错,并保证动作和观察能够正确配对。
应用可以保存工具调用、工具结果、状态变化和验证证据用于调试,不需要记录或公开模型的私有推理过程。若需要可解释性,应让系统提供简洁的行动理由、来源和结果依据。
适用场景
ReAct 适合需要边行动边收集信息的任务,例如:
- 搜索多个来源后回答事实问题;
- 查询业务系统并根据结果选择下一操作;
- 在网页、游戏或模拟环境中连续行动;
- 调试程序时根据日志和测试结果逐步修正方案。
对于步骤完全固定、无需模型动态选择动作的流程,确定性工作流通常更简单。对于可以一次回答的问题,强制运行多轮 ReAct 也会增加延迟和成本。
局限与工程要求
ReAct 不能保证推理或动作正确。模型可能选择错误工具、误解观察、重复相同动作,或者把工具返回的不可信文字当成指令。可靠实现还需要:
- 使用 Schema 校验动作参数,并在工具端检查权限;
- 将失败、空结果和权限不足表示为可区分的观察;
- 保留动作与观察的调用对应关系;
- 设置最大步骤数、时间和成本限制;
- 检测无进展的重复调用并及时终止或请求人工介入;
- 对最终结论和高风险操作使用独立验证,不能只依赖模型的完成声明。
这些机制分别由 Agent Harness、Agent 观察与动作及具体业务系统提供。ReAct 是一种决策与交互范式,不是完整的生产 Agent 架构。