AIGC系列之二-"Plan-and-Execute" 一种省钱高效解决复杂任务的Agent架构设计
背景 智能体(Agent)的原理 三种Plan-and-Execute架构
01
—
背景
思考:我应该调用Search()来查看比赛的当前比分。行动:Search("X队的当前比赛比分是多少?")
观察:当前比分是24-21
…(重复N次)
02
—
智能体的原理
大模型Agents的技术,其实本质上就是写prompt,让模型仿照你的方式来进行执行的一种应用范式,prompt里面包含一些tools的描述,然后我们可以根据模型的输出使用一些外部tools(例如计算器,搜索API,数据库,程序接口,各种模型的API),能使用外部的API,知识库,只要写好prompt,智能体会调用LLM完成任务,形成用户需要的内容。一个包含Agents自主智能体的系统如上图所示,
1、用户根据prompt模版写了一个prompt,Agents调用LLM,形成一个Plan,即一个任务列表,然后Execute根据任务列表去执行。
2、执行过程根据架构分为串行和并行两种执行方式,在执行任务的同时,智能体会调用它所配置的工具能力,可能是查询数据库获取数据,然后调用LLM,也有可能是写了一段python代码,执行数据分析。工具能力是配置给智能体的,一个任务可能是单个任务,也可能是多个小的任务。
以上就是智能体的构成,它有访问LLM的能力,以及拆解执行任务的能力,以及配置的工具库,根据任务需要调用工具库执行任务。
03
—
该Agent设计 loosely基于Wang等人的“Plan-and-Solve Prompting”论文和Yohei Nakajima的BabyAGI项目,这个简单的架构代表了规划Agent架构。它由两个基本组件组成:
Planner规划器,用于提示LLM生成完成大型任务的多步计划。
Executor执行器,接受用户查询和计划中的一步,并调用1个或多个工具来完成该任务。
一旦某个字任务执行完成后,再次调用Agent,使用重新规划提示,让其决定是以响应结束还是生成后续计划(如果第一个计划没有产生预期效果)。
这种Agent设计让我们避免了每次工具调用都需要调用大型规划器LLM的情况。它仍然受到串行工具调用的限制,并且由于不支持变量赋值,每个任务仍然使用LLM。
如图上描述,针对复杂的任务(prompt),首先规划出一个任务列表,每个任务列表去调用用LLM,根据返回的结果,如果没有达到预期,再次调用Agent,使用重新规划提示,生成后续计划。这种架构对应于单一的Action agents智能体来说区别是,有了规划这个动作,可以把复杂的任务拆分成任务列表,根据任务列表,单次执行任务,而不是把一个复杂的任务直接扔给LLM执行(执行结果肯定不佳
其规划器生成一个包含交错“Plan”(推理)和“E#”行的计划列表。例如,给定用户查询“今年超级碗竞争者的四分卫的统计数据是什么”,规划器可能会生成以下计划:
计划:我需要知道今年超级碗中的队伍E1:搜索[今年超级碗的竞争对手是谁?]
计划:我需要知道每个队伍的四分卫
E2:LLM[#E1的第一个队伍的四分卫]
计划:我需要知道每个队伍的四分卫
E3:LLM[#E1的第二个队伍的四分卫]
计划:我需要查找第一个四分卫的统计数据
E4:搜索[#E2的统计数据]
计划:我需要查找第二个四分卫的统计数据
E5:搜索[#E3的统计数据]
请注意,规划器Planner可以使用类似#E2的语法引用先前的输出。这意味着它可以执行任务列表,而无需每次重新规划。
工作节点Worker循环遍历每个任务,并将任务输出分配给相应的变量。在调用后续调用时,它还会用其结果替换变量。
最后,求解器Solver将所有这些输出集成到最终答案中。
这种Agent设计可以比原始的plan-and-execute Agent更有效,因为每个任务只能具有所需的上下文(其输入和变量值)。
但是,它仍然依赖于顺序任务执行,这可能会导致运行时间较长。
LLM编译器,由Kim等人设计,是一种Agent架构,旨在进一步提高任务执行的速度,超越了上述plan-and-execute Agent和ReWOO Agent,甚至超越了OpenAI的并行工具调用。
LLM编译器具有以下主要组件:
1、Planner:流式传输任务DAG。每个任务包含一个工具、参数和依赖项列表。(DAG是有向无环图Directed Acyclic Graph的缩写)
2、Task Fetching Unit:任务获取单元安排和执行任务。它接受任务流。一旦所有任务的依赖关系得到满足,该单元就会安排任务。由于许多工具涉及到对搜索引擎或LLMs的其他调用,额外的并行性可以带来显着的速度提升(该论文声称提高了3.6倍)。
3、Joiner:基于整个图形历史(包括任务执行结果)动态重新规划或完成是一个LLM步骤,它决定是用最终答案回应还是将进度传递回(重新)规划Agent以继续工作。
这里运行时效率提升的关键思想是:
Planner输出是流式的;输出解析器能及时地产生任务所需的参数及其依赖内容。
Task Fetching Unit接收解析后的任务流并在所有依赖关系满足时安排任务。
任务参数可以是变量,这些变量是DAG中先前任务的输出。例如,模型可以调用search("${1}")来搜索由任务1的输出生成的查询。这使Agent比OpenAI的“尴尬并行”工具调用工作得更快。
总结一下通过将任务格式化为DAG,让任务可以并行处理,Agent可以节省调用工具的宝贵时间,从而带来更好的用户体验。
结论
这三种Agent架构是“plan-and-execute”设计模式的典型代表,该模式将基于LLM的“Planner”与工具执行在运行时分离。如果您的应用程序需要多次调用工具或API调用,则这些类型的方法可以减少返回最终结果所需的时间,并通过减少对更强大的LLMs的调用频率来帮助您节省成本。
欢迎加入【数据行业交流群】社群,长按以下二维码加入专业微信群,商务合作加微信备注商务合作
往期历史热门文章:
基于DataOps的数据开发治理:实现数据流程的自动化和规范化