ReAct 架构深度解析:让大模型学会"边想边做"

核心观点:ReAct 不是某种复杂的神经网络魔法,而是一种极其朴素的认知外包策略——把逻辑推理交给 LLM,把具体执行交给外部工具,两者通过简单的文本交互交替进行。理解这一点,你就理解了现代 AI Agent 的底层逻辑。

在这里插入图片描述


一、问题的根源:LLM 的"闭关锁国"

在这里插入图片描述

大语言模型本质上是一个静态的知识压缩包。它的训练数据截止于某个时间点,之后发生的事它一无所知。更致命的是,它有一个根深蒂固的毛病——幻觉(Hallucination)

你问它:“阿根廷现任总统的夫人是哪里人?“它可能连眼都不眨就给你编一个名字。不是它想骗你,而是它的训练目标就是"预测下一个最可能的词”,而不是"说真话”。

这就是传统 Chain-of-Thought(CoT)推理的致命缺陷:

❌ CoT 推理 = 纯内部知识推演
   → 知识过时?编一个。
   → 信息不足?编一个。
   → 推理出错?继续编。

ReAct 的出现,就是为了解决这个问题。


二、ReAct 的本质:推理与行动的交响

2.1 论文中的原始定义

ReAct(Reasoning + Acting)由普林斯顿大学和 Google Research 在 ICLR 2023 上提出。论文的核心洞察是:

人类的智能有一个独特特征:能够无缝地将目标导向的行动与语言推理(或内心独白)结合起来。

做饭的时候,你切完菜会想:“现在该热锅了”(推理),然后去开火(行动)。发现没盐了,你会想:“用酱油代替吧”(推理调整),然后去拿酱油(行动调整)。

推理帮助你制定计划、处理异常、更新知识;行动让你从外部世界获取新信息。 两者的紧密协同,才是人类快速学习新任务、在不确定环境下做出稳健决策的关键。

2.2 核心循环:Thought → Action → Observation

在这里插入图片描述

关键理解:Thought 不改变外部环境,它只是模型内部的"内心独白"。Action 才会真正与环境交互,产生 Observation。Observation 又成为下一轮 Thought 的输入。

2.3 一个真实的例子

在这里插入图片描述

用户问题:2024年诺贝尔物理学奖得主是谁?他本科毕业于哪所大学?

Thought #1: 我需要先查2024年诺贝尔物理学奖得主。
Action #1: Search["2024 Nobel Prize Physics winner"]
Observation #1: 2024年诺贝尔物理学奖授予John Hopfield和Geoffrey Hinton...

Thought #2: 获奖者是 Geoffrey Hinton。接下来需要查他的本科毕业院校。
Action #2: Search["Geoffrey Hinton undergraduate university"]
Observation #2: Geoffrey Hinton earned his bachelor's degree in experimental psychology from Cambridge University in 1967.

Thought #3: 信息已经充足,可以给出完整答案。
Final Answer: 2024年诺贝尔物理学奖得主是 Geoffrey Hinton(和 John Hopfield)。
            Hinton 本科毕业于剑桥大学(Cambridge University),1967年获得实验心理学学士学位。

注意:模型不是一开始就知道要查两次的。每一步都是基于上一步的 Observation 动态决定的。这就是 ReAct 的灵魂——动态的、自适应的多步推理


三、为什么 ReAct 有效?认知科学视角

3.1 工作记忆扩展

认知科学中的工作记忆(Working Memory)理论认为,人类的推理能力受限于工作记忆的容量。ReAct 通过外部化工具调用,实际上扩展了模型的"工作记忆":

维度 纯 LLM(CoT) ReAct
知识来源 仅内部训练数据 内部知识 + 外部工具
信息更新 不可能(训练截止后无法更新) 实时获取新信息
错误纠正 错误会传播(错一步,步步错) 每一步都可以基于 Observation 纠正
可解释性 推理过程是黑盒 Thought 轨迹人类可读

