提示词工程终章:ReAct------让大模型"边想边做"的智能体革命
作者:书到用时方恨少!
发布日期:2026年5月10日
阅读时长:约24分钟
📌 写在前面
大家好,我是"书到用时方恨少!"。前面两期我们构建了提示词工程的完整认知:从入门时的角色扮演与少样本,到进阶时用思维链、链式提示和自我一致性让模型"深思熟虑"。但不知道你有没有这种感觉------这些方法再强,模型还是只能生成文本,一旦需要查资料、算数值、调工具,它就哑火了。
真正的智能不应该只停留在"脑内的语言体操",更应该能动手做事 。所以今天,我们迎来了这个系列的终章,也是目前大模型应用最前沿的模式------ReAct(Reasoning + Acting)。它让模型化身一个能思考、能行动、能根据观察调整策略的自主智能体。我会从为什么我们需要ReAct讲起,带你把思维链、行动、观察串成完美闭环,再用一个能搜索并总结新闻的实战案例收尾。读完这篇,你就能理解当下爆火的 AI Agent 的底层逻辑。
1. 🤔 为什么需要 ReAct?------ 当思考不足以解决问题
1.1 思维链的边界:闭卷考试的困境
思维链(Chain of Thought)教会了模型一步步推理,但它有一个致命的局限:模型只能依赖自己训练时学到的知识。而世界是动态的,知识有截止日期,很多问题需要最新数据或外部计算才能回答。
比如你问:"2026年奥斯卡最佳影片的导演是谁?" 如果模型的训练数据截止到2025年,即使它推理能力再强,也只能老实回答"我不知道"或者更糟------开始编造事实。这就是大模型的"幻觉"温床。
1.2 链式提示的局限:缺乏动态闭环
链式提示(Prompt Chaining)将任务拆成了多个阶段,但它是静态流水线:步骤之间的数据流是预设的,无法根据中间结果动态调整下一步做什么。如果中间某步需要查询外部知识,你必须在代码里手动插入API调用,无法让模型自主决策"我现在该去搜索"。
1.3 理想的智能体:思考 ↔ 行动 ↔ 观察
我们想象一个完美的助手:当被问到"特斯拉今天的股价是多少?比昨天涨了还是跌了?",它应该:
- 思考(Reasoning):我需要获取特斯拉今日和昨日的股价。
- 行动(Acting):调用股价查询工具。
- 观察(Observation):收到工具返回的数据。
- 再思考:计算涨跌幅度,组织答案。
- 给出最终答案。
这个 "思考→行动→观察→再思考→再行动...→最终答案 " 的循环,就是 ReAct 的精髓。它融合了思维链的推理能力与工具使用能力,让模型从"知道什么就说什么"升级为"需要什么就去查什么"。
2. 🔄 ReAct 是什么?
2.1 定义与起源
ReAct (Reasoning and Acting)是由 Google Research 在 2022 年提出的一种提示范式 ,它交替生成推理步骤 和任务特定的行动 ,并将行动产生的观察结果作为上下文继续推理,从而解决需要多步交互和外部知识的复杂任务。
简单说:ReAct = 思维链(Reasoning) + 工具调用(Acting) + 观察反馈(Observation)
2.2 工作流程示意
[问题]
↓
[思考1] 我需要先知道X
↓
[行动1] 查询(X) → [观察1] 结果:...
↓
[思考2] 根据观察,我还需要Y
↓
[行动2] 计算(Y) → [观察2] 结果:...
↓
[思考3] 现在我有足够信息,可以给出答案
↓
[最终答案]
每一次行动都是模型自主决策的,观察结果直接反馈到下一轮推理中,形成了智能体与环境的交互闭环。
2.3 与其他技术的对比
| 技术 | 核心能力 | 与外界交互 | 适用场景 |
|---|---|---|---|
| 思维链 (CoT) | 生成推理步骤 | 无 | 纯推理任务(数学、逻辑) |
| 链式提示 | 分解任务,多步流水线 | 可预定义工具 | 多阶段文本处理 |
| 自我一致性 | 多次采样投票提升准确率 | 无 | 有明确答案的推理任务 |
| ReAct | 推理 + 行动 + 观察 动态循环 | 自主调用工具 | 需要外部知识或复杂交互的任务 |
ReAct 不是替代前几种技术,而是在它们的基础上加入了行动维度。你完全可以为ReAct的推理步骤加上自我一致性投票,也可以用链式提示来组织多个ReAct会话。
3. 🧠 ReAct 的核心原理:思考-行动-观察循环
3.1 提示词模板:定义智能体的行为模式
要在普通大模型上实现ReAct,关键在于构造一个包含循环格式的少样本提示词。通常会定义以下几个关键标签:
- Thought(思考):此时此刻的推理和计划。通俗说就是模型的自言自语,比如:"我需要搜索2026年奥斯卡获奖影片,然后找到其导演姓名。"
- Action(行动) :要执行的具体操作,通常包含操作名和参数。例如:
Search[2026年奥斯卡最佳影片] - Observation(观察):行动执行后从外部环境(工具)返回的结果。在提示词示例中会展示这些观察结果是从哪里来的,真实环境中则由程序实际调用工具后填入。
示例模板如下:
回答以下问题。你可以使用以下工具:
- Search[query]:搜索互联网
- Calculate[expression]:计算数学表达式
请按以下格式交替进行思考和行动:
Thought: [你的推理]
Action: [工具名][参数]
Observation: [工具返回结果]
... (重复)
Thought: 我现在有了足够信息
Final Answer: [最终答案]
示例:
问题:2024年F1冠军的年龄是多少?
Thought: 我需要知道2024年F1冠军是谁,以及他的出生日期。
Action: Search[2024年F1世界冠军]
Observation: 马克斯·维斯塔潘在2024年赢得了F1世界冠军。
Thought: 现在需要维斯塔潘的出生日期。
Action: Search[马克斯·维斯塔潘出生日期]
Observation: 维斯塔潘出生于1997年9月30日。
Thought: 当前年份2026年,他2026-1997=29岁(到9月才满29,但现在应该是28或29,具体计算)。
Action: Calculate[2026-1997]
Observation: 29
Thought: 维斯塔潘在2026年是29岁。
Final Answer: 29岁。
现在请回答:特斯拉的市值是多少亿美元?
模型看到这样的示例,就会理解整个循环模式。当它生成 Action: Search[特斯拉市值] 时,程序需要截获这行,实际调用搜索引擎API,将结果以 Observation: ... 的形式拼接回对话历史,然后让模型继续生成下一个Thought。
3.2 实现ReAct的工程逻辑
实际编码时,ReAct是一个循环解析过程:
- 将问题、工具描述、格式要求、示例拼成初始提示词。
- 发送给LLM,获取生成文本。
- 解析生成文本,检查是否包含
Action或Final Answer。 - 如果是
Action,提取工具名和参数,调用相应工具,获取真实结果,将Observation追加到对话中。 - 将扩展后的对话再次发送给LLM,继续生成。
- 重复直到模型输出
Final Answer或达到最大迭代次数。
这就是一个基本的Agent循环。许多框架(如LangChain的AgentExecutor、AutoGPT等)都在这个核心理念上扩展了更多工具和记忆功能。
3.3 为什么ReAct能减少幻觉?
幻觉通常发生在模型被迫"脑补"信息时。ReAct将外部知识检索直接整合进推理链,模型可以在不确定时主动调用可信工具验证。同时,观察结果作为强有力的上下文,会锚定模型的后续推理,使其更贴近事实。实验表明,ReAct在知识密集型任务上的准确率远高于纯思维链。
4. 🧪 实战:构建一个"联网搜索 + 计算"的智能问答助手
让我们模拟一个支持搜索和计算的ReAct助手。为简化,我们将用伪代码展示核心逻辑,但保留了真实的ReAct模式。
4.1 工具定义
我们提供两个工具:
- Search(query):模拟搜索,返回一段包含关键词的摘要。
- Calculate(expression):用Python的eval安全计算表达式。
4.2 提示词构造
python
REACT_PROMPT = """
你是一个能够使用工具的智能助手。可用工具:
- Search[query]:搜索互联网获取信息
- Calculate[expression]:计算数学表达式
请严格按照以下格式,交替进行思考(Thought)和行动(Action),行动后会收到Observation:
Thought: 你的推理和下一步计划
Action: 工具名[参数]
Observation: 工具返回结果
...(可重复)
Thought: 我有了足够信息
Final Answer: 最终答案
示例:
问题:2024年奥运会在哪个城市举行?该城市人口多少?
Thought: 需要知道2024年奥运会举办城市,然后查人口。
Action: Search[2024年奥运会举办城市]
Observation: 2024年夏季奥运会在法国巴黎举行。
Thought: 巴黎是举办城市,现在搜巴黎人口。
Action: Search[巴黎人口2024]
Observation: 巴黎人口约为216万(2024年估计)。
Thought: 我有了所需信息。
Final Answer: 2024年奥运会在巴黎举行,巴黎人口约216万。
问题:{question}
"""
4.3 循环执行器
python
import re
class ReactAgent:
def __init__(self, model_call):
self.model_call = model_call
self.max_steps = 10
def run(self, question):
prompt = REACT_PROMPT.format(question=question)
context = prompt
for step in range(self.max_steps):
response = self.model_call(context) # 调用LLM
# 提取Final Answer
final_match = re.search(r'Final Answer:\s*(.*)', response, re.DOTALL)
if final_match:
return final_match.group(1).strip()
# 提取Action
action_match = re.search(r'Action:\s*(.*?)\[(.*)\]', response)
if action_match:
tool_name = action_match.group(1).strip()
tool_input = action_match.group(2).strip()
# 执行工具
if tool_name == 'Search':
obs = self.search(tool_input)
elif tool_name == 'Calculate':
obs = self.calculate(tool_input)
else:
obs = f"未知工具: {tool_name}"
# 追加观察结果到对话
context += f"\nObservation: {obs}\n"
else:
# 如果没有Action也没有Final Answer,提示继续
context += "\nObservation: 请继续按格式生成Thought和Action。\n"
return "达到最大步数限制,未能给出最终答案。"
def search(self, query):
# 模拟搜索函数(实际可调用搜索引擎API)
mock_db = {
"特斯拉市值": "截至2026年5月,特斯拉市值约为8000亿美元。",
"OpenAI CEO": "OpenAI的CEO是山姆·奥尔特曼。",
}
return mock_db.get(query, f"未找到关于'{query}'的信息。")
def calculate(self, expression):
try:
# 安全计算:只允许数字和基本运算符
allowed = set("0123456789+-*/(). ")
if not all(c in allowed for c in expression):
return "表达式包含非法字符"
return str(eval(expression))
except Exception as e:
return f"计算错误: {e}"
4.4 执行演示
假设用户问:"特斯拉市值8000亿,如果再涨20%是多少?"
python
agent = ReactAgent(model_call=your_llm_function)
result = agent.run("特斯拉现在市值大约8000亿美元,如果再涨20%是多少?")
print(result)
可能的推理过程:
Thought: 我需要计算8000亿增长20%后的值。
Action: Calculate[8000 * 1.20]
Observation: 9600.0
Thought: 计算结果出来了。
Final Answer: 特斯拉市值增长20%后约为9600亿美元。
如果用户问的是需要搜索的问题,如"山姆·奥尔特曼是哪个公司的CEO,公司有多少员工?",它会先Search OpenAI CEO,然后Search OpenAI员工数,逐步获得最终答案。
5. 🧰 ReAct的工程化生态与应用
在实际项目中,从头实现ReAct循环并不复杂,但已有成熟框架提供了更丰富的工具集成、记忆管理、错误处理等。
5.1 LangChain中的Agent
LangChain 将 ReAct 模式具体化为 AgentExecutor,支持定义多种工具,并内置了 ReAct 风格的提示模板。你只需编写工具函数并注册,框架会自动处理循环和解析。
python
from langchain.agents import load_tools, initialize_agent, AgentType
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("2025年诺贝尔文学奖得主出生于哪一年?")
5.2 AutoGPT、BabyAGI等自主智能体
这些项目将 ReAct 循环进一步扩展为目标驱动的自主任务执行:给定一个总体目标,智能体自主分解任务、生成Todo列表、逐步执行并观察结果,不断调整计划直至完成。这背后依然是思考-行动-观察的循环。
5.3 ReAct的局限与挑战
- 循环控制:模型可能陷入无限循环,反复调用工具而无法收敛。需要设最大步数或循环检测。
- 工具选择偏差:模型有时会选择错误的工具或错误地格式化工具参数,导致观察结果无意义。
- 上下文窗口:多轮循环会迅速消耗Token,长对话可能超出窗口限制。
- 成本:多次API调用以及搜索/计算工具的调用都会增加延迟和费用。
- 安全性:如果工具允许执行代码或数据库操作,必须严格限制权限,防止注入攻击。
6. 🎯 总结与系列回顾
今天我们揭示了让大模型从"纸上谈兵"走向"真刀真枪"的 ReAct 模式:
- ✅ ReAct的动机:弥补思维链的闭卷局限和链式提示的静态缺陷,让模型能动用外部工具。
- ✅ 核心循环:思考(推理) → 行动(工具调用) → 观察(工具结果) 交替进行,直至给出最终答案。
- ✅ 实现方式:通过特殊格式的少样本提示定义行为模式,配合程序解析执行工具调用。
- ✅ 实战案例:用伪代码构建了一个支持搜索和计算的ReAct智能体。
- ✅ 工程化前景:LangChain等框架封装了此模式,AutoGPT等自主智能体更是其延伸。同时我们也讨论了局限性与挑战。
至此,提示词工程系列三篇全部完结。让我们快速回顾:
| 篇目 | 内容 |
|---|---|
| 入门篇 | 角色划分、五个核心原则、零样本与少样本 |
| 进阶篇 | 思维链(CoT)、链式提示、自我一致性 |
| 本篇(终章) | ReAct:推理与行动融合的智能体范式 |
从写一个清晰的指令,到教模型一步一步推演,再到让它自己决定去查资料、算算术,我们走过了与AI沟通能力不断升级的过程。掌握了这些,你就能理解当前几乎所有高级AIGC应用的底层魔法,也有能力去设计和优化自己的智能应用。
我是书到用时方恨少!,感谢你三期的陪伴。如果这个系列对你有所帮助,欢迎点赞、收藏、转发,让更多人告别"AI随机玄学"。未来我还会带来更多AI/编程干货,期待与你在下一个专题相遇。🚀
本文采用 CC BY-NC-SA 4.0 协议,转载请注明出处。