AutoGen实战应用(二):多代理协作(Multi-Agent Collaboration)

2024-01-28 23:52

本文主要是介绍AutoGen实战应用(二):多代理协作(Multi-Agent Collaboration),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AutoGen是微软推出的一个全新工具,它用来帮助开发者创建基于大语言模型(LLM)的复杂应用程序. AutoGen能让LLM在复杂工作流程启用多个角色代理来共同协作完成人类提出的任务。在我之前的一篇博客: AutoGen实战应用(一):代码生成、执行和调试 中我们通过一个简单案例为大家了介绍了如何在AutoGen中创建代理(agent),如何通过agent之间的相互沟通和协作来完成一个人类提出的任务。在这个博客的案例中我们创建了两个agent即UserProxyAgent和AssistantAgent,然后通过这两个agent相互协作来完成一个简单的任务。通过两个agent相互协作来完成任务这属于AutoGen的最基础的应用,今天我们来介绍更加复杂的应用: 多代理协作(Multi-Agent Collaboration)。

一、多代理协作(Multi-Agent Collaboration)

所谓多代理协作是指通过创建多个agent来完成复杂任务的一种agent的工作方式,那为什么需要创建多个agent才能完成任务呢?这取决于任务的复杂程度,对于简单任务我们一般只需要创建2个agent(UserProxyAgent和AssistantAgent)即可。但是对于有些复杂的任务2个agent往往效率不高从而导致任务难以完成,因此遇到复杂任务时我们往往需要创建多个agent,通过多个agent一起协作才能更高效的完成任务,下面我们首先回顾以下AutoGen中的常用的两种agent类型和作用:

  • UserProxyAgent: 用户代理(代表人类),它的职责是发布任务,执行代码(包括执行AssistantAgent生成的代码) ,将代码执行结果反馈给AssistantAgent。
  • AssistantAgent:助理代理(代表LLM), 它的职责是对问题进行分析、推理、归纳、总结,同时生成解决问题的代码(如何需要)。

当遇到一个复杂问题时,我们可能需要创建多个UserProxyAgent或者多个AssistantAgent,那么如何让多个agent在一起顺畅的沟通交流呢?那就需要我们创建一套多个agent之间相互沟通的机制,下面我们就来介绍一种常见的多代理沟通机制: manager-broadcast, 即经理广播机制如下图所示:

在manager-broadcast机制中我们会创建一个聊天组(GroupChat),然后我们将所有的agent都放入这个组中,同时我们还需要创建一个manager,它将作为组的管理员负责收/发组成员(agents)的消息。当某个agent需要和别的agent交流时,只需要向manager发送消息即可,而manager则会将该消息广播给所有其他组成员,这样就实现了agent之间的相互交流沟通,如上图所示。下面我们就来通过一个例子来看看多个agent时如何通过manager-broadcast机制一起协作来完成任务的。

1.1 环境配置

首先请新建一个python 3.8 以上版本的虚拟环境,并在命令行中执行以下安装命令:

pip install pyautogen

接下来我们需要导入autogen包,并配置openai的api_key:

import autogenconfig_list = [{'model': 'gpt-4','api_key': 'your_api_key',#输入用户自己的api_key}
]

我们需要说明一下的是这里我们将创建的AssistantAgent都是基于gpt-4模型,因为gpt-4模型具有非常强大的分析和推理能力,因此它更适合来解决复杂的任务。

1.2 任务说明

今天我们通过autogen来实现这样一个任务:在arxiv上查找有关gpt-4的最新论文,并从中找出它们的潜在应用场景。要实现这样一个任务一般情况下可能需要如下这些步骤

  1. 从论文网站arxiv上下载关于gpt-4的最新论文。
  2. 然后读取这些论文的主要内容。
  3. 根据论文内容罗列出关于gpt-4的潜在的应用场景。

1.3 构建agent

从上面这个任务内容上看,该任务可能需要多个步骤,因此我们需要创建多个agent:

llm_config = {"config_list": config_list, "cache_seed": 42}#创建用户代理
user_proxy = autogen.UserProxyAgent(name="User_proxy",system_message="A human admin.",code_execution_config={"last_n_messages": 2,"work_dir": "groupchat","use_docker": False,},  human_input_mode="TERMINATE",
)
#创建程序员代理
coder = autogen.AssistantAgent(name="Coder",llm_config=llm_config,
)
#创建产品经理
pm = autogen.AssistantAgent(name="Product_manager",system_message="Creative in software product ideas.",llm_config=llm_config,
)
#创建聊天组
groupchat = autogen.GroupChat(agents=[user_proxy, coder, pm],messages=[], max_round=12)
#创建组管理员
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)

