提示词工程终章:ReAct——让大模型“边想边做”的智能体革命

提示词工程终章: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 理想的智能体:思考 ↔ 行动 ↔ 观察

我们想象一个完美的助手:当被问到"特斯拉今天的股价是多少?比昨天涨了还是跌了?",它应该:

  1. 思考(Reasoning):我需要获取特斯拉今日和昨日的股价。
  2. 行动(Acting):调用股价查询工具。
  3. 观察(Observation):收到工具返回的数据。
  4. 再思考:计算涨跌幅度,组织答案。
  5. 给出最终答案

这个 "思考→行动→观察→再思考→再行动...→最终答案 " 的循环,就是 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是一个循环解析过程:

  1. 将问题、工具描述、格式要求、示例拼成初始提示词。
  2. 发送给LLM,获取生成文本。
  3. 解析生成文本,检查是否包含 ActionFinal Answer
  4. 如果是 Action,提取工具名和参数,调用相应工具,获取真实结果,将 Observation 追加到对话中。
  5. 将扩展后的对话再次发送给LLM,继续生成。
  6. 重复直到模型输出 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 协议,转载请注明出处。

相关推荐
X.AI66610 小时前
主流7个大模型测评,谁更懂代码和空间感知?
3d·prompt
花椰菜菜10 小时前
Anthropic 的最新播客,你需要了解的 Prompt Caching 的一切
aigc·agent·claude
求索实验室15 小时前
让AI真正"看见"界面:纯视觉GUI自动化编排器开源了
github·agent
夜雨深秋来15 小时前
多租户 AI Agent 平台架构设计与实践
架构·langchain·agent
东东同学15 小时前
耗时一个月,我把 Nuxt 首屏性能排障经验做成了一个 AI Skill
前端·agent
GoodTimeGGB15 小时前
🚀 2024-2026最新AI热词终极科普:按时间线读懂Agent时代完整进化
agent·mcp·openclaw·harness·hermes
OpenBayes贝式计算17 小时前
教程上新丨指令遵循 / 推理 / 编码三合一,Mistral Medium 3.5 把 Coding Agent 搬上云端
agent·ai编程·mistral.ai
OpenBayes贝式计算17 小时前
流式 3D 重建新突破!LingBot-Map 融合 Trajectory Memory 与几何上下文;12.6 万 QA 样本!
计算机视觉·开源·agent
John_ToDebug17 小时前
AGENTS.md 进阶:如何让 AI 从「被动听从」变为「主动查阅」
人工智能·ai·agent