ReAct智能体

ReAct 智能体

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”得出结论:任务已完成,可以输出最终答案。

1015

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. 代码解析与执行流程(系统底层视角)

在 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 等待”加上“模型生成时间”,导致其实际响应速度远远慢于普通的单次对话生成。

未来发展趋势

现在很多框架已经底层支持了ReAct,比如langchain等。虽然ReAct符合人类的思考逻辑,并且更擅长处理复杂的长期任务,但是ReAct框架无法解决上下文问题,于是人们又提出了一个Ralph-Loop框架。