-
-
[原创]ReAct Agent基本理论
-
发表于: 3天前 481
-
从提示工程到代理工程
提示词工程:指导大模型去完成单一轮次的特定需求。
代理工程:通过建立适当的框架、方法和心理模型来有效地设计整个流程。

如上图所示,整个框架强调了从赋予AI代理任务到技术实现之间的递进关系,每一层都为下一层提供支持和基础。从AI代理被赋予特定的工作(Job(s))开始,进而必须执行的操作(Action(s))以完成这些工作,再到执行这些操作所需的特定能力(Capabilities)及其所需的熟练程度(Required Level of Proficiency)。为了达到这些能力的熟练程度,代理需要依赖于各种技术和技巧(Technologies and Techniques),而这些技术和技巧又必须通过精确的编排(Orchestration)来实现有效整合。整个过程形成了一个系统,其中每个部分都是实现AI代理高效运作的关键。
设计人工智能代理做重要的是清楚地概述代理应该做什么。代理需要完成的主要工作、任务或目标是什么?这可以被视为一个高级目标,也可以分解为具体的工作和任务。
当“我”萌生了去北京旅游的想法时,按照常规的出游思路,我需要进行以下前期准备和计划:
想法1: 首先,我需要了解北京的热门景点并制定一个旅游行程。
行动1: 我会在小红书上搜索相关的旅游攻略。
观察1: 根据攻略,我制定了一个为期三天的旅游计划。接下来,我需要考虑如何到达北京,这意味着我得订购机票。
想法2: 我需要预订飞往北京的机票。
行动2: 我现在使用携程APP来订购机票。
观察2: 机票已经订好,我已经能够到达北京了。既然计划在那里停留三天,我还需要解决住宿的问题。
想法3: 接下来,我要预订酒店,以确保北京行的住宿安排。
行动3: 我在飞猪APP上搜索并预订了北京的酒店。
观察3: 酒店预订已确认。
结论: 现在所有的准备工作都已完成,我可以放心出发了。
让大模型通过提示工程的方式去自主完成:
prompt = """ 你需要在“思考、行动、观察、回答”的循环中运行。 在循环的最后,你需要输出一个答案。 使用“思考”来描述你对被问及问题的思考。 使用“行动”来执行可用的行动之一。 “观察”将是执行这些行动后的结果。 “回答”将是对观察结果的分析。 你的可用行动有: 小红书: 例如:小红书: 北京旅游攻略 通过小红书API搜索,并返回北京旅游攻略和推荐。 携程: 例如:携程: 前往北京的航班 通过携程API搜索,并找到前往北京的可用航班。 尽可能使用小红书和携程API进行查询。 示例会话: 问题: 我正计划去北京旅游,我应该先做什么? 思考: 我应该在小红书上查找关于访问北京的景点和攻略。 行动: 小红书: 北京旅游攻略 观察: 搜索返回了北京的热门旅游攻略和必游景点的列表。 回答: 首先,你可以在小红书上了解北京的必游景点和旅游攻略。接着,在携程上查找可用的前往北京的航班,并考虑住宿选择。 ....... """
代理工程,一种最简单的理解是:更加复杂的提示工程。从提示工程到代理工程的过渡体现在:不再只是提供单一的任务描述,而是明确界定代理所需承担的具体职责,详尽概述完成这些任务所需采取的操作,并清楚指定执行这些操作所必须具备的能力,形成一个高级的认知模型。
这种复杂提示行之有效的原因,源于 `ReAct` 的思想框架。
2. ReAct Agent 基本理论
ReAct 框架有两个过程,由 Reason 和 Act 结合而来。从本质上讲,这种方法的灵感来自于人类如何通过和谐地结合思维和行动来执行任务,就像我们上面“我想去北京旅游”这个真实示例一样。
首先第一部分 Reason,它基于一种推理技术——思想链(CoT), CoT是一种提示工程,通过将输入分解为多个逻辑思维步骤,帮助大语言模型执行推理并解决复杂问题。这使得大模型能够按顺序规划和解决任务的每个部分,从而更准确地获得最终结果,具体包括:
- 分解问题:当面对复杂的任务时,CoT 方法不是通过单个步骤解决它,而是将任务分解为更小的步骤,每个步骤解决不同方面的问题。
- 顺序思维:思维链中的每一步都建立在上一步的结果之上。这样,模型就能从头到尾构造出一条逻辑推理链。

但是,在 CoT 提示工程的限定下,大模型仍然会产生幻觉。因为经过长期的使用,大家发现在推理的中间阶段会产生不正确的答案或上下游的传播错误,所以,Google DeepMind 团队开发了` ReAct `的技术来弥补这一点。ReAct 采用的是 **思想-行动-观察循环**的思路,其中代理根据先前的观察进行推理以决定行动。这个迭代过程使其能够根据其行动的结果来调整和完善其方法。

在这个过程中,`Question`指的是用户请求的任务或需要解决的问题,`Thought`用来确定要采取的行动并向大模型展示如何创建/维护/调整行动计划,`Action Input`是用来让大模型与外部环境(例如搜索引擎、维基百科)的实时交互,包括具有预定义范围的API。而`Observation`阶段会观察执行操作结果的输出,重复此过程直至任务完成。
prompt = """ 您在一个由“思考、行动、观察、回答”组成的循环中运行。 在循环的最后,您输出一个答案。 使用“思考”来描述您对所提问题的思考。 使用“行动”来执行您可用的动作之一。 “观察”将是执行这些动作的结果。 “回答”将是分析“观察”结果后得出的答案。 您可用的动作包括: calculate(计算): 例如:calculate: 4 * 7 / 3 执行计算并返回数字 - 使用Python,如有必要请确保使用浮点数语法 wikipedia(维基百科): 例如:wikipedia: Django 返回从维基百科搜索的摘要 如果有机会,请始终在维基百科上查找信息。 示例会话: 问题:法国的首都是什么? 思考:我应该在维基百科上查找关于法国的信息 行动:wikipedia: France 然后您应该调用适当的动作,并从结果中确定答案 您然后输出: 回答:法国的首都是巴黎 """
如上示例所示:在ReAct框架下的代理工程描述中,明确的是**代理的任务和执行过程。面对不同的场景,其实我们只需要改变的是:1. 代理的身份设定 2. 代理完成任务所需要的工具。代理的身份通常通过system角色来定义,而所需的工具及其应用则是上一节课中我们重点讨论的Function Calling中,关于外部工具的定义和使用方法。。只不过,在代理框架下这些工具的应用方法需要进行适当的调整以适应不同的需求。
赞赏
- [原创]ReAct Agent基本理论 482
- 《汇编语言》笔记-寄存器 2422
- 计算机组成原理 指令寻址 4142