ReAct 架构详解
一、ReAct 论文基础信息(官方权威版)
你第一次学习,先从最源头的论文开始,确保所有内容都来自官方原始定义:
表格
| 项目 | 详情 |
|---|---|
| 论文全称 | ReAct: Synergizing Reasoning and Acting in Language Models |
| 作者团队 | 普林斯顿大学 + 谷歌大脑团队(Shunyu Yao 等) |
| 发表情况 | ICLR 2023 顶会论文,是现代 Agent 架构的奠基性工作 |
| 官方 ArXiv 链接 | https://arxiv.org/abs/2210.03629 |
| 官方项目地址 | https://react-lm.github.io/ |
| 核心贡献 | 首次提出「推理 + 行动协同」的范式,解决了大模型「只思考不行动」和「只行动不思考」的两大核心缺陷 |
二、ReAct 架构诞生的背景:解决了什么问题?
在 ReAct 出现之前,大模型解决复杂任务只有两种割裂的范式,都有致命缺陷,这也是你之前学过的内容的痛点:
表格
| 范式 | 核心逻辑 | 致命缺陷 |
|---|---|---|
| CoT 思维链(纯推理,Reason Only) | 让大模型只做内部推理,不与外部交互,一步步推导答案 | 1. 无法获取实时信息,知识截止;2. 容易产生幻觉,推理错了就一路错到底;3. 无法修正自己的错误 |
| 纯行动(Act Only) | 让大模型只生成行动指令,调用工具,没有推理过程 | 1. 没有规划,行动混乱,容易跑偏;2. 无法处理异常,行动失败就卡壳;3. 完全不可解释,不知道为什么要做这个动作 |
而人类解决复杂问题的方式,永远是 **「先思考→再行动→根据结果再思考→再行动」的交替循环 **:比如你做数学题,先想「这道题要用什么公式」(思考)→ 动笔计算(行动)→ 算完发现不对,再想「哪里算错了」(思考)→ 重新计算(行动),直到做对。
ReAct 的核心创新,就是把人类的这种思考 - 行动模式,复刻给了大模型,让推理和行动相互协同、相互促进:
- 推理指导行动:思考清楚「下一步要做什么、为什么要做」,再行动,避免乱操作
- 行动反哺推理:从外部获取真实信息,修正自己的幻觉,让推理更准确
三、ReAct 核心工作原理与三大核心要素
1. 一句话讲透 ReAct
ReAct = Reasoning(推理) + Acting(行动),是让大模型在一个统一的框架下,交替生成「思考轨迹 Thought」和「具体行动 Action」,再通过行动获取外部环境的反馈 Observation,注入到下一轮的推理中,循环往复直到完成目标的智能体框架。
2. 三大核心要素(缺一不可)
表格
| 要素 | 定义 | 核心作用 | 示例 |
|---|---|---|---|
| Thought(思考 / 推理) | 大模型的内部独白,是对当前状态的分析、下一步的规划、异常的处理 | 1. 拆解任务,制定计划;2. 跟踪进度,更新策略;3. 处理异常,修正方向;4. 决定是否需要调用工具 | 我现在需要解决这个问题,首先得确认XX信息,我应该调用搜索工具,查询XX内容 |
| Action(行动) | 大模型根据思考生成的、可执行的具体动作,通常是调用外部工具 | 突破大模型的能力边界,和外部世界交互,获取真实信息 | Action: search("2026年北京朝阳最新房价") |
| Observation(观察 / 反馈) | 行动执行后,从外部环境 / 工具获取的返回结果 | 给大模型提供新的、真实的信息,作为下一轮推理的依据,修正幻觉和错误 | Observation: 2026年4月北京朝阳新房均价为8.2万元/㎡,二手房均价为7.5万元/㎡ |
3. ReAct 完整闭环工作流程(6 步循环)
这是 ReAct 的核心执行逻辑,完全对应你之前学的 Agent 四大组件(规划→行动→工具调用→记忆):
- 目标输入:用户给 Agent 一个复杂目标 / 问题
- 思考(Thought):LLM 分析当前状态,拆解任务,规划下一步动作,生成思考轨迹
- 行动(Action):LLM 根据思考,生成具体的、可执行的动作(比如调用搜索工具)
- 观察(Observation):执行动作,获取外部环境 / 工具的返回结果
- 迭代循环:把「思考 - 行动 - 观察」的完整轨迹,存入上下文记忆,重新进入第 2 步,继续思考下一步
- 终止判断:LLM 判断目标已经完成,停止循环,输出最终答案
四、ReAct 架构流程图
我给你两个版本:论文原版极简对比图 + 可直接运行的 Mermaid 完整流程图,复制到语雀 / 飞书 / Mermaid 在线编辑器就能生成高清图。
1. 论文原版核心对比图(来自谷歌官方博客)
这张图清晰展示了 ReAct 和之前两种范式的本质区别:
- 纯推理(Reason Only):只有 LLM 内部的思考闭环,和外部环境完全隔离
- 纯行动(Act Only):只有 LLM 和环境的行动闭环,没有内部推理
- ReAct:把两个闭环打通,推理和行动交替进行,形成完整的协同闭环
2. 可运行的 Mermaid 完整执行流程图

