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 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.mfbz.cn/a/353820.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CTF CRYPTO 密码学-6

题目名称:敲击 题目描述: 方方格格,不断敲击 “wdvtdz qsxdr werdzxc esxcfr uygbn” 解题过程: step1:根据题目描述敲击,wdvtdz对应的字符为x step2:依此类推r,z,o&…

使用 create-react-app 创建 react 应用

一、创建项目并启动 第一步:全局安装:npm install -g create-react-app 第二步:切换到想创建项目的目录,使用命令create-react-app hello-react 第三步:进入项目目录,cd hello-react 第四步:启…

Pyecharts 风采:从基础到高级,打造炫酷象形柱状图的完整指南【第40篇—python:象形柱状图】

文章目录 引言安装PyechartsPyecharts象形柱状图参数详解1. Bar 类的基本参数2. 自定义图表样式3. 添加标签和提示框 代码实战:绘制多种炫酷象形柱状图进阶技巧:动态数据更新与交互性1. 动态数据更新2. 交互性设计 拓展应用:结合其他图表类型…

Android 基础技术——列表卡顿问题如何分析解决

笔者希望做一个系列,整理 Android 基础技术,本章是关于列表卡顿问题如何分析解决 onBindViewHolder 优化 是否有耗时操作、重复创建对象、设置监听器、findViewByID、局部的动画对象等操作 是否存在内存泄漏 发生内存泄露,会导致一些不再使用…

工业4.0开放平台通信 统一架构OPC UA的一种测试方法

工业4.0和工业物联网(Industrial Internet of Things, IIoT)的核心挑战在于设备、机器以及来自不同行业服务之间的安全和标准化的数据和信息交换。 2016年11月工业4.0平台发布了指导纲要《工业4.0产品需要实现哪些准则》,即对于所有位于工业…

概念抽取:构建认知基础的关键步骤

目录 前言1 概念抽取任务定义1.1 概念知识图谱的关系定义1.2 实体与概念的紧密关联1.3 多样的概念关系 2 概念在认知中的重要角色2.1 语言理解的基础2.2 上下位关系的深化理解 3 概念抽取方法3.1 基于模板的抽取3.2 基于百科的抽取3.3 基于机器学习的方法 4 应用4.1 自然语言理…

一行命令在 wsl-ubuntu 中使用 Docker 启动 Windows

在 wsl-ubuntu 中使用 Docker 启动 Windows 0. 背景1. 验证我的系统是否支持 KVM?2. 使用 Docker 启动 Windows3. 访问 Docker 启动的 Windows4. Docker Hub 地址5. Github 地址 0. 背景 我们可以在 Windows 系统使用安装 wsl-ubuntu,今天玩玩在 wsl-ub…

【Web前端实操16】雪碧图(CSS精灵图)

雪碧图 CSS Sprite也叫CSS精灵图、CSS雪碧图,是一种网页图片应用处理方式。它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去 雪碧图一般会给一个完整的图片,主要利用background-position 属性设置背景图像的起始位置。 优点 减少图片的字…

API网关-Apinto压缩包方式自动化安装配置教程

文章目录 前言一、Apinto安装教程1. 复制脚本2. 增加执行权限3. 执行脚本4. Apinto命令4.1 启动Apinto4.2 停止Apinto4.3 重启Apinto4.4 查看Apinto版本信息4.5 加入Apinto集群4.6 离开Apinto集群4.7 查看Apinto节点信息 5. 卸载Apinto 二、Apserver(Apinto Dashboard V3)安装教…

【css揭秘】

文章目录 背景与边框半透明边框多重边框box-shadowoutline 背景定位background-positionbackground-origincalc() 条纹背景水平条纹 形状圆形圆柱自适应的椭圆半椭圆四分之一椭圆 背景与边框 半透明边框 目标:给一个容器设置一层白色背景和一道半透明白色边框 写…

树莓派基础应用:智能家居监控系统

引言: 随着智能家居的普及,家居安全与监控逐渐成为人们关注的焦点。树莓派作为一种功能强大的迷你计算机,为我们提供了实现智能家居监控系统的可能。在本篇博客中,我们将通过构建一个简单的智能家居监控系统,来探索树莓…

node学习过程中的终端命令

冷的哥们手真tm冷,打字都是僵的,屮 目录 一、在学习nodejs过程中用到的终端命令总结 一、在学习nodejs过程中用到的终端命令 node -v nvm install 20.11.0 nvm list nvm list available nvm on nvm -v nvm use 20.11.0 node加要运行的js文件路径 ps&a…

docker compose实现mysql一主多从

参考了很多博客,死磕了几天,最终跑起来了,不容易,晚上喝瓶82年可乐庆祝下。 1、整体文件结构,这里忽略log、conf、data映射目录 2、docker-compose.yml文件内容如下: version: 3.3 services:mysql-master…

黑马程序员-瑞吉外卖-day5

修改实体类 package com.itheima.reggie.entity;import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode;i…

JS之隐式转换与布尔判定

大家思考一下 [ ] [ ] ? 答案是空字符串 为什么呢? 当做加法运算的时候,发现左右两端存在非原始类型,也就是引用类型对象,就会对对象做隐式类型转换 如何执行的?或者说怎么查找的? 第一步&…

中国新能源汽车持续跑出发展“加速度”,比亚迪迎来向上突破

2023年已经过去,对于汽车圈而言,2023年是中国车市的分水岭,在这一年,中国汽车工业70年以来首次进入全球序列,自主品牌强势霸榜,销量首次超过合资车。要知道,这是自大众于1984年进入中国市场成立…

Android App开发-简单控件(3)——常用布局

3.3 常用布局 本节介绍常见的几种布局用法,包括在某个方向上顺序排列的线性布局,参照其他视图的位置相对排列的相对布局,像表格那样分行分列显示的网格布局,CommonLayouts以及支持通过滑动操作拉出更多内容的滚动视图。 3.3.1 线…

Jenkins上跑自动化项目,case出现错误时,导致项目运行时间过长,该如何处理?

1、方案一:Jenkins上调整 进入配置: 构建环境: 自行选择超时时间即可~ 2、方案二:代码调整【python】 安装插件:pytest-timeout 选择一:装饰器用法:将单个测试用例标记为超时&…

Qt6入门教程 12:QAbstractButton

目录 一.状态 二.信号 三.使用 1.自定义按钮 2.多选 3.互斥 QAbstractButton类实现了一个抽象按钮,并且让它的子类来指定如何处理用户的动作,并指定如何绘制按钮。QAbstractButton类是所有按钮控件的基类。 QAbstractButton提供…

【Docker】数据持久化 挂载

Docker的镜像是只读的,但是容器是可写的,我们可以将数据写入到容器,不过一旦容器删除数据将会丢 失,那么有什么办法能将数据进行持久化存储呢? ——在宿主机上开辟一块地方,存储内容和docker容器的存储内…
最新文章