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的最新论文,并从中找出它们的潜在应用场景。要实现这样一个任务一般情况下可能需要如下这些步骤
- 从论文网站arxiv上下载关于gpt-4的最新论文。
- 然后读取这些论文的主要内容。
- 根据论文内容罗列出关于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的最新论文,并从中找出它们的潜在应用场景。"
)





从上面的执行过程中我们看到所有的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)
AutoGen是微软推出的一个全新工具,它用来帮助开发者创建基于大语言模型(LLM)的复杂应用程序. AutoGen能让LLM在复杂工作流程启用多个角色代理来共同协作完成人类提出的任务。在我之前的一篇博客: AutoGen实战应用(一):代码生成、执行和调试 中我们通过一…...
c++文件操作 (1) -- 读写文件
目录 为什么使用文件操作 文件输入流和输出流 -- 相对于内存而言 文件操作 1. 文件操作常用类以及头文件 2. 文件输入流(写文件操作) 1. 写文本文件 1)文件操作是使用对象来实现的 2)文件输出 3)打开文件 open函数 ÿ…...
PHP操作Mysql记录数多引发的空白错误
1 错误由来 php操作三张表,一张表有近四十万条记录,另外两张表记录数在三万左右,三张表又关联。应用左连接left join。 $qLStr "select pu.pd_no, pu.common_name, pu.purchase_cost, pu.medication_area, pu.total_dosage, pu.contro…...
transformer和vit学习笔记
以下记录自己对transformer的学习笔记,可能自己看得懂【久了自己也忘了看不懂】,别人看起来有点乱。以后再优化文档~ 小伙伴请直接去看学习资源: Transformer的理解T-1_哔哩哔哩_bilibili 首先,时序处理:一些模型的出…...
人脸识别 FaceNet人脸识别(一种人脸识别与聚类的统一嵌入表示)
人脸识别 FaceNet人脸识别(一种人脸识别与聚类的统一嵌入表示) FaceNet的简介Facenet的实现思路训练部分 FaceNet的简介 Facenet的实现思路 import torch.nn as nndef conv_bn(inp, oup, stride 1):return nn.Sequential(nn.Conv2d(inp, oup, 3, stride…...
Python tkinter (6) Listbox
Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 GUI 目录 Listbox 创建listbox 添加元素…...
优雅的python(二)
🌈个人主页:小田爱学编程 🔥 系列专栏:c语言从基础到进阶 🏆🏆关注博主,随时获取更多关于c语言的优质内容!🏆🏆 😀欢迎来到小田代码世界~ &#x…...
Git安装详细步骤
目录 1、双击安装包,点击NEXT编辑 2、更改安装路径,点击NEXT 3、选择安装组件 4、选择开始菜单页 5、选择Git文件默认的编辑器 6、调整PATH环境 7、选择HTTPS后端传输 8、配置行尾符号转换 9、配置终端模拟器与Git Bash一起使用 10、配置额外…...
首发:2024全球DAO组织发展研究
作者,张群(专注DAO及区块链应用研究,赛联区块链教育首席讲师,工信部赛迪特邀资深专家,CSDN认证业界专家,微软认证专家,多家企业区块链产品顾问) DAO(去中心化自治组织&am…...
【大数据】详解 Flink 中的 WaterMark
详解 Flink 中的 WaterMark 1.基础概念1.1 流处理1.2 乱序1.3 窗口及其生命周期1.4 Keyed vs Non-Keyed1.5 Flink 中的时间 2.Watermark2.1 案例一2.2 案例二2.3 如何设置最大乱序时间2.4 延迟数据重定向 3.在 DDL 中的定义3.1 事件时间3.2 处理时间 1.基础概念 1.1 流处理 流…...
【数据结构1-2】二叉树
树形结构不仅能表示数据间的指向关系,还能表示出数据的层次关系,而有很明显的递归性质。因此,我们可以利用树的性质解决更多种类的问题。 但是在平常的使用中,我们并不需要使用这么复杂的结构,只需要建立一个包含int r…...
ajax点击搜索返回所需数据
html 中body设置(css设置跟进自身需求) <p idsearch_head>学生信息查询表</p> <div id"div_1"> <div class"search_div"> <div class"search_div_item"> …...
Redis6基础知识梳理~
初识NOSQL: NOSQL是为了解决性能问题而产生的技术,在最初,我们都是使用单体服务器架构,如下所示: 随着用户访问量大幅度提升,同时产生了大量的用户数据,单体服务器架构面对着巨大的压力 NOSQL解…...
在Python中如何使用集合进行元素操作
目录 1. 创建集合 2. 添加或删除元素 3. 集合运算 4. 其他集合操作 总结 在Python中,集合(set)是一种基本的数据结构,用于存储无序且唯一的元素。这意味着集合中的每个元素都是独一无二的,且集合不保持任何元素的…...
2024年阿里云幻兽帕鲁Palworld游戏服务器优惠价格表
自建幻兽帕鲁服务器租用价格表,2024阿里云推出专属幻兽帕鲁Palworld游戏优惠服务器,配置分为4核16G和4核32G服务器,4核16G配置32.25元/1个月、10M带宽66.30元/1个月、4核32G配置113.24元/1个月,4核32G配置3个月339.72元。ECS云服务…...
Atlassian Confluence Data Center and Server 权限提升漏洞复现(CVE-2023-22515)
0x01 产品简介 Atlassian Confluence是一款由Atlassian开发的企业团队协作和知识管理软件,提供了一个集中化的平台,用于创建、组织和共享团队的文档、知识库、项目计划和协作内容。是面向大型企业和组织的高可用性、可扩展性和高性能版本。 0x02 漏洞概述 Atlassian Confl…...
打开 IOS开发者模式
前言 需要 1、辅助设备:苹果电脑; 2、辅助应用:Xcode; 3、准备工作:苹果手机 使用数据线连接 苹果电脑; 当前系统版本 IOS 17.3 通过Xcode激活 两指同时点击 Xcode 显示选择,Open Develop…...
【C语言刷题系列】交换两个变量的三种方式
文章目录 1.使用临时变量(推荐) 2.相加和相减的方式(值较大时可能丢失数据) 3.按位异或运算 本文所属专栏C语言刷题_倔强的石头106的博客-CSDN博客 两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的…...
架构师之路(十五)计算机网络(网络层协议)
前置知识(了解):计算机基础。 作为架构师,我们所设计的系统很少为单机系统,因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 ARP协议 地址解…...
【JSON2WEB】03 go的模板包html/template的使用
Go text/template 是 Go 语言标准库中的一个模板引擎,用于生成文本输出。它使用类似于 HTML 的模板语言,可以将数据和模板结合起来,生成最终的文本输出。 Go html/template包实现了数据驱动的模板,用于生成可防止代码注入的安全的…...
别再只盯着wx.login了!SpringBoot后端实战:用getPhoneNumber接口搞定小程序用户手机号绑定
微信小程序用户手机号绑定:SpringBoot后端深度实践指南 在当今移动互联网生态中,微信小程序已成为连接用户与服务的重要桥梁。对于需要强实名认证或直接触达用户的业务场景(如电商交易、金融服务、政务办理等),仅依赖w…...
百度网盘直链解析工具:突破下载限速的Python解决方案
百度网盘直链解析工具:突破下载限速的Python解决方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾经为百度网盘的下载速度而烦恼?作为国内最…...
生物信息学逆向解析mRNA疫苗序列:从公开数据组装BNT-162b2与mRNA-1273的基因蓝图
1. 项目概述与背景解析 最近在生物信息学和疫苗研究领域,一个名为“NAalytics/Assemblies-of-putative-SARS-CoV2-spike-encoding-mRNA-sequences-for-vaccines-BNT-162b2-and-mRNA-1273”的项目引起了我的注意。这个项目标题看起来很长,但核心非常明确&…...
防火门安装与验收要点|闭门器、密封条、顺序器缺一不可
防火门安装与验收要点一、必备配件(缺一不可)闭门器:自动关门,火灾常态闭合防火密封条:遇火膨胀,隔烟阻火顺序器:双扇门专用,保证先后闭合二、安装要点门框墙体嵌实牢固,…...
VectorDBBench:向量数据库性能基准测试工具详解与实战
1. 项目概述:向量数据库性能测试的“瑞士军刀”如果你正在评估或使用向量数据库,那么你一定遇到过这个灵魂拷问:“这么多产品,到底哪个最适合我的场景?”是选名声在外的老牌劲旅,还是选后起之秀的专精选手&…...
基于RP2040与CircuitPython的HDMI倒计时器:RTC与DVI原生输出实践
1. 项目概述与核心价值如果你手头有一块带HDMI输出的微控制器开发板,比如Adafruit的Feather RP2040 DVI,又恰好需要一个能摆在桌面上、精确到秒的倒计时器,那么今天这个项目就是为你量身定做的。它不仅仅是一个简单的“Hello World”式显示应…...
构建个人知识库:从碎片化代码到结构化知识体系
1. 项目概述:从“ClawCode”看个人知识库的构建与价值最近在和一些开发者朋友交流时,发现一个普遍现象:大家电脑里都散落着无数代码片段、配置脚本、临时笔记和项目心得。这些“数字碎片”价值巨大,但往往因为缺乏有效的组织&…...
告别闪烁屏!瑞芯微RK3399开发板Debian系统烧写保姆级教程(含DriverAssistant v5.1.1 + AndroidTool v2.69)
RK3399开发板Debian系统烧写实战:从屏幕闪烁到完美显示的终极解决方案 当你在RK3399开发板上成功烧写Debian系统后,最期待的莫过于看到系统稳定运行的画面。然而,不少开发者却遭遇了屏幕闪烁的困扰——这个问题看似简单,背后却隐藏…...
OpenClaw量化回测性能调优指南:从数据加载到并行计算的实战优化
1. 项目概述:从开源工具到性能调优的艺术最近在跟几个做量化交易的朋友聊天,他们都在为一个问题头疼:策略回测和实盘执行的速度。动辄几十个G的历史数据,复杂的因子计算,加上高频的模拟交易,一套流程跑下来…...
005 DevEco Studio OHPM同步404报错 解决文档
[cs]005 DevEco Studio OHPM同步404报错 解决文档 文档简介 本文解决鸿蒙开发中新建空白项目自动触发ohpm install时报错:ohos/hypium、ohos/hamock包404找不到、拉取依赖失败问题。 核心原则:不修改项目任何自带文件、不删除系统生成依赖、不改动业务代…...
