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

news2024/9/26 1:19:56

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 autogen
 
config_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有所帮助.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1414870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web3:B站chainlink课程Lesson5遇到的小坑汇总

ethers代码 我用的ethers.js 6 ,和视频里一样用的是5的不用看代码部分 ethers.providers.JsonRpcProvider("server") //无了 ethers.JsonRpcProvider("server") //现在的wallet.getTransactionCount() //无了 wallet.getNonce() //现在的Big…

springboot的actuator

1、actuator简介 微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了异常如何快速定位是哪个环节出现了问题&am…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉语言导航

专属领域论文订阅 关注{晓理紫|小李子},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 分类: 大语言模型LLM视觉模型VLM扩散模型视觉…

字符串相关函数【超详细】(strcpy,strstr等string.h中的函数)

文章目录 strlen库中函数定义函数作用函数大概“工作”流程函数使用注意(要求)函数使用例举 strcpy库中函数定义函数作用函数使用注意(要求)函数大概“工作”流程函数使用例举 strcat库中函数定义函数作用函数使用注意&#xff08…

【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]

阅读导航 引言一、特殊类 --- 不能被拷贝的类1. C98方式:2. C11方式: 二、特殊类 --- 只能在堆上创建对象的类三、特殊类 --- 只能在栈上创建对象的类四、特殊类 --- 不能被继承的类1. C98方式2. C11方法 总结温馨提示 引言 在面向对象编程中&#xff0…

【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

kubeadm部署k8s1.27.2版本高可用集群(外部etcd集群带TLS认证)

文章目录 环境软件版本服务器系统初始化etcd 证书生成etcd集群部署负载均衡器部署部署k8s集群部署网络组件FAQ 环境 控制平面节点主机的配置最少是2C2G,否则kubeadm init的时候会报错 主机名IP组件系统os128192.168.177.128etcd、kubeadm、kube-apiserver、kube-controller-m…

Vue3 pinia全解(上)

pinia是什么? 如果你学过Vue2,那么你一定使用过Vuex。我们都知道Vuex在Vue2中主要充当状态管理的角色,所谓状态管理,简单来说就是一个存储数据的地方,存放在Vuex中的数据在各个组件中都能访问到,它是Vue生…

【学术论文写作 笔记02】 鲁棒性实验写作的行文逻辑

文章目录 一、声明二、行文思路三、示例范文一范文二 一、声明 自己总结的,有问题望指正! 二、行文思路 为什么要做鲁棒性测试怎么做实验结论对结果的解释 三、示例 PPT 范文一 2022, TIM, “A Robust and Reliable Point Cloud Recognition Netw…

Java零基础学习22:static关键字

编写博客目的:本系列博客均根据B站黑马程序员系列视频学习和编写目的在于记录自己的学习点滴,方便后续回忆和查找相关知识点,不足之处恳请各位有缘的朋友指正。 一、static的初步应用场景 我们开始时不使用static直接用public赋值&#xff…

租户认证系统中心设计与实践

租⼾认证中⼼设计、需求背景 1. 由于客⼾,租⼾之间缺乏严肃的关系,导致从经营⻆度看不清客⼾对于公司产品的真实使⽤情况,对于客⼾运营也造成⼀定影响。 2. 在各个业务产品中实际存在⼀些客⼾需要完善⾃⾝资料的场景,但这些场景收…

上位机图像处理和嵌入式模块部署(c/c++ opencv)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 opencv可以运行在多个平台上面,当然windows平台也不意外。目前来说,opencv使用已经非常方便了,如果不想自己编译…

ANSYS 2023 下载安装教程,附安装包和工具,轻松安装,无套路

前言 ANSYS是一款融结构、流体、电场、磁场、声场分析于一体的大型通用有限元分析(FEA)软件,能与多数计算机辅助设计软件接口,实现数据的共享和交换,如Creo,NASTRAN、Algor、IDEAS、AutoCAD等. 准备工作 1、Win10及以上系统 2、提前准备好…

Keepalived 深度解析:高可用性的精髓及实践指南

Keepalived 深度解析:高可用性的精髓及实践指南 Keepalived 深度解析:高可用性的精髓及实践指南Keepalived 的工作原理1. VRRP 协议概述2. Keepalived 的角色3. VRRP 协议详解 Keepalived 的使用指南1. 安装 Keepalived使用 Yum 安装本地安装方式 2. 配置…

电商系统设计到开发03 引入Kafka异步削峰

一、前言 系统设计:电商系统设计到开发01 第一版设计到编码-CSDN博客 接着上篇文章:电商系统设计到开发02 单机性能压测-CSDN博客 本篇为大制作,内容有点多,也比较干货,希望可以耐心看看 已经开发的代码&#xff0…

基于Python的全国主要城市天气数据可视化大屏系统

1 绪论 1.1 研究的目的与意义 近年来,气候变化引发全球范围内的关注。天气数据的采集和分析对于气候预测、生态环境保护等方面都起着至关重要的作用。同时,随着科技的不断发展,数据可视化已经成为了许多领域中不可或缺的一部分。基于此&…

外包干了9个月,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

解决 github.com port 443: Timed out 的问题

国内访问github.com总是那么不竟如人意,时而无法加载网页,时而等我们抽完了一根烟后,它还处于转圈的状态。 虽然国内有gitee.com等诸多的代码托管平台,但却鲜有国人愿意去呢?其中的缘由,想必也不用我多说&a…

机器学习 | 利用Pandas进入高级数据分析领域

目录 初识Pandas Pandas数据结构 基本数据操作 DataFrame运算 文件读取与存储 高级数据处理 初识Pandas Pandas是2008年WesMcKinney开发出的库,专门用于数据挖掘的开源python库,以Numpy为基础,借力Numpy模块在计算方面性能高的优势&am…

system_server进程创建流程

system_server 进程是 Zygote 进程 fork 出的第一个进程,它负责管理和启动整个 Framework 层,下面附上android系统启动流程图: 记得上一篇Zygote进程创建里面提到过,forckSystemServer创建system_server进程。 /frameworks/base/…