ReAct Agent:赋予大模型“手”与“脑”的经典范式

ReAct(Reasoning and Acting)将链式推理环境行动结合到一起,是一种赋予 AI 模型“思考能力”与“动手能力”的经典范式,也是大型语言模型(LLM)迈向真正“智能体(Agent)”时代的一个核心里程碑。

在 ReAct 提出之前,大模型解决复杂问题主要依赖两条平行的路线,但它们都有致命缺陷:

  • 纯推理路线(如 Chain-of-Thought, CoT): 模型通过思维链将复杂问题拆解为多步来解答。但模型被困在自己的“信息茧房”中。它只能依赖预训练时学到的静态知识,无法获取实时信息,极易产生“幻觉(Hallucination)”和事实性错误。
  • 纯行动路线(Action-only): 模型直接根据当前状态输出动作指令(例如玩文字游戏或进行网页导航), 缺乏宏观规划和深思熟虑。模型在面对复杂情况时往往只能“走一步看一步”,容易陷入死循环或做出错误决策。

核心技术:走一步,看一步

ReAct 的技术核心并不复杂,它本质上是为 LLM 设计了一套严格的交互循环机制和**提示词(Prompt)结构,**其解决了大模型仅靠思维链(CoT)推理时容易产生的“幻觉”或知识陈旧问题。它不是在一开始就把所有的计划都规划好,而是走一步看一步。它会观察当前步骤的结果,然后思考下一步的计划。

1. 核心运行逻辑:TAO 循环

ReAct 智能体通过一个持续的循环来解决问题,即 思考 (Thought) -> 行动 (Action) -> 观察 (Observation)

  • Thought(思考): 模型对当前的任务状态或前一步的观察结果进行分析、推理,并规划下一步的动作。
    • 示例: “我需要知道苹果公司现任 CEO 是谁,所以我应该搜索一下。”
  • Action(行动): 模型根据思考的结果,决定调用哪个外部工具,并生成相应的参数。
    • 示例: Search("Apple current CEO")
  • Observation(观察): 外部工具(如搜索引擎、计算器、数据库、API)执行该动作后,将真实的结果返回给模型。
    • 示例: “观察结果:苹果公司现任首席执行官是蒂姆·库克(Tim Cook)。”

模型会不断重复这个 T-A-O 过程,直到它的“Thought”得出结论:任务已完成,可以输出最终答案。

为什么有了标准的步骤,还需要强调 ReAct 机制?

因为在真实世界的执行过程中,外部环境充满了不确定性。大模型调用的工具极有可能返回报错、无效的 JSON 格式或查无此人的数据。ReAct 的强大之处在于它的动态容错能力——它能根据 Observation 返回的异常结果及时调整策略,尝试其他方法,而不是在遇到错误后就直接卡死

2. 提示词工程(Prompt Engineering)机制

ReAct 完全依赖于精心设计的 Prompt。为了让普通的 LLM 变成 ReAct Agent,我们需要在系统提示词中向模型明确以下几点:

  1. 可用工具列表: 告诉模型它可以使用哪些工具(如 Search, Calculator, WeatherAPI)以及这些工具的用途和输入格式。
  2. 严格的输出格式: 强制要求模型必须按照 Thought:Action:Action Input: 的固定格式输出。
  3. Few-shot 示例(少样本提示): 提供几个完整的 T-A-O 循环示例,让模型模仿这种“边想边做”的行为模式。

💡 典型 ReAct 提示词模板片段:
你是一个可以解答复杂问题的助手。你可以使用以下工具:

  • Search: 用于搜索最新信息。
  • Calculator: 用于进行数学计算。

请使用以下格式:
Question: 你必须回答的输入问题
Thought: 你应该总是思考下一步要做什么
Action: 要执行的动作,必须是 [Search, Calculator] 之一
Action Input: 动作的输入参数
Observation: 动作的结果
… (Thought/Action/Action Input/Observation 可以重复 N 次)
Thought: 我现在知道最终答案了
Final Answer: 对原始问题的最终答案