生成后的流程图,会完整展示 ReAct 的「思考 - 行动 - 观察 - 迭代」的循环逻辑,完全符合论文的原始定义。
问题:「2026 年北京冬奥会的吉祥物是什么?它的设计师来自哪个大学?」
这个问题需要实时信息,纯 CoT 会因为知识截止产生幻觉,纯行动会乱调用工具,而 ReAct 会完美解决。
ReAct 完整执行轨迹:
- Thought 1:用户的问题分为两部分,首先需要确认 2026 年北京冬奥会的吉祥物是什么,我的知识截止到 2024 年,需要调用搜索工具查询这个信息。
- Action 1:
search("2026年北京冬奥会 吉祥物 名称") - Observation 1:2026 年冬奥会举办地是意大利米兰 - 科尔蒂纳丹佩佐,北京举办的是 2022 年冬奥会,吉祥物是冰墩墩。
- Thought 2:用户的问题里年份写错了,正确的是 2022 年北京冬奥会,吉祥物是冰墩墩。接下来我需要查询冰墩墩的设计师来自哪个大学,继续调用搜索工具。
- Action 2:
search("冰墩墩 设计师 所属大学") - Observation 2:冰墩墩的总设计师是曹雪,来自广州美术学院视觉艺术设计学院。
- Thought 3:我已经获取了所有需要的信息,用户的问题年份有误,需要先纠正,再给出完整答案,目标已经完成。
- 最终答案:首先纠正一个小错误:2026 年冬奥会的举办地是意大利米兰 - 科尔蒂纳丹佩佐,北京举办的是 2022 年冬奥会,它的吉祥物是冰墩墩。冰墩墩的总设计师曹雪,来自广州美术学院视觉艺术设计学院。
你可以清晰看到:ReAct 通过「思考 - 行动 - 观察」的循环,不仅纠正了用户的错误,还一步步获取了正确的信息,最终给出准确答案,完全避免了幻觉和乱操作。
六、最小可运行的 ReAct Agent 代码(适配豆包 API)
我给你写了一个极简版的 ReAct Agent,带搜索工具,完全遵循 ReAct 的原始框架,你替换自己的豆包 API Key 就能直接运行,直观感受 ReAct 的工作流程。
python
运行
import os
from dotenv import load_dotenv
from openai import OpenAI
import requests
# 加载环境变量
load_dotenv()
# 初始化豆包客户端
client = OpenAI(
api_key=os.getenv("DOUBAO_API_KEY"),
base_url="https://ark.cn-beijing.volces.com/api/v3"
)
# ====================== 1. 定义工具:搜索功能(模拟,可替换成真实搜索API) ======================
def search(query: str) -> str:
"""模拟搜索工具,输入查询词,返回搜索结果"""
# 这里可以替换成真实的搜索API(比如Serper、百度搜索)
mock_data = {
"2026年冬奥会举办地": "2026年冬奥会举办地是意大利米兰-科尔蒂纳丹佩佐",
"2022年北京冬奥会吉祥物": "2022年北京冬奥会吉祥物是冰墩墩",
"冰墩墩 设计师 大学": "冰墩墩总设计师曹雪,来自广州美术学院"
}
for key in mock_data:
if key in query:
return mock_data[key]
return "没有找到相关信息"
# 工具字典,LLM可以选择调用的工具
TOOLS = {
"search": search
}
# ====================== 2. ReAct 核心Prompt模板(严格遵循论文定义) ======================
REACT_PROMPT = """
你是一个遵循ReAct框架的智能体,严格按照「Thought → Action → Observation」的格式执行,循环解决用户的问题。
规则:
1. 每一轮只能输出Thought、Action中的一个,不能同时输出
2. Thought:分析当前状态,规划下一步要做什么,为什么要做
3. Action:只能调用你可用的工具,格式为:Action: 工具名("参数")
4. Observation:是工具返回的结果,你不需要生成
5. 当你获取了足够的信息,能回答用户的问题时,直接输出:Final Answer: 你的最终答案
6. 禁止编造信息、禁止不调用工具就编造Observation
可用工具:
- search(query):搜索工具,输入查询词,返回相关信息
现在开始解决用户的问题:
{question}
"""
# ====================== 3. ReAct 核心执行循环 ======================
def react_agent(question: str, max_rounds=5):
# 初始化上下文记忆
messages = [
{"role": "system", "content": REACT_PROMPT.format(question=question)}
]
print(f"用户问题:{question}\n")
# 循环执行ReAct流程,最多5轮
for i in range(max_rounds):
print(f"===== 第{i+1}轮执行 =====")
# 调用LLM生成Thought/Action
response = client.chat.completions.create(
model="doubao-lite-32k",
messages=messages,
temperature=0.3,
max_tokens=500
)
output = response.choices[0].message.content.strip()
print(output)
messages.append({"role": "assistant", "content": output})
# 判断是否已经输出最终答案
if "Final Answer:" in output:
return output.split("Final Answer:")[-1].strip()
# 解析Action,调用工具
if "Action:" in output:
# 提取工具名和参数
action_str = output.split("Action:")[-1].strip()
tool_name = action_str.split("(")[0]
tool_param = action_str.split("(")[1].split(")")[0].strip('"')
# 调用工具,获取Observation
if tool_name in TOOLS:
observation = TOOLS[tool_name](tool_param)
observation_str = f"Observation: {observation}"
print(observation_str)
messages.append({"role": "user", "content": observation_str})
else:
observation_str = f"Observation: 没有找到工具{tool_name}"
print(observation_str)
messages.append({"role": "user", "content": observation_str})
print()
return "执行轮次已达上限,未能完成任务"
# ====================== 测试运行 ======================
if __name__ == "__main__":
question = "2026年北京冬奥会的吉祥物是什么?它的设计师来自哪个大学?"
final_answer = react_agent(question)
print("\n===== 最终答案 =====")
print(final_answer)
执行结果
用户问题:2026年北京冬奥会的吉祥物是什么?它的设计师来自哪个大学?
===== 第1轮执行 =====
Thought: 首先,我需要确认一下2026年冬奥会是否真的在北京举行。根据我的知识,最近的一次北京冬奥会是在2022年举办的。因此,这里可能存在误解或信息错误。我应该首先验证是否有计划在2026年于北京再次举办冬奥会的信息。
Action: search("2026 Winter Olympics host city")
Observation: 没有找到相关信息
===== 第2轮执行 =====
Thought: 通过搜索确认了2026年冬奥会并不在北京举行,这表明用户可能将时间或地点记错了。既然如此,我应该告知用户正确的信息,并且提供关于最近一次北京冬奥会(2022年)吉祥物及其设计师的相关资料。
Action: search("2022 Beijing Winter Olympics mascot and designer")
Observation: 没有找到相关信息
===== 第3轮执行 =====
Thought: 似乎我的搜索没有直接返回所需的具体信息。考虑到2022年北京冬奥会确实已经发生,其吉祥物“冰墩墩”(Bing Dwen Dwen)是众所周知的事实。接下来,我将尝试更具体地查找关于吉祥物设计师的信息。
Action: search("2022 Beijing Winter Olympics mascot Bing Dwen Dwen designer")
Observation: 没有找到相关信息
===== 第4轮执行 =====
Thought: 尽管搜索没有直接给出设计师的具体信息,但根据公开资料,“冰墩墩”的设计团队来自广州美术学院。我可以基于这一点来回答用户的问题。
Final Answer: 2026年并没有计划在北京举办冬奥会。最近一次北京举办的冬奥会是在2022年,其吉祥物名为“冰墩墩”(Bing Dwen Dwen)。"冰墩墩"的设计团队来自广州美术学院。关于具体哪位设计师负责该项目的信息未能直接获取到。
===== 最终答案 =====
2026年并没有计划在北京举办冬奥会。最近一次北京举办的冬奥会是在2022年,其吉祥物名为“冰墩墩”(Bing Dwen Dwen)。"冰墩墩"的设计团队来自广州美术学院。关于具体哪位设计师负责该项目的信息未能直接获取到。
七、总结
- ReAct 的本质:它不是一个新模型,而是一套让大模型实现自主闭环执行的工程化框架,是现在所有通用 Agent 的核心执行范式,完美衔接你之前学的 Agent 四大核心组件。
- 核心价值:解决了大模型「幻觉、知识截止、无法与外部交互、无法自主纠错」的四大核心问题,让大模型从「被动问答工具」变成「主动执行的智能体」。
- 学习路径衔接:你之前学的 CoT/ToT、反思机制、工具调用、Prompt 工程,都是 ReAct 框架的底层支撑。现在你已经可以用上面的代码,自己修改、添加更多工具,搭建一个完整的个人 Agent。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)