随着大型语言模型的快速发展,构建基于LLM驱动的自治代理(autonomous agents)已经成为一个备受关注的话题。仅在过去一年中,就出现了许多基于这一理念的新技术和框架。
本文将探索微软开源的Agent框架:Autogen。它弥补了此类新技术未能解决的空白:允许多个Agent协作以实现共同目标。它在LLM之上添加了最小但重要的功能,以支持多个代理的初始化和协作,允许在多个Agent之间单聊以及群聊。
但作为一个仍处于早期阶段的框架,通过API把Autogen集成到实际的生产环境中仍然是一个挑战,如Web APP。由于缺乏成熟的文档或资源,在Agent通信流中需要一些变通方法。
因此,在本文中,我们将讨论Autogen Agent连接到API的详细过程。
一、Autogen介绍
在之前的LLM之Agent(七)| AutoGen介绍文章中介绍过Autogen,它是一个基于LLM的Agent通信框架,支持创建具有不同人物角色的代理。然后,这些代理可以进行单聊;也可以进行群聊,每个代理轮流发言。
Autogen提供了一些具有不同功能的内置代理类型,例如:
- User Proxy Agent:可以检索用户输入并执行代码;
- Assistant Agent:默认的系统消息代理,该消息允许Agent充当完成任务的助理;
- Conversable Agent:在user proxy agents和assistant之间构建会话能力。
虽然Autogen主要支持OpenAI LLM,如GPT-3.5和GPT-4来创建代理,但用户也可以与本地或其他托管LLM一起使用。
二、Autogen群聊
Autogen中的群聊功能允许多个代理在群设置中进行协作,主要特点如下:
- 每个代理都可以看到组中其他代理发送的所有消息;
- 一旦启动,群聊将继续,直到满足其中一个终止条件。(例如:代理在回复中使用终止消息,用户选择退出聊天,达到群的最大聊天次数等)
- 每个群聊都有一个管理代理,负责监督消息广播、发言人选择和聊天终止。
- Autogen在每轮聊天中选择下一位发言人,目前支持四种方法
-manual:要求用户手动选择下一个发言人
-random:随机选择下一个发言人
-round robin:使用循环方法选择下一个发言人
-auto:让LLM选择下一个有聊天历史记录作为上下文的发言人
这些特性使Autogen群聊成为Agent协作的理想选择。然而,如果想控制Agent在此环境中更多的协作方式时,也会带来很多挑战。
三、使用Autogen开发应用程序
目前,Autogen旨在作为一种工具使用,用户可以完全了解不同代理之间的所有内部通信。这使得将Autogen集成到用户不应该知道这些信息的应用程序中成为一项棘手的工作。
例如,如果您构建了一个系统,其中多个代理共同担任销售助理,那么在决定对用户查询的最终响应之前,您可能不想公开他们是如何在内部规划和选择销售策略的。您也可能不想让用户暴露在这种内部沟通的复杂性中。
除此之外,在尝试将Autogen代理系统与API集成时,我们还面临以下问题:
- Autogen主要是一个CLI工具。(例如:它将代理消息打印到CLI,并提示用户通过CLI提供反馈);
- Autogen无法在没有明确用户输入的情况下提供一致的方式来结束特定的聊天序列。
但好消息是,我们可以使用Autogen已经支持的某些定制来解决这些问题。我们能够将Autogen集成到API中。
下面通过旅游代理系统来演示一下如何将AutoGen与API进行集成:
四、基于Autogen的旅游代理系统
该系统将由两个Autogen Assistant Agent和一个User Proxy Agent构建,在群聊中这些代理人中的每一位都有以下职责:
- Tour Agent:主代理决定如何响应用户查询以及在生成对用户的最终响应之前应收集的信息;
- Location Researcher:旅游代理的助理,在通过SERP API查询谷歌地图的函数调用的帮助下进行位置研究。它使代理商能够研究用户心目中与目的地相关的景点、餐厅、住宿等;
- User Proxy:代理群聊天中用户的代理。
由于本教程依赖于OpenAI和SERP API,因此您需要每个服务的API密钥来尝试本示例。
4.1 Autogen config
首先,定义AutoGen的配置:
config_list = [{
'model': 'gpt-3.5-turbo-1106',
'api_key': os.getenv("OPENAI_API_KEY"),
}]
4.2 Assistant Agents
然后,创建两个助理代理:Tour Agent和Location Researcher。
Tour Agent是一个简单的Assistant Agent,具有一个自定义的系统提示,用于描述其角色和职责,它指定代理应如何将TERMINATE添加到针对用户的最终回答的末尾。
tour_agent = AssistantAgent(