这里我们创建了一个UserProxyAgent和两个AssistantAgent,下面我们对它们的功能做一下说明:

  • user_proxy :用户代理,它的职责是发布任务,执行coder生成的代码 ,并将代码执行结果反馈给coder和pm。
  • coder: 程序员代理,负责按要求生成完成任务所需要的代码,并根据user_proxy反馈的代码执行结果修改和完善代码,直到代码被user_proxy成功执行。
  • pm: 产品经理代理, 它对user_proxy成功执行代码后的结果进行归纳和总结并生成最终的结果。

这里我们看到user_proxy继承自autogen的UserProxyAgent类,而coder和pm继承自autogen的AssistantAgent类,也就是说user_proxy它代表了人类,因此它可以发布任务,执行代码,反馈结果等功能,而coder和pm则代表了大模型gpt-4, 因此它们具备生成代码、推理、总结归纳相关内容等强大能力。

对于创建user_proxy 时使用的各种参数,大家可以参考官方文档,这里再做一个简要的介绍如下图所示:

下面是创建AssistantAgent时的参数说明,同样大家也可以参考官方文档 :

 这里有一个重要的参数system_message需要说明一下,当我们在创建agent时一般都会设置一个system_message参数,该参数的作用是让LLM了解当前agent扮演什么角色,它的职能是什么。下面我们看一下user_proxy、coder、pm的system_message参数:

  • user_proxy:“A human admin.”  意思为人类管理员,让llm知道user_proxy代表人类管理员。
  • pm: “Creative in software product ideas.” 意思为为软件产品提供创意,让llm知道pm可以为软件产品提供创意。
  • coder: 无。

这里我们看到coder虽然没有设置system_message参数,但是llm也能够从coder的name("Coder")中推断出coder的角色和职能即coder代表一个编码员(程序员)。

当我们创建了以上3个agent之后我们又创建了一个聊天组groupchat ,同时我们将所有的agent都放入了这个组中,下面是官网文档中对GroupChat类的参数的说明:

当创建GroupChat以后,我们还需要创建一个manager,它用来收/发所有组成员的消息,这里需要说明的是manager具有广播的功能,即当某个agent想和其他agent对话时,只需要将消息放送给manager,而manager则负责将该消息广播给其他所有的agent, 这样就完成了不同agent之间的信息交流。

1.5 执行任务

当我们完成了三个agent以及groupchat和manager的创建,接下来就可以开始执行任务了,在执行任务时我们首先让user_proxy 发布一个人类的具体任务:

user_proxy.initiate_chat(manager,message="在arxiv上查找有关gpt-4的最新论文,并从中找出它们的潜在应用场景。"
)
从上面的代码中我们看到 user_proxy 是向manager发送了一个message,该message包含了任务的具体内容,接下来是任务执行的具体过程:

从上面的执行过程中我们看到所有的agent都是给manager发送消息,manager则起到了广播消息的作用,并且我们观察到代理们执行任务的流程大致分为以下这些步骤:

  • 第一步:user_proxy 发布一个任务
  • 第二步: Coder 生成 获取gpt4论文内容的python代码
  • 第三步: user_proxy 在本地执行Coder生成的代码,并打印相关论文的title和Summary等信息
  • 第四步:Product_manager 根据论文title和Summary,总结出若干条关于GPT-4应用场景的内容。
  • 第五步: Coder Product_manager给出的相关内容给与评价并在结尾处打上任务完成标记“TERMINATE” 表示任务完成。

总结

在今天介绍了AutoGEN中的多代理协作(Multi-Agent Collaboration)的基本原理,即当我们遇到较为复杂的任务时我们可以创建多个agent,并且为每个agent赋予不同的角色如(user_proxy, coder,pm)等,并且每个角色都要有角色说明(system_message),通过角色说明可以让LLM充分了解当前agent的作用,同时我们还创建了一个GroupChat组和组管理员manager,并且将所有的agent都放入GroupChat组中,这样通过manager的广播机制就可以实现不同agent之间的相互沟通,并且互相协作来完成一个较为复杂的任务,希望今天的内容对大家学习AutoGen有所帮助.

这篇关于AutoGen实战应用(二):多代理协作(Multi-Agent Collaboration)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/655172

相关文章

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2