3.2 论文中的实验证据

论文在四个基准任务上验证了 ReAct 的效果:

任务 类型 ReAct 提升
HotpotQA 多跳问答 超越纯 CoT,减少幻觉
FEVER 事实验证 超越纯行动生成
ALFWorld 文本游戏 超越 RL 方法 34%
WebShop 网页导航 超越 RL 方法 10%

关键发现

  1. 推理密集型任务(如 QA):需要密集的 Thought-Action 交替(每步都有 Thought)
  2. 决策密集型任务(如游戏):Thought 可以稀疏出现,模型自主决定何时推理

四、从论文到生产:现代 ReAct 实现的演进

在这里插入图片描述

4.1 论文时代的实现(2022)

Prompt + 字符串解析 + 单工具调用 + 纯文本交互

论文中的实现方式:

  • 通过 Prompt 让模型输出 “Thought: … Action: … Observation: …” 格式的文本
  • 用正则表达式解析模型输出,提取 Action
  • 一次只能调用一个工具
  • 所有输入输出都是纯字符串

4.2 现代生产级实现(2024+)

Tool Calling API + 结构化输出 + 多工具并行 + 消息格式

现代实现的关键改进(以 LangGraph 为例):

维度 论文时代 现代实现
工具调用 Prompt + 正则解析 Native Tool Calling API
交互格式 纯字符串 结构化消息(Messages)
工具参数 单个字符串 多参数、结构化输入
并行调用 不支持 支持多工具并行调用
Thought 生成 必须显式生成 可选(模型足够好时可省略)

4.2 架构对比:Router vs Tool-Calling Agent

LangGraph 将 Agent 架构分为两个层次:

在这里插入图片描述


五、代码实现:从玩具到生产

5.1 本质:一个 while 循环

抛开所有框架,ReAct 的底层逻辑就是一个简单的循环:

def react_loop(user_input, tools, llm):
    """ReAct 的本质:一个带有中断机制的 while 循环"""
    history = [{"role": "user", "content": user_input}]
    
    while True:
        # 1. LLM 思考:基于历史决定下一步
        response = llm.chat(history)
        
        # 2. 如果不需要工具,直接回答
        if not response.needs_tool:
            return response.content
        
        # 3. 调用工具,获取观察结果
        for tool_call in response.tool_calls:
            result = execute_tool(tool_call.name, tool_call.args)
            history.append({"role": "observation", "content": result})

就这?对,就这。 所有 Agent 框架的底层都逃不出这个逻辑。

5.2 生产级实现:LangGraph

from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langgraph.prebuilt import create_react_agent

# 1. 定义工具
@tool
def search_wikipedia(query: str) -> str:
    """搜索维基百科获取信息"""
    # 实际实现中调用 Wikipedia API
    ...

@tool
def calculate(expression: str) -> str:
    """计算数学表达式"""
    return str(eval(expression))

# 2. 初始化模型
model = ChatOpenAI(model="gpt-4o", temperature=0)

# 3. 创建 ReAct Agent
agent = create_react_agent(model, [search_wikipedia, calculate])

# 4. 运行
result = agent.invoke({
    "messages": [("user", "2024年诺贝尔物理学奖得主是谁?他本科毕业于哪所大学?")]
})

5.3 核心三要素详解

在这里插入图片描述

Tool Calling(工具调用)

工具是 Agent 与外部世界交互的唯一通道。现代 Tool Calling 的优势:

# 旧方式:Prompt + 解析(不可靠)
"Thought: 我需要搜索...\nAction: Search[query='xxx']"
# 需要用正则解析,容易出错

# 新方式:Native Tool Calling(可靠)
# 模型直接返回结构化调用:
{
    "tool": "search_wikipedia",
    "arguments": {"query": "2024 Nobel Prize Physics"}
}
Memory(记忆)

