ReAct模式
1868 字约 6 分钟
domain/aiai/agents
2026-07-24
ReAct(Reasoning + Acting)是 LLM Agent 最经典的推理-行动范式,由 Yao et al.(2022)在论文 "ReAct: Synergizing Reasoning and Acting in Language Models" 中提出。核心思想是让 LLM 交替进行思考(Thought)和行动(Action),在每一步先推理当前状态和下一步计划,再执行具体操作,然后观察结果——形成 Thought → Action → Observation 的循环。
一句话解释
想一步、做一步、看结果、再想一步——这就是 ReAct。它让 LLM 不只是"想"(CoT)或"做"(Act),而是"想着做、做了再想"。
核心问题
为什么需要 ReAct?
- 纯推理(CoT)的局限:CoT 只能基于已有知识推理,无法获取新信息或验证推理结果
- 纯行动(Act)的局限:没有推理指导的行动是盲目的,容易走错方向
- 推理+行动的协同:推理为行动提供方向和理由,行动为推理提供证据和反馈
- 可解释性:Thought 步骤让 Agent 的决策过程透明可追溯
Thought-Action-Observation 循环详解
循环结构
Task: {用户任务}
Thought 1: {分析当前状态,制定计划}
Action 1: {执行具体操作}
Observation 1: {操作结果}
Thought 2: {基于 Observation 1 分析,调整计划}
Action 2: {执行下一步操作}
Observation 2: {操作结果}
...
Thought N: {综合所有 Observation,得出结论}
Final Answer: {最终回答}三个组成部分
| 组成部分 | 角色 | 内容 |
|---|---|---|
| Thought(思考) | 推理引擎 | 分析当前状态、评估已有信息、制定下一步计划、解释为什么选择某个 Action |
| Action(行动) | 执行引擎 | 具体的工具调用、搜索查询、API 请求等可执行操作 |
| Observation(观察) | 反馈信号 | Action 执行后返回的结果,作为下一轮 Thought 的输入 |
具体示例
Task: 北京今天适合户外运动吗?
Thought 1: 我需要查询北京今天的天气情况,包括温度、空气质量、风速等。
Action 1: search("北京今天天气 温度 空气质量")
Observation 1: 北京今天晴,气温 18-26°C,空气质量指数 85(良),北风 3 级。
Thought 2: 天气晴好,温度适宜,空气质量良好,风力不大。
这些条件都适合户外运动。我可以给出建议了。
Action 2: finish("适合。今天北京天气晴好,18-26°C,空气良好,适合户外运动。")ReAct 论文核心思路
论文背景
Yao et al.(2022)在 HotpotQA(多跳问答)和 FEVER(事实验证)等任务上验证了 ReAct 的有效性。
核心发现
- ReAct > CoT:在需要外部信息的任务上,ReAct 显著优于纯 CoT(因为 CoT 无法获取新信息)
- ReAct > Act:在有推理步骤的情况下,Action 的选择更准确(因为 Thought 提供了推理指导)
- 可解释性:Thought 轨迹让人类能够理解 Agent 的决策过程,便于调试和改进
关键洞察
- 推理帮助行动:Thought 步骤帮助 Agent 在复杂决策中选择正确的 Action
- 行动帮助推理:Observation 为 Thought 提供了真实世界的证据,减少了"凭空推理"的幻觉
ReAct 与 CoT/ToT 的对比
| 维度 | CoT(Chain of Thought) | ToT(Tree of Thought) | ReAct |
|---|---|---|---|
| 核心操作 | 纯推理 | 多路径推理 + 评估 | 推理 + 行动 + 观察 |
| 外部信息 | 无法获取 | 无法获取 | 通过 Action 获取 |
| 验证能力 | 无 | 有(评估节点) | 有(Observation) |
| 搜索空间 | 线性链 | 树形(可回溯) | 线性链(但每步有外部反馈) |
| 适用场景 | 数学推理、逻辑推理 | 复杂规划、创意写作 | 信息检索、工具调用、多步骤任务 |
| 成本 | 低(1 次 LLM 调用) | 高(多次 LLM 调用) | 中(N 次 LLM 调用 + N 次 Action) |
核心区别:CoT 是"纯想",ToT 是"多想几条路",ReAct 是"边想边做"。
Thought 的质量如何影响 Action 的准确性
Thought 是 ReAct 循环中的"指挥官",其质量直接决定 Action 的有效性:
| Thought 质量问题 | 导致的 Action 问题 | 改进方法 |
|---|---|---|
| 分析不充分 | 选择了错误的工具或查询 | 在 Prompt 中要求"先分析所有已知信息" |
| 计划不明确 | Action 参数不精确 | 要求 Thought 中明确"我要查什么、为什么查" |
| 忽视 Observation | 重复执行相同的 Action | 要求 Thought 中总结"上一步得到了什么" |
| 过度推理 | 不必要的复杂 Action 序列 | 限制最大步数,鼓励"够了就回答" |
ReAct 在主流框架中的实现
LangChain 实现
LangChain 的 create_react_agent 提供了开箱即用的 ReAct Agent:
from langchain import hub
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import OpenAI
from langchain.tools import tool
@tool
def search(query: str) -> str:
"""搜索信息"""
return f"搜索结果: ..."
@tool
def calculator(expression: str) -> str:
"""计算数学表达式"""
return str(eval(expression))
llm = OpenAI(model="gpt-4")
tools = [search, calculator]
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools)
result = executor.invoke({"input": "地球到月球的距离是多少公里?"})LlamaIndex 实现
LlamaIndex 的 ReActAgent 内置了对 RAG 工具的支持:
from llama_index.core.agent import ReActAgent
from llama_index.core.tools import QueryEngineTool
query_tool = QueryEngineTool.from_defaults(
query_engine=index.as_query_engine(),
description="用于查询知识库中的信息"
)
agent = ReActAgent.from_tools([query_tool], llm=llm, verbose=True)
response = agent.chat("公司的年假政策是什么?")ReAct 的局限与改进方向
局限
- 无限循环问题:Agent 可能在 Thought-Action-Observation 循环中反复执行,无法收敛到最终答案
- Thought 质量依赖 LLM 能力:小模型的 Thought 质量差,导致 Action 选择错误
- 线性执行:标准 ReAct 是线性的,不支持并行 Action 或回溯
- 错误累积:早期 Thought 的错误会误导后续所有步骤
改进方向
| 局限 | 改进方案 | 说明 |
|---|---|---|
| 无限循环 | 最大步数限制 + 终止条件检测 | 超过 N 步强制结束 |
| Thought 质量 | 使用更强的模型做 Thought | Thought 用 GPT-4,Action 执行用轻量模型 |
| 线性执行 | 与 Agent工作流 结合 | 支持并行分支和条件分支 |
| 错误累积 | 添加 Reflection反思机制 | 每 N 步做一次反思和纠错 |
ReAct 与 Agent工作流、Reflection反思机制的协同
ReAct 循环(核心引擎)
├── 每一步的 Thought → 推理和规划
├── 每一步的 Action → 工具调用
├── 每一步的 Observation → 结果反馈
│
├── + Reflection(每 N 步触发)
│ └── 评估过去的 Thought-Action 序列是否合理
│ └── 发现错误 → 调整策略
│
└── + Agent工作流(宏观控制)
└── 任务分解 → 多个 ReAct 子任务
└── 子任务结果整合 → 最终答案常见误区
- Thought 写得太简单:Thought 是 ReAct 的灵魂,"我想搜索一下"不是好的 Thought
- 不设置终止条件:没有最大步数限制,Agent 可能无限循环
- Action 粒度太大:一个 Action 做太多事情,难以调试和回退
- 忽视 Observation:Thought 中没有充分利用 Observation 的信息
- 所有任务都用 ReAct:简单任务直接 LLM 回答即可,不需要 ReAct 循环
可继续补充的方向
- ReAct 的变体(Parallel ReAct、Interleaved Think)
- ReAct 在不同任务上的效果对比实验
- ReAct 与 Plan-and-Execute 模式的对比
- ReAct 的 Prompt Engineering 最佳实践
关联笔记
- Agent基础 — Agent 基础概念
- Agent工作流 — 宏观工作流控制
- Reflection反思机制 — ReAct 的自我修正增强
- AI 与 Agent — Agent 概念入口
- Tool Use工具调用设计 — Action 的具体实现
- Planner与Executor — 规划与执行的分离架构