ReAct Agent 解析
ReAct Agent 解析
摘要:ReAct 是当前 AI Agent 最核心的基础范式,几乎所有工具调用、自主决策的智能体框架(LangChain、LlamaIndex、AutoGen)底层都基于该思想。本文从设计初衷、核心原理、执行闭环、与CoT/Function Calling差异、实战代码、落地痛点全方位讲解,难度适中,适合开发者入门进阶与工程落地参考。
一、前言:为什么需要 ReAct 范式?
大语言模型(LLM)具备强大的文本理解与逻辑推理能力,但原生模型存在两个致命工程短板:
1. 知识静态化:训练数据截止后,无法获取实时信息,极易产生幻觉;
2. 无行动能力:仅能完成文本生成,无法主动调用外部工具、处理多步骤复杂任务、无法与真实世界交互。
传统的 CoT(思维链)仅能在模型内部完成逻辑拆解,属于「纯推理、无执行」的空想模式,面对需要实时数据、多步骤迭代、外部校验的场景完全乏力。
2022 年 Google 提出的 ReAct(Reasoning + Acting) 范式,完美解决了这一问题:将大模型的推理能力与外部工具执行能力结合,通过循环迭代完成复杂任务,这也是所有智能体能够自主干活的底层核心逻辑。
二、ReAct 核心原理:推理与行动双闭环
2.1 核心定义
ReAct 由两个核心能力组成:
-
Reasoning(推理思考):模型基于当前上下文判断信息是否充足、分析缺失信息、决策下一步行动方案;
-
Acting(工具行动):根据推理结果调用外部工具(搜索、计算、API、数据库等),获取真实观测数据。
区别于单次生成的大模型,ReAct 是一套可迭代、可闭环、可纠错的状态循环机制。
2.2 标准执行流程(工业级通用闭环)
所有 ReAct 智能体严格遵循 O-T-A 循环,迭代至任务终止:
Observation(观测) → Thought(推理) → Action(执行) → Observation(新观测)
-
Observation 观测:接收用户问题、历史对话、上一轮工具返回结果,整合为当前完整上下文;
-
Thought 推理:模型自主分析任务进度,判断信息是否足够,规划下一步工具调用策略;
-
Action 执行:调用指定外部工具,传入对应参数,获取真实世界数据;
-
循环迭代:工具结果作为新观测输入,重复上述流程,直至信息充足,输出最终答案并终止循环。
该流程完全模拟人类解决复杂问题的思路:审题思考→动手查证→复盘信息→得出结论。
三、关键对比:ReAct vs CoT vs Function Calling
很多开发者容易混淆三种主流能力,这里做精准工程级区分,帮大家理清落地场景差异:
3.1 CoT(思维链)
仅在模型内部完成逻辑拆解,无任何外部工具调用,全程依赖模型固有知识,适合简单数学推理、文本总结,无法解决实时性、知识性问题,极易产生幻觉。
3.2 Function Calling(函数调用)
侧重单次精准工具调用,模型解析参数、调用工具、单次返回结果,缺少自主迭代思考能力,不擅长多步骤嵌套任务,无法自主判断是否需要二次调用。
3.3 ReAct 范式
兼容函数调用能力,核心优势是自主迭代决策。模型可以根据工具返回结果,自主判断是否继续调用工具、更换工具、补充查询,天然适配多步骤复杂任务,可解释性更强,每一步思考与行动均可追溯。
落地结论:简单单工具场景用 Function Calling,简单推理场景用 CoT,复杂自动化智能体场景必须用 ReAct。
四、极简工程实战:原生 ReAct 实现(无重型框架)
为了透彻理解底层逻辑,本文不使用 LangChain、LlamaIndex 封装,手写一套轻量化、可调试、标准 ReAct 闭环代码,适配开源模型与闭源模型,可直接二次开发。
核心设计:自定义结构化 Prompt + 循环解析 + 工具调度 + 终止判断
import re
# 模拟外部工具集合
class ToolKit:
@staticmethod
def search(query: str) -> str:
"""模拟联网搜索工具"""
if "2026新能源销量" in query:
return "2026年上半年国内新能源汽车销量前三:比亚迪、特斯拉、吉利,比亚迪市占率38.7%"
return "暂无相关公开数据"
@staticmethod
def calculator(expr: str) -> str:
"""模拟计算工具"""
try:
return f"计算结果:{eval(expr)}"
except:
return "表达式错误,计算失败"
# ReAct 系统提示词(规范模型输出格式)
SYSTEM_PROMPT = """
你是具备思考与行动能力的ReAct智能体,请严格按照固定格式输出:
1. 信息充足可直接回答:输出 FinalAnswer: 你的最终答案
2. 信息不足需要工具调用:输出严格如下格式
Thought: 你的推理分析过程
Action: 工具名称【search/calculator】
ActionInput: 工具入参
禁止自由发挥格式,禁止多余输出!
"""
class SimpleReActAgent:
def __init__(self):
self.tool = ToolKit()
self.max_iter = 5 # 最大迭代次数,防止死循环
def parse_response(self, resp: str):
"""解析模型返回的思考、行动指令"""
final_pattern = r"FinalAnswer:(.*)"
thought_pattern = r"Thought:(.*?)\nAction:"
action_pattern = r"Action:(.*?)\nActionInput:"
input_pattern = r"ActionInput:(.*)"
final_res = re.search(final_pattern, resp)
if final_res:
return {"type": "final", "content": final_res.group(1).strip()}
thought = re.search(thought_pattern, resp, re.S)
action = re.search(action_pattern, resp, re.S)
input_val = re.search(input_pattern, resp, re.S)
return {
"type": "tool",
"thought": thought.group(1).strip() if thought else "",
"action": action.group(1).strip() if action else "",
"input": input_val.group(1).strip() if input_val else ""
}
def call_tool(self, action_name, input_val):
"""工具调度"""
if action_name == "search":
return self.tool.search(input_val)
elif action_name == "calculator":
return self.tool.calculator(input_val)
return "未知工具"
def run(self, user_query: str, llm_func):
"""
核心ReAct循环
:param user_query: 用户问题
:param llm_func: 大模型调用函数
:return: 最终答案
"""
context = user_query
for i in range(self.max_iter):
# 1. 模型推理决策
prompt = SYSTEM_PROMPT + f"\n用户问题:{context}"
resp = llm_func(prompt)
parse_res = self.parse_response(resp)
# 终止条件:得到最终答案
if parse_res["type"] == "final":
return parse_res["content"]
# 2. 执行工具动作
print(f"【迭代{i+1} 思考】:{parse_res['thought']}")
print(f"【执行工具】:{parse_res['action']}")
obs = self.call_tool(parse_res["action"], parse_res["input"])
print(f"【工具返回】:{obs}\n")
# 3. 更新观测,进入下一轮循环
context = f"历史问题:{user_query}\n上一轮思考:{parse_res['thought']}\n工具结果:{obs}"
return "迭代次数耗尽,任务执行终止"
五、ReAct 落地优势与工程痛点
5.1 核心优势
-
强可解释性:每一步 Thought、Action、Observation 可追溯、可日志、可调试,便于线上问题排查优化;
-
适配复杂任务:突破单次生成限制,通过多轮迭代拆解复杂目标,适配调研、计算、检索、数据分析等多场景;
-
有效降低幻觉:关键结论依赖外部工具真实数据,而非模型脑补,大幅提升答案可信度;
-
轻量化无侵入:无需复杂框架,仅通过规范 Prompt 即可实现,兼容绝大多数开源/闭源大模型。
5.2 工程落地痛点(生产必看)
-
迭代死循环风险:模型可能重复调用相同工具、无效查询,必须配置最大迭代次数做熔断防护;
-
上下文膨胀:多轮迭代后上下文过长,会导致推理变慢、成本升高,需要做上下文摘要、动态截断优化;
-
无全局规划能力:原生 ReAct 为「一步一想」,无法提前规划整体任务流程,超复杂长链路任务容易跑偏;
-
格式解析不稳定:开源模型容易输出不规范格式,需要增加正则容错、格式重试机制。
六、主流进阶优化方案
针对原生 ReAct 的短板,业界衍生出多种成熟优化方案,也是企业落地的主流选型:
-
Plan+ReAct:先全局规划完整任务步骤,再逐步骤 ReAct 执行,解决无全局视野问题;
-
ReAct+Reflection:增加自我反思环节,校验工具结果、复盘执行错误,自主重试纠错;
-
LangGraph ReAct:基于状态机管理循环,精准控制分支、终止条件,适配工业级落地;
-
多智能体 ReAct:结合角色分工,不同 Agent 独立 ReAct 迭代,协作完成超复杂任务。
七、总结
ReAct 不是一个框架、不是一个模型,而是AI 智能体最基础、最重要的执行范式。它彻底打通了大模型「推理」与「行动」的壁垒,让 AI 从「只会聊天的模型」升级为「能自主干活的智能体」。
对于开发者而言,吃透原生 ReAct 原理,是学习 LangGraph、AutoGen、CrewAI 等高级框架的核心前提。掌握这套 O-T-A 闭环逻辑,就能理解 90% 工具类智能体的底层运行机制。
更多推荐



所有评论(0)