3. 支撑框架的关键要素

  1. 上下文(Context):ReAct 会维护一个历史上下文窗口,保存之前所有的“思考-行动-观察”记录。这让大模型拥有了短期记忆,知道之前发生的所有事情,从而做出正确的下一步判断。同时ReAct还需要一个较长的上下文长度,因为其会将所有上下文都保存在一个上下文窗口中。
  2. 大模型(LLM):作为ReAct的大脑,大模型的逻辑推理能力和指令遵循能力直接决定了 ReAct 的智商上限。
  3. 工具或MCP(Tool, Model Context Protocol):这是智能体与物理/数字世界交互的接口,负责完成具体的任务。工具库的丰富程度决定了智能体的能力边界。

4. 代码底层视角:它是如何跑起来的?

在 LangChain 等框架的底层代码中,ReAct 的运行涉及一个文本解析器(Parser)和执行器(Executor):

  1. LLM 生成包含 ThoughtAction 的文本。
  2. 代码框架使用正则表达式截断并解析 LLM 的输出,提取出 Action(工具名称)和 Action Input(参数)。
  3. 代码框架暂停 LLM 的生成,去本地或网络上实际执行该工具。
  4. 代码框架获取结果后,将其格式化为 Observation: xxx,追加到上下文历史中。
  5. 将更新后的长文本再次喂给 LLM,触发下一轮推理。

核心优势

  • 极高的准确性与可信度: 纯粹的语言模型容易产生“幻觉”,而 ReAct 允许模型通过外部工具(如搜索引擎、数据库 API)获取实时、精确的数据。这打破了模型预训练数据的静态限制,大幅提升了回答的事实正确性。
  • 透明的可解释性(“白盒化”决策): 在 ReAct 的运行过程中,模型的每一步 Thought(思考过程)都会被清晰地记录并输出。这使得开发者和用户能够轻易追踪 AI 的逻辑链路,知道它为什么要做某个动作,从而便于调试和建立信任。
  • 强大的动态适应与纠错能力: 传统的生成方式是一次性输出,错了就错了。而在 ReAct 中,如果某个动作(Action)返回了错误信息或无效数据,模型可以在下一步的思考(Thought)中意识到这个问题,并动态调整策略去尝试其他方法。

局限性

  • 极度依赖外部工具的稳定性: ReAct 智能体的表现上限不仅取决于大语言模型本身,还受限于它所调用的外部 API。如果接口突然报错、超时或返回了格式异常的数据,很容易导致模型陷入死循环或整个推理流程直接崩溃。
  • 上下文消耗极大(Token 成本高): 每经历一次完整的“思考-行动-观察”循环,系统都会将新产生的所有文本累积追加到上下文历史中。这不仅会消耗大量的 Token(增加 API 成本),在面对复杂任务时,还极易触发模型的上下文窗口上限(Context Limit)。
  • 运行延迟极高: 解决一个复杂问题,ReAct 往往需要进行多次 LLM 推理,并穿插多次外部网络请求。这种反复的“网络 I/O 等待”加上“模型生成时间”,导致其实际响应速度远远慢于普通的单次对话生成。

未来发展趋势

目前,LangChain、LlamaIndex 等主流框架已在底层全面支持了 ReAct。虽然 ReAct 高度符合人类的思考逻辑,但它无法根本解决上下文污染与无限膨胀的问题(即 LLM 的“Malloc/Free 难题”——只能不断写入记忆,无法释放无效上下文)。

为了解决这个痛点,业界近期演进出了 Ralph-Loop(拉尔夫循环) 框架。与 ReAct 拼命维持长上下文不同,Ralph-Loop 采取了极简的哲学:在每一次迭代行动后,主动清空 LLM 的上下文窗口

它不再让 LLM 记住长长的、容易产生幻觉的聊天历史,而是将智能体的进度和状态持久化保存在外部(如本地文件或 Git 代码提交记录中)。每次循环,模型都带着全新的、干净的上下文去审视当前的文件状态,直到任务完成。这不仅彻底解决了 ReAct 成本高昂和上下文崩溃的问题,也代表了 Agent 架构正在向更稳定、更务实的“外部状态驱动”迈进。