ReAct 是用于构建 AI 智能体的概念框架
ReAct 是用于构建 AI 智能体的概念框架。这类智能体能够以结构化且具备适应性的方式与环境交互,它将大语言模型作为智能体的 “大脑”,协调从简单的 检索增强生成(RAG)到复杂的多智能体工作流等各类任务。
与传统人工智能(AI)系统不同,ReAct 智能体不会将决策制定与任务执行分离开来。因此,ReAct 范式的出现是 生成式 AI(gen AI)发展过程中的重要一步,它突破了单纯的对话式 聊天机器人,走向复杂问题求解。
ReAct 智能体及其衍生方法持续为各类 AI 应用提供支撑,使应用能够自主规划、执行任务并应对突发情况。
ReAct 智能体是如何工作的?
ReAct 框架的灵感来源于人类能够凭借直觉使用自然语言(通常依靠内心独白)分步规划和执行复杂任务的方式。ReAct 智能体不会采用基于规则或其他预定义的工作流,而是依托大语言模型的推理能力,根据新信息或者前序步骤的结果动态调整处理方案。
试想为短途旅行收拾行李这个场景:
- ➡️ 你首先会明确核心考量(“目的地的天气会怎么样?”)
- ➡️ 接着主动查阅外部信息(“我去查一下当地天气预报”)
- ➡️ 借助获取到的新信息(“天气会很冷”)
- ➡️ 你确定下一个需要思考的问题(“我有哪些保暖衣物?”)以及对应的行动(“我去翻一下衣柜”)
- ➡️ 完成这个行动后,你可能遇到意料之外的状况(“我所有的保暖衣服都收进储物间了”),并据此调整下一步计划(“哪些衣服可以叠穿?”)。
与之类似,ReAct 框架通过提示词工程,将 AI 智能体的行为构建成一套固定模式:思考、行动、观察交替进行。 语言化的思维链推理步骤(思考)帮助模型把大型任务拆解为更容易处理的子任务。
预定义的行动能够让模型调用工具、发起应用程序接口(API)调用,并从外部数据源(例如搜索引擎)或者知识库(例如内部文档库)收集更多信息。 执行行动之后,模型会重新评估任务进展,并利用本次观察结果,要么输出最终答案,要么指导下一轮思考。理想情况下,观察环节还可以参考历史信息,这些信息既可以来自模型原有上下文窗口的前文内容,也可以取自外部记忆组件。 由于 ReAct 智能体的效果高度依赖其核心大语言模型,能否通过 “语言思考” 处理复杂任务,因此能力强大、具备优秀推理能力与指令遵循能力的模型,可以显著提升 ReAct 智能体的表现。
为降低成本与延迟,多智能体 ReAct 框架一般以规模更大、性能更强的模型作为核心智能体;该核心智能体在推理或执行动作时,可以把子任务委派给由更小、效率更高的模型搭建而成的其他智能体。
ReAct 智能体循环
何时以及如何终止推理循环是设计 ReAct 智能体时需要重点考量的问题。设定最大循环迭代次数是限制延迟、成本与令牌消耗量,并规避无限循环风险的一种简便方式。
与之相对,也可设置在满足特定条件时终止循环,例如当模型识别出置信度超过特定阈值的潜在最终答案时。为实现这类推理与行动循环,ReAct 智能体通常会采用某种形式的ReAct 提示词技术,既可以写在给大语言模型的系统提示词中,也可以直接置于用户查询的上下文内。
ReAct 提示词
ReAct 提示词用于引导大语言模型遵循由思考、行动和观察循环构成的 ReAct 范式。虽然构建 ReAct 智能体并不强制要求显式使用传统 ReAct 提示方法,但绝大多数基于 ReAct 的智能体都采用了该方法,或至少直接借鉴其思路。
ReAct 提示最早在 ReAct 原始论文中提出,它的核心作用是指示大语言模型遵循 ReAct 循环,并指定处理用户查询时可以使用哪些工具 —— 也就是可以执行哪些行动。
无论是通过显式指令还是加入少样本示例,ReAct 提示都需要实现以下功能:
- 引导模型使用思维链推理:提示模型逐步思考来完成任务,将思考过程与行动穿插进行。
- 定义行动:设定模型可用的具体行动。行动可以是生成特定类型的后续思考或子提示,但通常包含调用外部工具或发起 API 调用。
- 指示模型执行观察:提示模型在每一步行动之后重新评估上下文,并利用更新后的上下文支撑下一步推理。
- 循环执行:指示模型在必要时重复上述步骤。你可以设置循环终止的特定条件,例如最大循环次数,或是指示智能体在认为得到正确最终结果时结束推理过程。
- 输出最终答案:一旦满足终止条件,就针对用户最初的查询给出最终结果。和许多大语言模型应用场景一样,作为在输出最终结果前执行思维链推理的推理模型,ReAct 智能体通常会被提示在 “临时草稿区” 内完成推理过程。
ReAct 提示词的案例(推荐使用英文、一般英文的 token 占用更少)
尽可能回答下列问题。你可以使用以下工具:
Wikipedia:维基百科封装工具。适用于回答关于人物、地点、企业、事实、历史事件或其他主题的一般性问题。输入内容应为搜索查询。
duckduckgo_search:DuckDuckGo搜索封装工具。适用于回答与时事相关的问题。输入内容应为搜索查询。
Calculator:适用于解答数学相关问题。
请使用如下格式:
Question:你需要回答的输入问题
Thought:你需要始终思考下一步要做什么
Action:要执行的操作,只能是 [Wikipedia, duckduckgo_search, Calculator] 中的一项
Action Input:该操作对应的输入内容
Observation:操作返回的结果
……(该 Thought/Action/Action Input/Observation 流程可重复N次)
Thought:我现在知道最终答案了
Final Answer:原始输入问题的最终答案
开始!
Question:{input}
Thought:{agent_scratchpad}
ReAct智能体的优势
ReAct框架的推出是大语言模型驱动的智能体工作流发展进程中的重要一步。无论是通过检索增强生成(RAG)让大语言模型依托实时、真实的外部信息,还是推动后续的技术突破(例如催生现代推理模型的Reflexion),ReAct都推动大语言模型应用拓展到文本生成之外的众多任务场景。
ReAct智能体的实用性很大程度上源于ReAct框架本身具备的一些固有特性:
通用性:可以对ReAct智能体进行配置,使其对接种类丰富的外部工具与应用程序接口(API)。尽管对相关ReAct提示词(搭配对应工具)进行微调能够提升性能,但执行工具调用并不需要预先对模型做配置。
适应性:这种通用性,加上它会根据场景动态判断调用合适工具或API的特性,意味着ReAct智能体能够借助推理过程应对全新挑战。尤其是在长上下文窗口下运行,或是接入外部记忆时,它可以从过往的成功与失误中学习,处理意料之外的障碍与场景,让ReAct智能体具备灵活稳定的特点。
可解释性:ReAct智能体用语言表达出来的推理过程清晰易懂,便于调试,也降低了搭建和优化的门槛,对使用者更加友好。
准确性:正如ReAct原始论文所述,仅依靠思维链(CoT)推理虽然能为大语言模型带来诸多好处,但也会增加幻觉风险。ReAct将思维链与外部信息源访问能力相结合,大幅减少幻觉问题,让ReAct智能体的输出更加准确可靠。
参考:
厘清 ReAct 的循环机制与提示词写法,适合想搭建工具调用型智能体的开发者快速入门,可直接指导多智能体分工与循环终止设计。