这篇文章是2023年发表在arxiv上的有关Agent系统的文章,就是那个大名鼎鼎的 Microsoft AutoGen
,是想要做Agent系统架构的人必读论文,因为这是少见的能把多Agent调教到稳定的开源框架,并且还在一直更新,很多agent架构其实都是在抄作业,但真正实现相同功能的仍然是少数。还是那句话:“你可以说微软坏,但不能说微软菜”。有关AutoGen的教程也可以看我的另外一个专栏系列:
写在最前面
为了方便你的阅读,以下几点的注意事项请务必了解:
- 该系列文章每个字都是我理解后自行翻译并写上去的,可能会存在笔误与理解错误,如果发现了希望读者能够在评论区指正,我会在第一时间修正错误。
- 阅读这个系列需要你有基本的 VLN, LLM, VLM 相关基础知识,有时候我会直接使用英文名词,因为这些词汇实在不容易找到符合语境的翻译。
- 原文可能因为版面限制存在图像表格与段落不同步的问题,为了更方便阅读,我会在博文中重新对图像表格进行排版,并做到引用图表的文字下方就能看到被引用的图表。因此可能会出现一张图片在博客中多处位置重复出现的情况。
- 对于原文中的图像,我会在必要时对图像描述进行翻译并附上我自己的理解,但如果图像描述不值得翻译我也不会强行写上去。
Basic Information
- 论文标题:AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation
- 原文链接: https://arxiv.org/abs/2308.08155
- 发表时间:2023年10月03日
- 发表平台:arxiv
- 预印版本号:[v2] Tue, 3 Oct 2023 20:47:10 UTC (6,271 KB)
- 作者团队:Qingyun Wu, Gagan Bansal, Jieyu Zhang, Yiran Wu, Beibin Li, Erkang Zhu, Li Jiang, Xiaoyun Zhang, Shaokun Zhang, Jiale Liu, Ahmed Hassan Awadallah, Ryen W White, Doug Burger, Chi Wang
- 院校机构:
- Microsoft Research;
- Pennsylvania State University;
- University of Washington;
- Xidian University
- 项目链接: https://microsoft.github.io/autogen/stable/index.html
- GitHub仓库: https://github.com/microsoft/autogen
Abstract
AutoGen是一个开源框架,允许开发人员通过多个能够相互对话以完成任务的agent构建 LLM 应用程序。AutoGen 代理可定制、可对话,并且可以在多种模式下运行,这些模式结合了 LLM、人工输入、工具。使用 AutoGen 开发人员还可以灵活地定义agent交互行为。自然语言和计算机代码均可用于为不同的应用程序编写灵活的对话模式。AutoGen 是一个通用框架,可用于构建各种复杂程度和 LLM 功能的应用程序。实验证明了该框架在许多示例应用中的有效性,涉及数学、编程、问答、运筹学、在线决策、娱乐等领域。
1. Introduction
LLM正成为开发强大智能体的关键基石,智能体利用 LLM 进行推理、工具使用、应对观察输入,并应用于诸多实际任务。鉴于 LLM 的应用范围不断扩大,且任务复杂性日益增加,一种提升智能体能力的直观方法是使用多个协作的智能体。先前的研究表明,多智能体有助于鼓励发散思维,提升事实性和推理能力,并提供验证。鉴于这种直觉和早期的良好前景,有必要提出以下问题:如何基于多智能体方法,促进能够涵盖广泛领域和复杂度的 LLM 应用程序的开发?
作者的想法是使用多agent对话实现。由于 LLM 的最新进展,至少有三个原因可以证实它的普遍可行性和实用性:
- 由于针对聊天优化的 LLM 如
GPT-4
显示出整合反馈的能力,LLM agent 可以通过彼此之间或与人之间的对话进行合作,例如 agent 提供和寻求推理、观察、批评、验证的对话; - 由于单个 LLM 可以展现广泛的功能(尤其是在配置了正确的提示和推理设置时),不同配置agent 之间的对话可以帮助以模块化和互补的方式组合这些 LLM 功能;
- 当任务被分解为更简单的子任务时,LLM 已经证明了解决复杂任务的能力。多agent对话可以以直观的方式实现这种划分和集成。
基于以上原因,支持不同的应用使其共同要求协调多个agent,而这些agent可能由LLM、人类或具备不同能力的工具提供支持。作者期望一个多智能体对话框架,它具有通用的抽象和高效的实现,并能够灵活地满足不同的应用需求。要实现这一目标,需要解决两个关键问题:
- 如何设计出功能强大、可重用、可定制、在多agent协作中高效的单个agent;
- 如何开发一个简单、统一的界面,以适应各种agent对话模式;
在实践中,不同复杂程度的应用可能需要具有特定功能的不同agent集合,并且可能需要不同的对话模式,例如单轮对话、多轮对话、不同的人类参与、静态对话、动态对话等。此外,开发人员可能更喜欢使用自然语言或代码编写agent交互的灵活性。如果不能充分解决这两个问题,框架的适用范围和通用性就会受到限制。
在对多agent方法进行探索的同时,作者基于以下新概念提出了 AutoGen,一种通用的多代理对话框架(Fig.1
)。
- Customizable and conversable agents:AutoGen 采用通用agent设计,能够利用 LLM、人工输入、工具或两者的组合。因此,开发人员可以通过选择和配置部分内置功能,简单快速地创建具有不同角色的agent(例如,编写代码、执行代码、连接人工反馈、验证输出等)。agent的后端也可以轻松扩展,以支持更多自定义行为。为了使这些agent适用于多agent对话,每个agent都具有可对话功能:可以接收、响应、回复消息。如果配置得当,agent可以自主地与其他agent进行多轮对话,或者在某些回合中征求人工输入,从而实现人工干预和自动化(human-in-loop)。可对话agent的设计充分利用了最先进的 LLM 在通过聊天获取反馈和推进的强大功能,并允许以模块化方式组合 LLM 的功能;
- Conversation programming:AutoGen 的一个基本理念是将复杂的 LLM 应用程序工作流简化并统一为多智能体对话。因此,AutoGen 采用了一种以这些agent间对话为中心的编程范式,作者将这种范式称为对话编程,通过两个主要步骤简化了复杂应用程序的开发:(1)定义一组具有特定功能和角色的可对话agent;(2) 通过以对话为中心的计算和控制来编程agent之间的交互行为。这两个步骤都可以通过自然语言和编程语言的融合来实现,从而构建具有各种对话模式和agent行为的应用程序。AutoGen 提供了现成的实现,并且允许对这两个步骤进行轻松扩展和实验;
AutoGen 还提供了一系列使用可对话agent和对话编程创建的多agent应用程序。这些应用程序展示了 AutoGen 如何轻松支持各种复杂程度的应用程序和各种功能的 LLM。此外,还对基准测试进行了评估,并对新应用程序进行了初步研究。结果表明,AutoGen 可以帮助在许多任务上取得卓越的性能,并支持 LLM 的创新使用方式,同时减少开发工作量。
2. The AutoGen Framework
为了减少开发人员跨领域创建复杂 LLM 应用程序所需的工作量,AutoGen 的核心设计原则是使用多agent对话来简化和整合多agent工作流。这种方法还旨在最大限度地提高已实现agent的可复用性。本节介绍 AutoGen 的两个关键概念:可对话agent、对话编程。
2.1 Conversable Agents
在 AutoGen 中,可对话agent是一个具有特定角色的实体,它可以传递消息并与其他可对话agent之间收发信息。根据发送和接收的消息维护其内部上下文,并可配置一系列功能,并通过 LLM、工具或人工输入等启用这些功能。agent 可以根据下文描述的编程行为模式采取行动。
Agent capabilities powered by LLMs, humans, and tools
由于agent的能力直接影响其处理和响应消息的方式,AutoGen 允许灵活地为其agent赋予各种能力。AutoGen 支持许多常见的可组合代理能力:
- LLM:基于 LLM 的agent利用了高级 LLM 的许多功能,例如角色扮演、隐式状态推理,以及基于历史对话的规划、提供反馈、根据反馈进行调整以及编码。这些能力可以通过新颖的提示技术以不同的方式组合,从而提高agent的技能和自主性。AutoGen 还通过增强的 LLM 推理层提供增强的 LLM 推理功能,例如结果缓存、错误处理、消息模板等;
- Humans:在许多 LLM 应用中,人工参与是必需的,甚至是必不可少的。AutoGen 允许human-in-the-loop的形式参与到流程中,这些agent可以根据配置在对话的某些轮次中征求人工输入。默认用户agent允许配置人工参与级别和模式,例如请求人工输入的频率和条件,包括允许人工跳过输入的选项;
- Tools:基于工具的agent能够通过代码执行或函数执行来执行工具。例如,AutoGen 中的默认用户agent能够执行 LLM 建议的代码,或进行 LLM 建议的函数调用。
Agent customization and cooperation
根据特定应用的需求,每个agent可以配置为混合使用多种基本后端类型,以在多agent对话中展现复杂的行为。AutoGen 允许通过重用或扩展内置agent,轻松创建具有专门功能和角色的agent。Fig.2
中的黄色阴影区域展示了 AutoGen 中内置agent的示意图。ConversableAgent
类是最高级别的抽象,默认情况下可以使用 LLM、人工和工具;AssistantAgent
和 UserProxyAgent
是两个预配置的 ConversableAgent
子类,每个子类代表一种常见的使用模式,即充当由 LLM 支持的 AI 助手和充当人工agent来征求人工输入或执行代码/函数调用(由humans 和/或 tools 支持)。
在Fig.1 right
中,一个由 LLM 支持的助理agent和一个由工具和人工支持的用户agent被部署在一起来处理一项任务。助理agent在 LLM 的帮助下生成解决方案,并将解决方案传递给用户agent,然后,用户agent会请求人工输入或执行助理的代码,并将结果作为反馈返回给助理。
AutoGen 中的可对话agent允许自定义agent相互对话,从而成为实用的构建模块。然而,为了开发出能够让agent在任务上取得有意义进展的应用程序,开发人员还需要能够指定和塑造这些多agent对话。
2.2 Conversation Programming
为了解决上述问题,AutoGen 采用了对话编程,这种范式考虑了两个概念:
- Computation:agent在多agent对话中计算其响应所采取的操作;
- Control Flow:这些计算发生的顺序或条件;
编程能力有助于实现许多灵活的多agent对话模式。在 AutoGen 中这些计算以对话为中心。采取与其参与对话相关的行动,其行动会导致后续对话的消息传递直至满足终止条件)。同样,control flow 是由对话驱动的,参与agent决定向哪些agent发送消息以及计算过程都是agent间对话的功能。这种范式有助于人们直观地推理复杂的工作流程,如agent采取了哪些行动以及agent之间对话消息传递。
Fig.2
提供了一个简单的示例。底部子图展示了各个agent如何执行特定于角色、以对话为中心的计算来生成响应(例如,通过 LLM 推理调用和代码执行),该任务通过对话框中显示的对话进行。中间子图演示了基于对话的control flow。当助手收到消息时,用户agent通常会将人工输入作为回复发送,如果没有输入将执行助手消息中的任何代码。
AutoGen 具有以下设计模式来促进对话编程:
- Unified interfaces and auto-reply mechanisms for automated agent chat:AutoGen 中的agent具有统一的对话接口,用于执行相应的以对话为中心的计算,包括用于发送/接收消息的函数,以及用于根据收到的消息采取行动并生成响应的生成回复函数。AutoGen 还引入并默认开启agent自动回复机制来实现对话驱动的控制:一旦代理收到来自另一个代理的消息,就会自动调用生成回复函数并将回复发送回发送者,直至满足终止条件。AutoGen 提供基于 LLM 推理、代码或函数执行、人工输入的内置回复函数。用户还可以注册自定义回复函数来定制agent的行为模式,例如,在回复发送者agent之前先与另一个agent聊天。在此机制下,一旦注册了回复函数并初始化对话,对话流就会自然启动,对话自然进行,无需任何额外的控制平面(即控制对话流的特殊模块)。例如,通过
Fig.2
中蓝色阴影区域(“开发人员代码”)中的代码,可以轻松触发agent之间的对话,并且对话将自动进行,如Fig.2
中灰色阴影区域(“程序执行”)中的对话框所示。自动回复机制提供了一种分散、模块化和统一的方式来定义工作流程; - Control by fusion of programming and natural language:AutoGen 允许在各种控制流管理模式中使用编程和自然语言:
- Natural- language control via LLMs:可以使用自然语言提示 LLM 支持的agent来控制对话流。例如,内置
AssistantAgent
的默认系统消息使用自然语言指示agent修复错误,并在先前生成的结果声明存在错误时重新生成代码。它还会指导agent将 LLM 输出限制为某些结构,以便其他工具支持的agent方便使用。例如,指示agent在所有任务完成后回复“TERMINATE”
以终止程序。更多自然语言控制的具体示例可在Appendix. C
中找到; - Programming-language control:可以使用 Python 代码指定终止条件、人工输入模式、工具执行逻辑,例如自动回复的最大数量。还可以注册编程的自动回复函数,用 Python 代码控制对话流,如
Fig.2
中标记为“对话驱动控制流”的代码块所示; - ** Control transition between natural and programming language**:支持自然语言和编程语言之间灵活的控制转换。可以通过在自定义回复函数中调用包含特定控制逻辑的 LLM 推理,实现从代码控制到自然语言控制的转换;或者通过 LLM 提出的函数调用,实现从自然语言控制到代码控制的转换;
- Natural- language control via LLMs:可以使用自然语言提示 LLM 支持的agent来控制对话流。例如,内置
在对话编程范式中,可以实现多种模式的多agent对话。除了预定义流程的静态对话外,AutoGen 还支持多agent的动态对话流程,提供了两种通用方法来实现这一点:
- 自定义生成回复函数:在自定义生成回复函数中,一个agent可以保持当前对话,同时根据当前消息的内容和上下文调用与其他agent的对话;
- 函数调用:在这种方法中,LLM 根据对话状态决定是否调用特定函数。通过在被调用函数中向其他agent发送消息,LLM 可以驱动动态多agent对话。
此外,AutoGen 通过内置的 GroupChatManager
支持更复杂的动态群聊,它可以动态选择下一个发言者,然后将其回复广播给其他agent。作者提供了已实现的工作系统来展示所有这些不同的模式,其中一些模式在Fig.3
中进行了可视化。
3 Applications of AutoGen
Fig.3
演示了六个使用 AutoGen 的应用程序,以说明其在简化高性能多agent应用程序开发方面的潜力。这些应用程序的评选基于其实际相关性(A1、A2、A4、A5、A6)、AutoGen 支持的问题难度和求解能力(A1、A2、A3、A4)以及创新潜力(A5、A6)。这些标准共同展现了 AutoGen 在推动 LLM 应用领域发展方面所发挥的作用。
A1: Math Problem Solving
数学是一门基础学科,利用 LLM 协助解决数学问题的前景开辟了大量新的应用和探索途径,包括个性化 AI 辅导、AI 研究辅助等。本节演示了 AutoGen 如何帮助开发用于解决数学问题的 LLM 应用程序,展示了在支持各种问题解决范式方面的强大性能和灵活性。
- 场景一:通过直接重用 AutoGen 的两个内置agent构建一个自主数学问题求解系统。在
MATH
数据集上评估了系统和几种替代方法,包括多Multi-Agent Debate
、LangChain Re-Act
、原始GPT-4
以及商业产品ChatGPT + Code Interpreter
、ChatGPT + Plugin
等开源方法,并将结果总结在Fig.4 (a)
中。对 120 个随机选择的 5 级问题以及MATH
的整个 5 测试数据集进行了评估。结果表明,与其他方法相比,AutoGen 的内置agent已经能够提供更好的开箱即用性能; - 场景二:借助 AutoGen 展示了一个人在环的解决问题流程。将人工反馈与 AutoGen 结合,只需对场景一的
UserProxyAgent
设置人工输入模式为“ALWAYS”
。实验证明该系统可以有效地结合人工输入,解决那些必须有人参与才能解决的难题; - 场景三:进一步演示了一个新颖的场景,其中多个人类用户可以参与问题解决过程中的对话。
这些场景的实验和案例研究表明,与我们尝试过的其他解决方案相比,AutoGen 能够提供更佳的性能或全新的体验。由于篇幅限制,评估的详细信息(包括三个场景的案例研究)位于Appendix. D
中。
A2: Retrieval-Augmented Code Generation and Question Answering
Retrieval Augmentation(RAG)已成为一种实用有效的方法,它通过整合外部文档来缓解 LLM 的固有局限性。在本节中,利用 AutoGen 构建了一个名为“Retrieval-augmented Chat”的RAG系统。该系统由两个agent组成:检索增强用户agent和检索增强助手agent,这两个代理均由 AutoGen 的内置agent扩展而来。检索增强用户agent包含一个向量数据库,并使用 SentenceTransformers
作为上下文检索器。Appendix. D
提供了检索增强聊天的详细工作流程描述。
从问答和代码生成两种场景评估了检索增强聊天。场景一首先在 Natural Questions
数据集上对自然问答进行评估,并在Fig.4 (b)
中报告结果。在此评估中,按照现有的评估实践将系统与 DPR(Dense Passage Retrieval)进行了比较。利用对话设计和自然语言控制,AutoGen 在此应用程序中引入了一种新颖的交互式检索功能:每当检索到的上下文不包含信息时,基于 LLM 的助手不会终止,而是会回复“抱歉,我找不到任何有关…更新上下文的信息。”这将调用更多次检索尝试。作者进行了一项消融研究,在其中提示助理agent说“我不知道”而不是“更新上下文”。在未找到相关信息的情况下,报告结果如Fig.4 (b)
所示。结果表明,交互式检索机制确实在此过程中发挥了重要作用。Appendix. D
中给出了使用这一吸引人的功能的具体示例和结果。场景二进一步演示了检索增强聊天如何基于给定的代码库生成代码,该代码库包含 GPT-4
训练数据中未包含的代码。Appendix. D
中包含了两种场景的评估和演示细节。
A3: Decision Making in Text World Environments
在本小节中,将演示如何使用 AutoGen 开发涉及交互式或在线决策的有效应用程序。我们使用 ALFWorld
基准进行研究,该基准包含一系列在家庭环境中基于语言的合成交互式决策任务。
利用 AutoGen 实现了一个双智能体系统来解决 ALFWorld
中的任务。它由一个 LLM 支持的助理agent(负责提出任务执行方案)和一个执行agent(负责在 ALFWorld
环境中执行操作)组成。该系统集成了 ReAct
提示功能,并能够达到类似的性能。ReAct
和基于 AutoGen 的双agent系统都面临一个共同的挑战:它们偶尔无法利用关于物理世界的基本常识知识。这一缺陷可能导致系统因重复性错误而陷入循环。幸运的是,AutoGen 的模块化设计能够有效地解决这个问题:通过 AutoGen 可以引入一个基础agent,当系统出现重复性错误的早期迹象时,它会提供关键的常识知识,例如“您必须找到并获取该物品才能检查它。您必须到达目标物品所在的位置才能使用它。”,这样做显著增强了系统避免陷入错误循环的能力。将系统的两个变体与 GPT-3.5-turbo
和 ReAct7
在 ALFWorld
的 134 个未见过的任务上的任务解决性能进行了比较,并在Fig.4 (c)
中报告了结果。结果表明,引入基础agent平均可带来 15% 的性能提升。在回顾系统的输出后观察到,基础agent通过在正确的时刻提供背景常识知识,显著减轻了系统坚持有缺陷计划的倾向,从而避免了错误循环的产生。有关比较系统的轨迹示例,请参见Appendix. D
、Fig. 10
。
A4: Multi-Agent Coding
本小节中使用 AutoGen 构建一个基于 OptiGuide
的多agent编码系统,该系统擅长编写代码来解释优化解决方案并回答用户问题,例如探索改变供应链决策的含义或理解优化器做出特定选择的原因。Fig.3
的第二个子图显示了基于 AutoGen 的实现。工作流程如下:最终用户向指挥官agent发送问题,例如“如果我们禁止从供应商 1 运送到烘焙厂 2 会怎样?”指挥官与两个助理agent(包括编写者和保护者)协调来回答这个问题。编写者将编写代码并将代码发送给指挥官。收到代码后,指挥官使用保护者检查代码安全性;如果检查通过,指挥官将使用外部工具(例如 Python)执行代码,并请求编写者解释执行结果。例如,作者可能会说:“如果我们禁止从供应商1运送到烘焙厂2,总成本将增加10.5%。” 然后,指挥官会将这个结论性答案提供给最终用户。如果在某个步骤出现异常,例如Safeguard
发出的安全警告,指挥官会将问题重定向回作者,并附带调试信息。该过程可能会重复多次,直到用户的问题得到解答或超时。
借助 AutoGen,OptiGuide
的核心工作流代码从 430 多行减少到 100 行,从而显著提高了工作效率。Appendix. D
中详细比较了 ChatGPT+Code Interpreter
和基于 AutoGen 的 OptiGuide
的用户体验,结果表明基于 AutoGen 的 OptiGuide
平均可以节省大约 3 倍的用户时间,并将用户交互次数减少 3-5 倍。作者还进行了一项分析,表明多agent抽象是必要的:构建单agent并让该agent同时执行代码编写和保护过程。在包含 100 个编码任务的数据集上测试了单agent和多agent方法,该数据集包含相同数量的安全任务和不安全任务。如Fig.4 (d)
所示的评估结果表明,多agent设计将识别不安全代码的 F-1 分数提高了 8%(使用 GPT-4
)和 35%(使用 GPT-3.5-turbo
)。
A5: Dynamic Group Chat
AutoGen 原生支持动态群聊通信模式,参与的agent共享相同的上下文,并以动态方式(而非遵循预定义的顺序)与其他agent交谈。动态群聊依靠持续的对话来引导agent之间的交互流程。这使得动态群聊非常适合那些无需严格沟通顺序即可进行协作的情况。在 AutoGen 中,GroupChatManager
类充当agent之间对话的引导者,并重复以下三个步骤:动态选择发言者、收集选定发言者的回复、广播消息(Fig.3-A5
)。对于动态发言者选择组件,使用角色扮演式提示。通过对 12 个手动编写的复杂任务进行初步研究,观察到与纯粹基于任务的提示相比,使用角色扮演提示通常能够在解决问题和选择发言者的过程中更有效地考虑对话上下文和角色协调,这可以提高成功率并减少 LLM 调用次数。详细结果请参见Appendix. D
。
A6: Conversational Chess
使用 AutoGen 开发了对话式国际象棋,这是一款自然语言界面游戏,如Fig. 3
的最后一个子图所示。它具有内置的玩家agent,可以是人类或 LLM,以及第三方棋盘agent,用于提供信息并根据标准规则验证移动。AutoGen 提供了两个基本功能:
- 自然、灵活、引人入胜的游戏动态:这得益于 AutoGen 中可定制的agent设计。对话式国际象棋支持多种游戏模式,包括 AI-AI、AI-人类和人与人之间,并且可以在单场游戏中无缝切换这些模式。
Appendix. D
中的Fig.15
展示了这些有趣的游戏动态; - 基本规则:这是维护游戏完整性的关键方面。在游戏过程中,棋盘agent会检查每个提议的走法是否合法;如果某个走法无效,agent会做出错误响应,提示玩家agent在继续之前重新提出合法的走法。此过程可确保只进行有效的走法,并有助于保持一致的游戏体验。一项消融研究删除了棋盘agent,而只依靠相关提示“你应该确保你和对手都在做出合法的走法”来为他们的动作奠定基础。结果表明:如果没有棋盘代理,不合理的走法会导致游戏中断。模块化设计提供了灵活性,可以根据不断变化的游戏规则或不同的国际象棋规则变体快速调整棋盘代理。
Appendix. D
提供了这项消融研究的全面演示。
4. Discussion
作者开源了一个库 AutoGen,它融合了可对话agent和对话编程的范式。该库利用了功能强大的agent,非常适合多agent协作。它具有agent之间统一的对话界面以及自动回复机制,有助于建立交互界面,充分利用聊天优化的 LLM 的广泛功能,并适应各种应用。AutoGen 是一个通用框架,用于创建和试验多agent系统,该系统可以轻松满足各种实际需求,例如重用、定制和扩展现有智能体,以及在agent之间进行对话编程。
实验表明这种方法具有诸多优势。采用 AutoGen 后,性能得到了提升由于SOTA、开发代码减少,并减轻了现有应用程序的手动负担。它为开发人员提供了灵活性,如 A1(场景 3)、A5 和 A6 所示,其中 AutoGen 使多agent聊天能够遵循动态模式,而不是固定的来回交互。它允许人类以对话的方式与多个 AI 智能体一起参与活动。尽管这些应用程序很复杂(大多数涉及两个以上的agent或动态多轮agent合作),但基于 AutoGen 的实现仍然很简单。将任务分配给不同的智能体可以促进模块化。此外,由于每个agent都可以单独开发、测试和维护,因此这种方法简化了整体开发和代码管理。
虽然这项工作仍处于早期实验阶段,但它为众多未来方向和研究机会铺平了道路。例如,可以探索如何将现有的agent实现有效地集成到多agent框架中,并研究多agent工作流中自动化与人为控制之间的最佳平衡。随着 AutoGen 的进一步开发和完善,作者的目标是研究哪些策略(例如agent拓扑和对话模式)能够在优化整体效率等因素的同时,实现最高效的多agent对话。虽然增加agent数量和其他自由度为解决更复杂的问题提供了机会,但也可能带来新的安全挑战,需要进一步研究和仔细考量。
在Appendix. B
中提供了更多讨论,包括 AutoGen 的使用指南和未来工作的方向。作者希望 AutoGen 能够在开发速度、实验便捷性以及整体有效性和安全性方面帮助提升众多 LLM 应用程序,积极欢迎广大社区的贡献。
Appendix. B
【Note】这里由于正文内容较少,所以让我们一起看看 Appendix. B
中作者认为有哪些后续工作可以做的。
第 3 节中的应用程序展示了 AutoGen 如何不仅支持新应用程序,还能帮助改造现有应用程序。例如,在 A1(场景 3)、A5 和 A6 中,AutoGen 支持创建遵循动态模式而非固定来回的多agent对话;在 A5 和 A6 中,人类可以与多个其他 AI agent以对话的方式一起参与活动;A1-A4 展示了如何使用 AutoGen 快速改造流行的应用程序。尽管这些应用程序很复杂(大多数涉及两个以上的智能体或动态多轮智能体合作),但基于 AutoGen 的实现仍然很简单,展示了构建创意应用程序的良好机会和巨大的创新空间。在思考为什么使用 AutoGen 可以在这些应用程序中实现这些好处时,作者认为有以下几个原因:
- Easy of use:内置agent开箱即用,无需任何定制即可提供强大的性能(A1、A3);
- Modularity:将任务划分为独立的agent,提升了系统的模块化程度。每个agent都可以独立开发、测试和维护,从而简化了整体开发流程并方便了代码管理(A3、A4、A5、A6);
- Programmability:AutoGen 允许用户扩展/定制现有代理,轻松开发满足其特定需求的系统(A1-A6)。例如,使用 AutoGen,A4 版本的核心工作流代码从 430 多行减少到 100 行,节省了 4 倍;
- Allowing human involvement:AutoGen 提供了一种原生机制来实现人工参与和/或人工监督。人类可以无缝且可选地与人工智能合作解决问题或参与日常活动。 AutoGen 还支持交互式用户指令,以确保流程始终遵循预期路径(A1、A2、A5、A6);
- Collaborative/adversarial agent interactions:与许多协作agent系统一样,AutoGen 中的代理可以共享信息和知识,从而互补彼此的能力,共同寻求更优的解决方案。(A1、A2、A3 和 A4)。类似地,如果某些agent需要以对抗的方式工作。相关信息以受控的方式在不同的对话之间共享,从而防止分心或产生幻觉(A4、A6)。AutoGen 支持这两种模式,从而能够有效利用和增强 LLM。
B.1 General Guidelines for Using AutoGen
作者在下面给出一些使用 AutoGen 中的agent完成任务的建议。
- Consider using built-in agents first:例如
AssistantAgent
默认由GPT-4
支持,并带有精心设计的系统消息,可通过代码解决常见问题。UserProxyAgent
配置为征求人工输入并执行工具执行。只需结合这两个agent即可解决许多问题。在为应用程序定制agent时,需要考虑以下几个方面:- 构建agent时可以指定人工输入模式、终止条件、代码执行配置、LLM 配置;
- AutoGen 支持在初始用户消息中添加指令,这是在不修改系统提示词的情况下提高性能的有效方法;
UserProxyAgent
可以进行扩展以处理不同的执行环境和异常等;- 当需要修改系统提示词时,可以考虑利用 LLM 使用自然语言编写对话流程的功能;
- Start with a simple conversation topology:优先考虑使用双agent聊天或群聊设置,因为它们通常可以用最少的代码进行扩展。需要注意的是,双agent聊天可以通过动态使用 LLM 函数轻松扩展,以支持两个以上的agent;
- Try to reuse built-in reply methods:在实现自定义回复方法之前,尝试重用基于 LLM、工具或人工的内置回复方法,因为它们通常可以复用以简单的方式实现目标(例如,内置代理
GroupChatManager
的回复方法在选择下一个发言者时重用了基于 LLM 的内置回复功能,参考第 3 节中的 A5); - Start with humans always in the loop:使用
UserProxyAgent
开发新应用时,即使目标操作模式更加自主,也应始终开启人在回路,即设置人机输入模式为“ALWAYS”。这有助于评估AssistantAgent
的有效性、调整提示、发现极端情况并进行调试。一旦确信小规模应用能够取得成功,可以考虑将人机输入模式设置为“NEVER”。这样可以将 LLM 用作后端,用户可以使用 LLM 或手动生成不同的系统消息来模拟不同的用例; - Other libraries/packages could help:尽管 AutoGen 代理拥有诸多优势,但在某些情况下其他库/软件包也能提供帮助。例如:(1) 对于不需要来回故障排除、多agent交互等的任务/子任务,可以使用
LangChain
、LlamaIndex
、Guidance
、Semantic Kernel
、Gorilla
或低级推理 API(“autogen.oai” 在此级别提供了增强的 LLM 推理层)来编排单向(无来回消息交换)流水线;(2) 当LangChain
等现有工具有用时,可以将它们用作 AutoGen 代理的工具后端。例如,在 AutoGen 代理中使用LangChain
的工具Wolfram Alpha
;(3) 对于特定应用,可能需要利用其他库/包中实现的agent。为此,可以将这些代理包装为 AutoGen 中的可对话agent,然后通过多agent对话使用它们构建 LLM 应用程序;(4) 在众多可调选项(例如 LLM 推理配置)中找到最佳操作点可能很困难。诸如“flaml.tune”(Wang 等人,2021)之类的黑盒优化包可以与 AutoGen 一起使用,以自动完成此类调整;
B.2 Future Work
这项工作提出了许多研究问题和未来方向。
Designing optimal multi-agent workflows
为给定任务创建agent工作流可能涉及许多决策,例如,包含多少个agent、如何分配agent角色和agent能力、agent之间应如何交互,以及是否要自动化工作流的某个特定部分。可能不存在一个放之四海而皆准的答案,最佳解决方案可能取决于具体的应用。这就引出了一些重要的问题:agent工作流对哪些类型的任务和应用最有用?agent体如何在不同的应用中发挥作用?对于给定任务,最佳(例如,成本效益高的)多智能体工作流是什么?
Creating highly capable agents
AutoGen 可以支持开发能够充分利用 LLM、工具和人员优势的高性能agent。创建这样的代理对于确保多agent工作流能够有效地排除故障并推进任务至关重要。例如,作者观察到另一个多agent LLM 系统 CAMEL 在大多数情况下无法有效解决问题,主要是因为它缺乏执行工具或代码的能力。这一失败表明,LLM 和具有简单角色扮演的多agent对话是不够的,拥有多样化技能的高性能代理至关重要。作者任务,需要开展更系统的工作,以制定针对特定应用的代理指南,创建大型 OSS 代理知识库,并创建能够发现和升级自身技能的agent。
Enabling scale, safety, and human agency
第三节展示了复杂的多agent工作流如何赋能新的应用,未来还需要开展进一步的研究来评估进一步扩展能否帮助解决极其复杂的任务。然而,随着这些工作流规模的扩大和复杂程度的提升,记录和调整它们可能会变得困难。因此,开发清晰的机制和工具来跟踪和调试它们的行为至关重要。否则,这些技术可能会导致智能体之间产生难以理解、难以理解的对话。
作者的工作还表明,使用 AutoGen 实现复杂、完全自主的工作流程非常有用,但完全自主的agent对话需要谨慎使用。虽然 AutoGen 支持的自主模式在许多情况下都是可用的,但高度的自主性也可能带来潜在风险,尤其是在高风险应用中。因此,构建针对连锁故障和漏洞利用的故障安全措施,减轻奖励黑客攻击、失控、不良行为,以及保持对使用 AutoGen 构建的应用程序的有效人工监督将变得非常重要。虽然 AutoGen 通过用户agent提供了方便和无缝的人工参与,但开发人员和利益相关者仍然需要了解和确定适当的人工参与级别和模式,以确保安全和合乎道德地使用该技术。
Appendix.C Default System Message for Assistant Agent
Fig.5
显示了 AutoGen (v0.1.1) 中内置助手代理的默认系统消息,其中引入了几种新的提示技术并进行了相应的突出显示。当将这些新的提示技术结合在一起时,即使使用最简单的双代理对话拓扑,也可以编写相当复杂的对话。这种方法试图在很大程度上利用 LLM 在隐式状态推理中的能力。LLM 并不能完美地遵循所有指令,因此系统设计需要有其他机制来处理异常和故障。有些指令可能存在歧义,设计者应该减少它们以提高准确性,或者有意保留它们以提高灵活性并解决其他agent中的不同情况。总的来说,察到 GPT-4
比 GPT-3.5-turbo
更好地遵循指令。