Agent 需要记住之前的步骤,才能做出连贯的推理:

短记忆:当前任务中,前面几步做了什么
长记忆:跨会话,用户的历史偏好和上下文

LangGraph 通过 State + Checkpointers 实现:

  • State:定义记忆的结构
  • Checkpointers:持久化状态,支持跨会话恢复
Planning(规划)

ReAct 的规划是动态的、渐进式的

不是:先制定完整计划 → 严格执行
而是:走一步 → 看结果 → 决定下一步 → 看结果 → ...

这适合探索型任务(你不知道需要几步),但不适合执行型任务(计划明确,只需执行)。


六、ReAct 的局限与进阶架构

6.1 ReAct 的三大局限

局限 原因 影响
死循环 模型陷入"查了又查"的循环 Token 消耗无限增长
上下文膨胀 每轮的 Thought/Action/Observation 都堆积在 Context 中 推理变慢、可能超限
缺乏全局规划 每步只看当前,没有整体计划 复杂任务效率低

6.2 进阶架构对比

在这里插入图片描述

6.3 实战选择指南

在这里插入图片描述


七、实战避坑指南

7.1 死循环防护

# ❌ 危险:无限循环
while True:
    response = llm.chat(history)
    ...

# ✅ 安全:设置最大迭代次数
MAX_ITERATIONS = 10
for _ in range(MAX_ITERATIONS):
    response = llm.chat(history)
    if not response.needs_tool:
        return response.content
# 超过最大次数仍未完成,返回当前最佳结果或报错

LangGraph 中通过 recursion_limit 配置:

config = {"configurable": {"recursion_limit": 25}}
result = agent.invoke(inputs, config=config)

7.2 上下文管理

# 策略1:滑动窗口(保留最近 N 轮)
def trim_history(history, max_rounds=5):
    if len(history) > max_rounds * 3:  # 每轮3条消息
        return history[-(max_rounds * 3):]
    return history

# 策略2:定期总结(压缩中间过程)
def summarize_progress(history):
    # 让 LLM 把前面的进展浓缩成一段话
    summary_prompt = "请总结目前的进展和已获取的关键信息..."
    return llm.chat(summary_prompt)

7.3 工具设计原则

好的工具设计:
✅ 单一职责:一个工具只做一件事
✅ 明确描述:Tool 的 description 要清晰,帮助 LLM 判断何时调用
✅ 结构化输入:参数类型明确,避免歧义
✅ 容错处理:工具失败时返回有意义的错误信息

差的工具设计:
❌ 一个工具做太多事(LLM 不知道该传什么参数)
❌ 描述模糊(LLM 无法判断何时调用)
❌ 返回信息不透明(LLM 看不懂结果)

八、总结

核心公式

ReAct = Thought(推理) + Action(行动) + Observation(观察)
      = 一个带有中断机制的 while 循环
      = 认知外包:推理交给 LLM,执行交给工具

关键认知

  1. ReAct 不是魔法,是策略:它不改变模型本身,只是改变了模型与外部世界的交互方式。
  2. 动态 vs 静态:CoT 是静态推理(一口气想到底),ReAct 是动态推理(走一步看一步)。
  3. 可解释性是巨大优势:Thought 轨迹让人类能理解模型的决策过程,这在生产环境中至关重要。
  4. 现代实现已大幅进化:从 Prompt+解析 到 Native Tool Calling,从单工具到多工具并行,从纯文本到结构化消息。

下一步

ReAct 是现代 AI Agent 的基石,但并非终点。在实际生产中,你往往需要:

  • Reflection:让 Agent 自我检查,提升输出质量
  • Planning:让 Agent 先制定计划再执行,提升复杂任务效率
  • Multi-Agent:多个 Agent 分工协作,处理更复杂的系统

理解 ReAct,你就理解了 Agent 的"Hello World"。从这里出发,你可以构建出越来越强大的智能系统。


参考

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