跳到主内容

Agent 设计模式 ReAct 实战:让智能体边思考边行动

100%
Agent 设计模式 ReAct 实战:让智能体边思考边行动

Agent 设计模式 ReAct 的核心,就是让大模型在每一步行动前先写一段「思考」,再调用工具、读取结果、继续思考,如此往复直到得出答案——这个 Thought→Action→Observation 的循环,是目前绝大多数智能体框架(LangChain 、 LangGraph 、 Claude Agent SDK 等)默认采用的执行骨架。很多团队一上来就堆工具列表,结果智能体胡乱调用、错误层层传播,问题往往不在工具,而在缺少这套「边想边做」的结构。

ReAct 从哪来:一篇论文定义了智能体

ReAct 由姚顺雨等人在 2022 年 10 月的论文《 ReAct: Synergizing Reasoning and Acting in Language Models 》(arXiv:2210.03629,ICLR 2023)中提出。它的出发点很直接:此前推理(如 Chain-of-Thought)和行动(如计划生成)是被分开研究的,前者容易幻觉、后者缺乏反思。 ReAct 让模型交替生成「推理轨迹」和「任务动作」,推理帮助模型制定、跟踪和修正计划,行动则让它与知识库、 API 等外部环境交互获取真实信息。论文在 HotpotQA 问答和 FEVER 事实核查上显著缓解了纯 CoT 的幻觉与错误传播问题,在 ALFWorld 、 WebShop 两个交互决策基准上分别超出模仿学习基线 34% 和 10% 的绝对成功率,且只需一两个示例提示、零参数训练。

我的理解是,ReAct 真正的贡献不是某个 prompt 技巧,而是把「 LLM 智能体」的操作语义写清楚了:模型每次只能做一小步,结果由环境给出而不是模型自己编。这也是它后来成为事实标准的原因。

Thought→Action→Observation 循环怎么转

一轮完整的 ReAct 执行包含三种角色:

  • Thought(思考):模型自由生成的推理文本,外化当前信念和下一步计划,也负责在出错后自我纠正;
  • Action(行动):从预定义工具集中选择一个动作及参数,例如 search[普朗克],由外层程序解析执行——模型不能发明不存在的工具;
  • Observation(观察):工具返回的真实结果,由你的代码拼接回上下文。这是唯一可靠的事实来源,Thought 只是计划,不是事实。

当模型输出形如 finish[答案] 的动作时,循环终止。下面是一个最小 Python 伪代码,展示这个循环的工程实现:

def react_loop(question, tools, llm, max_steps=8):
    context = build_prompt(question, tools)   # 注入工具列表与格式要求
    for step in range(max_steps):
        output = llm.generate(context)
        thought, action = parse(output)        # 抽取思考与动作
        if action.name == "finish":            # 模型自认完成
            return action.input
        observation = run_tool(action)         # 真正执行工具调用
        context += f"{thought}\nAction: {action}\nObservation: {observation}"
    return "达到步数上限,中止"

这段代码里有三个工程要点:必须限制最大步数防止死循环;Observation 要截断长度避免上下文爆炸;工具执行的异常也要作为 Observation 回传,让模型自己决定重试还是换路。工具定义部分可以结合 OpenAI Function Calling 实战(OpenAI Function Calling 实战)中的 schema 写法来落地,比论文时代的正则解析稳健得多。

Agent 设计模式 ReAct 与 Plan-and-Execute 、 Reflection 的对比

ReAct 不是唯一的智能体模式,选型时可以对照下面的表格:

模式核心思路优势短板典型场景
ReAct思考与行动逐步交替可解释、可纠错、接工具自然步数多、 token 消耗大问答、检索、客服
Plan-and-Execute先一次性生成完整计划再逐步执行全局视野、减少来回往返计划失败后重规划成本高长流程任务、报告生成
Reflection执行后自我批判再改进质量上限高延迟翻倍、可能过度修改代码生成、写作打磨

实践中三者经常组合:用 Plan-and-Execute 拆任务,每个子任务内部跑 ReAct 循环,关键产出再套一层 Reflection 。当单智能体能力不够时,可以把多个 ReAct 智能体编排成团队,具体做法见多智能体怎么编排一文。

什么时候该用 ReAct,什么时候不该

根据我在实际项目中的经验,ReAct 适合与不适合的场景界限分明:

适合的场景

  • 需要查证的事实型任务:多跳问答、资料检索、事实核查,答案必须有来源;
  • 交互式决策:操作网页、调用内部 API,走一步看一步比预写脚本灵活;
  • 对可解释性有要求的场景:Thought 轨迹就是现成的审计日志,方便排查。

不适合的场景

  • 纯创作类任务(写诗、头脑风暴):不需要外部观察,套 ReAct 只是浪费 token;
  • 答案在单一文档里的检索:一个普通 RAG 流水线(参见RAG 检索增强生成)更便宜也更稳定;
  • 强实时或严格延迟预算的场景:多轮循环的延迟不可控。

另外,ReAct 能显著减少但不能消灭幻觉——Thought 本身仍是模型生成的,可能带着错误假设污染后续推理。因此工具返回的 Observation 应当尽量结构化、带元数据,并且把记忆读写(长期偏好、历史结论)从循环中拆出去单独管理,可参考AI Agent 记忆怎么实现中的分层方案。

调试 ReAct 智能体时,先打印完整的 Thought/Action/Observation 轨迹再改提示词:八成的「智能体笨」问题,其实是 Observation 被截断或工具报错没有回传,模型是在盲飞。
ReAct 经典提示词模板(LangChain 风格)
Answer the following questions as best you can. You have access to the following tools: {tools}。格式要求:每轮先输出 Thought:(思考下一步做什么),再输出 Action:(必须是工具列表中的一个)与 Action Input:,随后由系统填入 Observation:。 Thought/Action/Observation 可重复 N 次,直到你输出 Thought: I now know the final answer 以及 Final Answer:。这个模板的关键是「动作只能从列表里选」和「观察由系统注入」两条约束,缺一条循环就不可控。

ReAct 和 Function Calling 是什么关系?
两者是互补而非竞争:Function Calling 解决「模型如何结构化地表达一次工具调用」,ReAct 解决「多轮工具调用如何组织成可控循环」。现代框架普遍用 Function Calling 的 JSON 输出充当 ReAct 里的 Action 步骤,用消息回填充当 Observation 。

ReAct 需要微调模型吗?
不需要。原论文全程零参数训练,只靠提示词里的一两个示例就能驱动模型学会这套格式。现在的模型对 ReAct 格式的遵从度远高于 2022 年,直接写系统提示词即可,效果不佳时优先排查工具描述是否清晰。

怎么防止 ReAct 智能体陷入死循环?
三道保险:设置最大步数(通常 5~10 步)并设计优雅降级的兜底回复;在提示词中要求模型若连续两次 Observation 相同则改变策略;对重复调用同一工具同一参数的情况在代码层直接拦截并返回提示。

小模型也能跑 ReAct 吗?
可以但建议 7B 以上且经过指令对齐的模型,否则格式遵从度差、经常把 Observation 也自己编出来。小模型跑 ReAct 时应精简到 2~3 个工具、并在每轮强制输出前校验格式。

这篇有帮助吗?
云上的幻象
云上的幻象查看主页

七彩云博客,分享 WordPress 建站实战与 AI 工具测评,覆盖服务器运维、站长工具、软件资源与电商运营干货,专注原创实用的主题插件、网站加速与安全优化教程。

752文章4评论

相关文章

评论 (0)

欢迎你,新朋友,感谢参与互动!文明发言,理性交流 · 首次评论将在审核后展示