#作者: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 + 循环控制 + 工具集合 + 状态/记忆管理。
-
LLM(大模型)
用于:
生成 Thought(推理);
决策要不要使用工具、用哪个工具;
生成 Action 指令;
综合 Observation 得出最终回答。
典型模型:GPT-4/4o、Claude、Gemini、Llama 等。
-
工具(Tools)
工具就是 Agent 的"手脚",可以是:
Web 搜索(DuckDuckGo、Google Search API 等);
数据库查询(SQL、向量库检索等);
代码执行(Python REPL 等);
自定义业务 API(下单、查订单、调用内部微服务等)。
每个工具通常需要明确定义:
name:工具名(供模型在 Action 里引用);
description:简要描述用途(写在 Prompt 或 Schema 中,帮助模型挑选工具);
arguments schema:参数格式/类型;
function:真正的执行函数。
- Prompt 设计(ReAct Prompting)
为了让模型"按套路走",需要在 Prompt 里明确规则,例如:
说明任务角色:你是一个会"思考再行动"的智能体;
说明可用工具列表及说明;
规定输出格式(如:必须交替输出 THOUGHT: / ACTION: / OBSERVATION:,最终用 FINAL ANSWER: 结束);
举几个少量示例(few-shot examples),教它如何做一轮轮的 Thought → Action → Observation。
-
循环控制(Agent Loop)
外层由程序控制一个循环:
把当前状态(历史 Thought/Action/Observation)打包进 Prompt;
调用模型,获取下一步输出;
解析输出:
如果是 Action:执行对应工具,获取 Observation,再喂回去;
如果是 Final Answer / Finish:退出循环,返回给用户。
同时设置:
最大循环次数;
超时时间;
错误重试逻辑。
-
状态与记忆(State / Memory)
短期状态:当前任务中所有 Thought/Action/Observation 历史;
长期记忆(可选):多轮会话中"持久化"的知识,比如:
用户偏好;
历史指令结果;
知识库中的重要事实。
四、具体实现方式示例(概念到代码)
这里用伪代码+接近真实 Python 的写法说明一个最小可用 ReAct Agent:
-
定义工具
python
复制
class Tool:
def init(self, name, description, func):
self.name = name
self.description = description
self.func = funcdef 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} -
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 "未能在限制轮次内完成任务" -
Prompt 核心结构
_build_prompt 大概会包含:
-
用户问题;
历史的 Thought/Action/Observation;
-
工具说明;
结果格式要求。
例如(简化):
text
复制
你是一个会"思考并调用工具"的智能体。你的流程是:
- 先输出 THOUGHT: ... (你的思考)
- 如需要调用工具,则输出 ACTION: {"name": "tool_name", "args": {...}}
- 等待系统返回 OBSERVATION 后,再继续下一轮
- 当你已经有足够信息时,请输出 FINAL ANSWER: ... 作为最终答案
可用工具:
- search: 用于搜索互联网信息
- 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 系统的基础能力之一。