ReAct Agent 解析:从理论到实践的高效推理框架

#作者:stackofumbrella

文章目录

  • [一、ReAct Agent 是什么(含义)](#一、ReAct Agent 是什么(含义))
  • [二、核心逻辑:Thought--Action--Observation 循环](#二、核心逻辑:Thought–Action–Observation 循环)
  • [三、ReAct Agent 的结构与组成](#三、ReAct Agent 的结构与组成)
  • 四、具体实现方式示例(概念到代码)
  • [五、与其它 Agent 模式的对比](#五、与其它 Agent 模式的对比)
  • 六、典型应用场景
  • [七、实践落地建议(如何"正确地"实现一个 ReAct Agent)](#七、实践落地建议(如何“正确地”实现一个 ReAct Agent))

一、ReAct Agent 是什么(含义)

ReAct = Reasoning + Acting(推理 + 行动)

它是一种给大模型"加大脑和手脚"的通用模式/架构,让模型不只是一次性给答案,而是可以:

  • 先思考(Reasoning / Thought):像人一样分步推理、规划下一步要干什么;
  • 再行动(Acting / Action):调用外部工具/API/数据库等去"做事";
  • 再观察(Observation):读取工具返回结果,更新理解,再继续思考和行动;
    这样循环若干次,最后输出一个有依据、有过程的最终答案。
    IBM 的定义可以简单概括为:

ReAct agent 是一种 AI Agent,它使用 ReAct 框架,把链式思维(Chain-of-Thought)推理和外部工具调用结合起来[1]。

所以,"Agent + ReAct"本质上就是:

用 ReAct 这套"思考-行动-观察"循环,把一个静态的大语言模型包装成一个可交互、可调用工具的智能体(Agent)。

二、核心逻辑:Thought--Action--Observation 循环

ReAct 的核心是非常清晰的一个循环:

输入(Input)

用户给出任务描述 / 问题;

系统把任务、历史对话、工具说明等组织成 Prompt,发给大模型。

思考(Thought / Reasoning)

模型在输出中先给出一段"内部推理文字":

THOUGHT: 为了回答用户问题,我需要先查当前汇率......

行动(Action)

模型根据推理决定要不要调用工具,如果要,就按指定格式输出一个行动指令:

ACTION: 调用 exchange_rate_tool,参数:{"from": "USD", "to": "CNY"}

框架/宿主程序解析这个 Action,真正去执行对应的函数 / API / 数据库查询。

观察(Observation)

工具执行完,返回结果(如:1 USD = 7.12 CNY);

这个结果以 OBSERVATION: 的形式再喂回给模型。

继续循环

模型再次思考(新的 Thought),可能:

再调用其他工具;

或者认为信息足够,进入"给最终答案"的阶段。

终止(Finish / Final Answer)

当模型判断任务完成时,会输出"最终答案"而不再给新的 Action;

或者到达最大循环次数,由系统强制结束。

对比:

三、ReAct Agent 的结构与组成

从工程实现角度看,一个 ReAct Agent ≈ LLM + 循环控制 + 工具集合 + 状态/记忆管理。

  1. LLM(大模型)

    用于:

    生成 Thought(推理);

    决策要不要使用工具、用哪个工具;

    生成 Action 指令;

    综合 Observation 得出最终回答。

    典型模型:GPT-4/4o、Claude、Gemini、Llama 等。

  2. 工具(Tools)

    工具就是 Agent 的"手脚",可以是:

Web 搜索(DuckDuckGo、Google Search API 等);

数据库查询(SQL、向量库检索等);

代码执行(Python REPL 等);

自定义业务 API(下单、查订单、调用内部微服务等)。

每个工具通常需要明确定义:

name:工具名(供模型在 Action 里引用);

description:简要描述用途(写在 Prompt 或 Schema 中,帮助模型挑选工具);

arguments schema:参数格式/类型;

function:真正的执行函数。

  1. Prompt 设计(ReAct Prompting)
    为了让模型"按套路走",需要在 Prompt 里明确规则,例如:

说明任务角色:你是一个会"思考再行动"的智能体;

说明可用工具列表及说明;

规定输出格式(如:必须交替输出 THOUGHT: / ACTION: / OBSERVATION:,最终用 FINAL ANSWER: 结束);

举几个少量示例(few-shot examples),教它如何做一轮轮的 Thought → Action → Observation。

  1. 循环控制(Agent Loop)

    外层由程序控制一个循环:

    把当前状态(历史 Thought/Action/Observation)打包进 Prompt;

    调用模型,获取下一步输出;

    解析输出:

    如果是 Action:执行对应工具,获取 Observation,再喂回去;

    如果是 Final Answer / Finish:退出循环,返回给用户。

    同时设置:

    最大循环次数;

    超时时间;

    错误重试逻辑。

  2. 状态与记忆(State / Memory)

    短期状态:当前任务中所有 Thought/Action/Observation 历史;

    长期记忆(可选):多轮会话中"持久化"的知识,比如:

    用户偏好;

    历史指令结果;

    知识库中的重要事实。

四、具体实现方式示例(概念到代码)

这里用伪代码+接近真实 Python 的写法说明一个最小可用 ReAct Agent:

  1. 定义工具

    python

    复制
    class Tool:
    def init(self, name, description, func):
    self.name = name
    self.description = description
    self.func = func

    def search_web(query: str) -> str:
    # 这里可以对接真实搜索 API
    return f"搜索到的结果:{query} ..."

    def calculator(expr: str) -> str:
    return str(eval(expr))

    tools = [
    Tool("search", "用来在互联网上搜索最新信息", search_web),
    Tool("calculator", "执行数学表达式计算", calculator),
    ]
    tool_map = {t.name: t for t in tools}

  2. ReAct Agent 的主循环

    python

    复制
    class ReActAgent:
    def init(self, llm, tools):
    self.llm = llm
    self.tools = {t.name: t for t in tools}

    复制代码
     def run(self, user_input, max_iters=5):
         history = []
         observation = ""
         final_answer = None
    
         for _ in range(max_iters):
             prompt = self._build_prompt(user_input, history, observation)
             llm_output = self.llm(prompt)  # 调用大模型
    
             thought, action = self._parse_llm_output(llm_output)
    
             if action is None:  # 没有新的 action,认为是最终答案
                 final_answer = self._extract_final_answer(llm_output)
                 break
    
             # 执行工具
             tool = self.tools.get(action["name"])
             if tool is None:
                 observation = f"错误:工具 {action['name']} 不存在"
             else:
                 observation = tool.func(**action["args"])
    
             # 记录历史
             history.append({"thought": thought, "action": action, "observation": observation})
    
         return final_answer or "未能在限制轮次内完成任务"
  3. Prompt 核心结构

_build_prompt 大概会包含:

  • 用户问题;

    历史的 Thought/Action/Observation;

  • 工具说明;

    结果格式要求。

    例如(简化):

text

复制

你是一个会"思考并调用工具"的智能体。你的流程是:

  1. 先输出 THOUGHT: ... (你的思考)
  2. 如需要调用工具,则输出 ACTION: {"name": "tool_name", "args": {...}}
  3. 等待系统返回 OBSERVATION 后,再继续下一轮
  4. 当你已经有足够信息时,请输出 FINAL ANSWER: ... 作为最终答案

可用工具:

  1. search: 用于搜索互联网信息
  2. calculator: 用于数学计算

历史记录:

THOUGHT: ...

ACTION: ...

OBSERVATION: ...

现在的用户问题是:{user_input}

请开始你的下一步 THOUGHT 和(可选)ACTION。

_parse_llm_output 则从模型输出中解析出 THOUGHT 和 ACTION 这两个字段;如果没有 ACTION 而出现 FINAL ANSWER 就退出。

五、与其它 Agent 模式的对比

经常会被拿来对比的是 Function Calling Agent 或"纯工具调用 Agent":

很多现代 Agent 框架会结合两者:

使用 ReAct 的 Thought 步骤规划整体策略;

在 Action 具体落地时利用函数调用机制让参数更安全、更结构化。

六、典型应用场景

ReAct Agent 在以下情况非常有用:

多跳检索和复杂研究

例如"比较 2023 年美国、欧盟、中国的新能源车销量与政策差异,并给出投资建议";

Agent:

第一步搜索各地区数据;

第二步再查政策细节;

第三步在本地做对比和计算;

最后综合出一份报告。

需要实时数据的问答/分析

如汇率、股票、天气、最新新闻;

CoT 只能"想象",ReAct 可以真实查。

DevOps / 运维 / 内部工具编排

用 ReAct Agent 调用:

GitHub API 查 issues;

CI/CD 平台 API;

云监控 API;

通过 Thought 步骤设计排障和修复流程。

企业内部流程自动化

如:

读取 CRM 信息;

检索合同 / 发票;

提交审批请求(通过 HTTP API);

ReAct 在中间产出:为什么需要哪个系统的数据 → 怎么组合。

七、实践落地建议(如何"正确地"实现一个 ReAct Agent)

从简单任务开始

  • 优先选:搜索 + 计算器 这类安全、幂等的工具;

    避免一开始就给 Agent 高权限"写操作"(删库、转账等)。

    Prompt 必须明确、示例充分

  • 清晰写明:

    • 工具列表和用途;
    • 输出格式;
    • 一到两个完整的 Thought--Action--Observation 示例;

尽量控制模型输出格式,方便解析。

设置防护栏(Guardrails)

最大循环次数;

对工具调用结果做类型校验;

对最终回答进行校对或二次验证(如再问一次"请自检你的答案是否合理,并指出可能的错误点")。

利用现成框架加速开发

复制代码
**LangChain:initialize_agent(..., agent="react") 或 create_react_agent 直接创建;
LangGraph:把 Thought、Action、Observation 各步骤做成节点,用图的形式管理控制流;
对于 PoC 或教学,完全可以自己写一个简化版 loop,更好理解内部原理。
逐步增加工具与记忆**
  • 初期:只加 1~2 个工具;
  • 稳定后:接入 RAG 检索、内部业务 API、长程记忆等,让 Agent 具备更强的上下文能力。

总结一句话

ReAct Agent = 用"思考→行动→观察"的循环,把大模型变成可以多步推理、会查外部信息、能调用各种工具的智能体。

实现上就是:用 Prompt 约束输出结构,把 Thought/Action/Observation 串在一个循环里,并在 Action 里接入你需要的 API 和工具。理解并实践这套模式,是现阶段构建复杂 Agent 系统的基础能力之一。

相关推荐
崔庆才丨静觅3 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60614 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了4 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅4 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅5 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅5 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment5 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅5 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊5 小时前
jwt介绍
前端
爱敲代码的小鱼6 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax