AI Agent 的设计模式多种多样,但 ReAct 无疑是其中最核心、最经典的一种。简单来说,ReAct 就是让大模型学会“边想边做”——先进行推理,再采取行动,并根据行动结果继续推理,如此循环往复,直到完成任务。
我第一次接触这个概念时,还误以为它和前端框架 React 有什么关系。深入了解后才发现,这是让大模型从“聊天机器”升级为“实干助手”的关键方法论。其核心思想非常直观:像侦探破案一样,观察线索 → 思考分析 → 行动获取新信息 → 再观察思考,形成一个自主迭代的闭环。
与传统的一问一答模式不同,ReAct 要求模型在任务执行中不断地暂停并自省:“我当前掌握了什么信息?下一步应该做什么?该调用哪个工具?” 想清楚之后再去执行,执行完成后将结果纳入考量,继续下一轮思考。这就将 AI 从被动应答者,转变为了能主动规划并执行复杂任务的智能体。
ReAct 是什么?核心工作循环
先通过一张图来直观理解 ReAct 的工作机制:

如图所示,ReAct 的核心是一个由三个环节构成的循环:思考 (Thought) → 行动 (Action) → 观察 (Observation),然后回到思考,周而复始。
- 思考 (Thought):模型分析当前状况(包括用户问题、历史对话、工具返回结果等),决定下一步需要做什么。
- 行动 (Action):根据思考结论,选择并调用一个外部工具(如搜索引擎、计算器、数据库查询等),并传入相应参数。
- 观察 (Observation):获取工具执行后的结果,这个结果将成为下一轮思考的输入。
我们用一个具体例子来模拟这个过程。假设用户提问:“特斯拉股价乘以10是多少?”
一个遵循 ReAct 模式的 AI Agent 处理流程可能如下:
- Thought:我需要计算特斯拉股价乘以10,但我不知道当前股价,所以我得先查询特斯拉的股价。
- Action:调用
search 工具,参数为“特斯拉当前股价”。
- Observation:工具返回:“当前特斯拉股价为 250 美元”。
- Thought:现在我拿到了股价,250 乘以 10 等于 2500。
- Action:调用
calculator 工具,参数为“250*10”。
- Observation:工具返回计算结果:“2500”。
- Thought:我已经计算出答案,可以回复用户了。
- Action:输出最终答案给用户:“答案是 2500 美元”。
这个过程模拟了一个有逻辑、有步骤的问题解决者,避免了盲目猜测,通过“计划-执行-反馈”的循环可靠地达成目标。
如何实现一个简单的 ReAct Agent?
理解了原理,我们动手实现一个基础版本的 ReAct Agent,这将帮助你更透彻地掌握其内在逻辑。
核心逻辑骨架
首先,我们勾勒出最简化的程序结构:
class ReActAgent:
def __init__(self, llm, tools):
self.llm = llm # 大语言模型
self.tools = tools # 可用的工具字典
self.memory = [] # 对话记忆
def run(self, query):
self.memory = [{"role": "user", "content": query}]
while True: # 开始思考-行动循环
# 1. 让模型思考下一步
response = self.llm.chat(self.memory)
# 如果模型输出了最终答案,则任务结束
if "final_answer" in response:
return response["final_answer"]
# 如果需要调用工具
if "action" in response:
tool_name = response["action"]["name"]
tool_input = response["action"]["input"]
# 2. 执行工具
result = self.tools[tool_name].run(tool_input)
# 3. 将观察结果记录到记忆,供下一轮思考使用
self.memory.append({
"role": "observation",
"content": result
})
可以看到,核心就是一个 while 循环,不断驱动“思考 → 行动 → 观察”的流程,直到模型宣布任务完成。
提示词设计的关键
ReAct 能否顺利运行,高度依赖于给模型的 系统提示词 (System Prompt) 。提示词需要明确约束模型的输出格式和行为逻辑。以下是一个有效的模板:
你是一个ReAct智能助手。请严格按照“思考→行动→观察”的循环来解决问题。
每次响应只输出以下两种格式之一:
格式A(需要调用工具时):
Thought: [分析当前状况,说明下一步计划]
Action: [工具名]
Action Input: [工具参数]
格式B(可以给出最终答案时):
Thought: [总结思考过程]
Final Answer: [给用户的最终答案]
可用工具:
- search(query): 用于搜索信息。
- calculator(expression): 用于数学计算。
- read_file(path): 用于读取文件内容。
清晰的结构化提示词是引导模型进行可控规划的关键。最初尝试时,如果格式约束不足,模型输出会非常随意,难以解析。
完整可运行的实战示例
下面是一个使用 OpenAI API 实现的完整 ReAct Agent 示例,其架构思想可参考下图:

import json
from openai import OpenAI
client = OpenAI()
# 定义工具集
class Tools:
@staticmethod
def search(query):
# 模拟搜索功能
mock_db = {
“特斯拉股价”: “当前特斯拉股价 250 美元”,
“马斯克”: “埃隆·马斯克是 Tesla、SpaceX 创始人”,
“openai”: “OpenAI 是 ChatGPT 的开发商”
}
return mock_db.get(query, f“没有找到关于:{query} 的信息”)
@staticmethod
def calculate(expression):
try:
return str(eval(expression))
except:
return “计算出错”
# ReAct 智能体核心逻辑
def react_agent(user_query, max_iterations=5):
tools = Tools()
# 系统提示词 - 这是灵魂所在
system_prompt = “”“你是一个 ReAct 智能助手。
按照 “思考 → 行动 → 观察” 的循环来解决问题。
每次只输出三个阶段的内容,格式如下:
Thought: [你现在掌握什么信息?还需要什么?打算怎么做?]
Action: [要调用的工具名]
Action Input: [传给工具的参数]
当信息足够回答用户问题时,输出:
Thought: [思考过程]
Final Answer: [给用户的最终回答]
可用工具:
- search(query): 搜索信息
- calculate(expression): 数学计算
”“”
messages = [
{“role”: “system”, “content”: system_prompt},
{“role”: “user”, “content”: user_query}
]
for i in range(max_iterations): # 防止死循环
# 调用大模型进行“思考”
response = client.chat.completions.create(
model=“gpt-4”,
messages=messages
)
content = response.choices[0].message.content
print(f“\n=== 第 {i+1} 轮 ===“)
print(content)
# 检查是否输出了最终答案
if “Final Answer:” in content:
return content.split(“Final Answer:”)[1].strip()
# 解析模型输出的工具调用指令
if “Action:” in content and “Action Input:” in content:
action = content.split(“Action:”)[1].split(“\n”)[0].strip()
action_input = content.split(“Action Input:”)[1].strip()
# 执行对应的工具,获取“观察”结果
if action == “search”:
observation = tools.search(action_input)
elif action == “calculate”:
observation = tools.calculate(action_input)
else:
observation = “未知工具”
# 将本轮模型的输出和工具观察结果加入对话历史
messages.append({“role”: “assistant”, “content”: content})
messages.append({
“role”: “user”,
“content”: f“Observation: {observation}”
})
else:
# 如果输出格式不符合预期,跳出循环
break
return “达到最大循环次数,未找到答案”
# 测试智能体
query = “特斯拉股价乘以10是多少?”
result = react_agent(query)
print(f“\n✅ 最终答案: {result}”)
运行这段代码,你将清晰看到大模型逐步推理、调用工具、整合信息并最终给出答案的全过程。在实践中有几个关键点需要注意:
- 设置最大迭代次数:必须防止在复杂或无法解决的任务上陷入无限循环。
- 严格约束输出格式:提示词必须明确要求模型以可解析的格式(如 Thought/Action/Observation)输出,这是程序能自动处理的前提。
- 工具返回结果需清晰:工具的执行结果应当简洁、明确,模糊的返回会导致模型在下一轮思考中困惑。
关于 ReAct 的几个重要知识点
- 与 React 框架无关:ReAct 代表 Reasoning + Acting,是 AI Agent 的一种范式,与前端框架 React 仅是命名相似。
- 源自 Google Research:ReAct 模式于 2022 年由 Google Research 在论文《ReAct: Synergizing Reasoning and Acting in Language Models》中正式提出。
- LangChain 的默认代理模式:如果你使用过 LangChain 框架,其
AgentExecutor 的默认实现就是基于 ReAct 模式构建的,这充分体现了其基础性和重要性。
- 常与 Function Calling 结合:现代实践中,更倾向于利用大模型的原生函数调用(Function Calling)能力来输出结构化的工具调用请求,这比解析纯文本格式更稳定、高效。
- 并非唯一模式:ReAct 是主流模式之一,其他还有如 Reflexion(强调自我反思)、Plan-and-Solve(先制定详细计划再执行)等,应根据具体任务场景选择。
掌握 ReAct 是深入理解 AI Agent 运作机制的关键一步。它揭示了大模型如何通过与外部环境的交互来扩展能力边界。希望本篇结合原理与实战的讲解,能为你构建更智能的应用打下坚实基础。如果你想查看更多 AI 或系统架构相关的深度 技术文档 与讨论,欢迎访问云栈社区。