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 系统的基础能力之一。

相关推荐
徐同保2 小时前
开发onlyoffice插件,功能是选择文本后立即通知父页面
开发语言·前端·javascript
23124_802 小时前
Base64多层嵌套解码
前端·javascript·数据库
程序员张32 小时前
Element Plus SCSS 变量覆盖用法
vue.js·前端框架·element-plus
多看书少吃饭2 小时前
文件预览的正确做法:从第三方依赖到企业级自建方案(Vue + Java 实战)
java·前端·vue.js
Amumu121382 小时前
Vue核心(一)
前端·javascript·vue.js
敲敲了个代码2 小时前
React 官方纪录片观后:核心原理解析与来龙去脉
前端·javascript·react.js·面试·架构·前端框架
运筹vivo@2 小时前
攻防世界: lottery
前端·web安全·php
一直都在5722 小时前
Spring3整合MyBatis实现增删改查操作
前端·vue.js·mybatis
小二·2 小时前
Python Web 开发进阶实战:可持续计算 —— 在 Flask + Vue 中构建碳感知应用(Carbon-Aware Computing)
前端·python·flask