【MetaGPT】多智能体协作——你画我猜(文字版)

多智能体协作

本篇将学习 MetaGPT中的 Environment 、 Team 组件。

1. Muti Agent 概念概述

  • 多智能体系统 (Multi-Agent System, MAS) 是由一群具有一定自主性、协同性和学习能力的智能体组成的系统。
  • 智能体在环境中相互协作,以达到某种目标或完成特定任务。

2. 多智能体组件介绍

2.1 Environment

Env环境示例代码

  • 概念: Environment 是多智能体系统中的一个核心概念,类似于强化学习中的环境。它为智能体提供了一个交互和通信的平台。
  • 组成:
    • desc: 描述环境信息。
    • roles: 指定环境中的角色及其状态。
    • members: 表示环境中的角色及其对应的状态。
    • history: 记录环境中发生的消息。
  • 功能:
    • 智能体可以向环境发布消息。
    • 智能体可以被其他角色观察。
环境的具体实现
  • 在 MetaGPT 中,Environment 类负责管理智能体的活动和信息交流。
  • 环境能够承载一批角色,角色可以发布消息,并可以被其他角色观察。
环境中的角色运行
  • Environment 类中的 run 方法负责处理环境中所有角色的信息交互。
  • 该方法按照角色声明的顺序依次执行每个角色的 run 方法。
角色行为
  • 角色首先将接收到的信息存入其 msg_buffer
  • 根据观察结果进行思考和决策,然后执行相应的动作。
  • 动作执行结果将被发送回环境,并由环境传递给其他订阅者。

理解

  • Environment 作为多智能体系统的基础设施,为智能体之间的交互和通信提供了必要的平台。
  • 智能体通过发布和订阅消息的方式在环境中进行协作,这有助于它们在完成各自任务的同时,保持整个系统的协调和效率。

点此下滑到Environment代码实践 👇

2.2 Team

Team 是基于 Environment 之上的二次封装,为多智能体活动提供了一个更为高级的抽象和管理工具。Team 不仅包含了 Environment 的所有功能,还增加了一些额外的组件和方法,以支持更为复杂的多智能体协作任务。

在这里插入图片描述

Team 类的主要组件包括:

  1. env:一个 Environment 实例,用于智能体的即时消息交互。
  2. investment:用于管理团队成本,即限制 token 花费。
  3. idea:用于指定团队接下来要围绕的工作或目标。

Team 类提供的一些主要方法包括:

  1. hire:向团队中添加员工角色。
  2. invest:控制团队预算。
  3. run_project:根据用户需求启动项目。
  4. run:运行团队直到指定轮数或预算耗尽。

在 Team 运行时,首先将调用 run_project 方法给智能体们一个需求,接着在 n_round 的循环中,重复检查预算与运行 env,最后返回环境中角色的历史对话。

尽管 Team 类只是在 Env 上的简单封装,但它向我们展示了,我们该如何向多智能体系统发布启动消息以及引入可能的人类反馈。通过 Team,我们可以更方便地管理和协调多智能体团队,实现更为复杂和高效的任务协作。

3. 代码实现

在第一篇环境配置中,我们提供了Team封装的使用,这里我们仅基于Environment,不使用封装的Team进行多智能体的协作。

项目思路

为了实现一个文字版的你画我猜,我们需要 一个猜测者和一个描述者。

  1. 开始时,用户给出一个物品词,这个物品词将被传递给描述者。
  2. 描述者接收到用户给出的物品词后,将其转换为一个描述。然后,描述者使用 PassDescription 动作将描述传达给猜测者。
  3. 猜测者接收到描述后,使用 GuessObject 动作进行猜测。而描述者监听猜测者的描述信息,提示是否正确。

动作定义

我们先进行基本动作定义,在此之前先导包

from metagpt.actions import Action, UserRequirement
from metagpt.logs import logger
from metagpt.roles import Role
from metagpt.schema import Message
from metagpt.environment import Environment

动作比较单一,就是猜物品、描述物品。

# 定义新的动作类,用于猜测物体名称
class GuessObject(Action):name: str = "GuessObject"# 异步执行猜测物体名称的动作async def run(self, obj_desc: str):# 构造提示模板,要求模型根据提供的物体描述猜测物体名称prompt = f"根据以下描述猜测物体名称:\n{obj_desc}\n 你的猜测是?"# 使用_aask方法请求大模型进行猜测,并将结果返回rsp = await self._aask(prompt)return rsp# 定义新的动作类,用于向猜测者传达物体描述
class PassDescription(Action):name: str = "PassDescription"# 异步执行传达物体描述的动作async def run(self, obj_desc: str):# 构造提示模板,要求模型根据提供的物体描述构造传达信息prompt = f"请根据以下描述向猜测者传达信息:\n{obj_desc}\n 让猜测者猜猜是什么。你提供的信息是?"# 使用_aask方法请求大模型进行传达,并将结果返回rsp = await self._aask(prompt)return rsp

角色定义

描述者(Describer)

描述者负责接收用户给出的物品词,并将其转换为可供猜测者理解的描述。


class Describer(Role):name: str = "Describer"profile: str = "描述者"def __init__(self, **kwargs):super().__init__(**kwargs)self.set_actions([PassDescription])self._watch([GuessObject])async def _act(self) -> Message:logger.info(f"{self._setting}: ready to {self.rc.todo}")todo = self.rc.todo# 获取所有记忆msg = self.get_memories()# 构造提示模板并请求大模型进行信息传达description = await PassDescription().run(msg)# 创建消息对象并返回msg = Message(content=description, role=self.profile,cause_by=type(todo))return msg

描述者首先获取所有记忆,然后构造一个提示模板,请求大模型进行信息传达。将得到的描述内容放入消息对象中,并返回给猜测者。

猜测者(Guesser)

猜测者基于描述者提供的描述,猜测用户心中所想的物品词。


class Guesser(Role):name: str = "Guesser"profile: str = "猜测者"def __init__(self, **kwargs):super().__init__(**kwargs)self.set_actions([GuessObject])self._watch([PassDescription])async def _act(self) -> Message:logger.info(f"{self._setting}: ready to {self.rc.todo}")todo = self.rc.todo# 获取所有记忆msg = self.get_memories()print("猜测者拿到的msg : ", msg)# 构造提示模板并请求大模型进行猜测guess = await GuessObject().run(msg)# 创建消息对象并返回msg = Message(content=guess, role=self.profile,cause_by=type(todo))return msg

猜测者首先获取所有记忆,并打印出来以便调试。然后,构造一个提示模板,请求大模型进行猜测。将得到的猜测内容放入消息对象中,并返回给描述者。

环境配置

在运行的主函数中,我们主要按照如下流程执行:

主函数执行

环境初始化

首先,我们创建一个 Environment 实例,命名为 classroom。这个环境将管理游戏中所有角色的交互。

创建并配置角色

然后,我们创建两个角色:describer(描述者)和 guesser(猜测者)。这两个角色分别负责接收和传达物品描述,以及基于这些描述进行猜测。

发布游戏主题

接下来,我们使用 classroom.publish_message 方法发布游戏主题。这个方法允许我们向环境中的所有角色发送消息。在这个例子中,我们向描述者发送了一个包含物体“葡萄”的主题。

运行游戏

游戏运行在一个循环中,该循环会在指定轮数(n_round)内重复执行。在每次循环中,我们调用 classroom.run 方法来处理所有角色的动作。这个方法会按照顺序执行每个角色的 _act 方法,即他们的动作逻辑。

记录游戏历史

在每次循环后,我们打印出环境的历史记录,以便跟踪游戏的进展。

# 定义游戏的主要函数
async def main(topic: str, n_round=5):# 创建角色并添加到环境describer = Describer()guesser = Guesser()classroom.add_roles([describer, guesser])# 发布游戏主题classroom.publish_message(Message(role="Human", content=topic, cause_by=UserRequirement,send_to='Describer'),peekable=False,)# 运行游戏while n_round > 0:await classroom.run()print("history : ", classroom.history)n_round -= 1# 返回游戏历史记录return classroom.history# 运行游戏
asyncio.run(main(topic=' 物体 “葡萄” '))

至此,执行之后我们可以看到运行效果:

在这里插入图片描述

  • 由于猜测者只观察watch描述者的动作,所以他的是仅有描述,没有人物给出的答案的。

  • 如果我们输出classroom.history,则会看到第一条记录就是Human给出的答案。

  • 如果刚刚直接跳过了team的部分,也可以点此上滑到Team 介绍 上 。在构造Team时,我们可以传入n_round进行直接执行,就不需要这种main函数了。

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

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

相关文章

阿珊解说Vue中`$route`和`$router`的区别

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ResponseStatusException

目录 概述: 综合实例: 继承 ResponseStatusException-自定义异常类 继承 ResponseStatusException-自定义响应头信息 继承 ResponseStatusException-定制更多异常处理逻辑 继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码…

C++之类(一)

1,封装 1.1 封装的引用 封装是C面向对象三大特性之一 封装的意义: 将属性和行为作为一个整体,表现生活中的事物 将属性和行为加以权限控制 1.1.1 封装意义一: 在设计类的时候,属性和行为写在一起,表…

事务失效的八种情况!!!!

一、非publi修饰的方法。 /*** 私有方法上的注解,不生效(因私有方法Spring扫描不到该方法,所以无法生成代理)*/ Transactional private boolean test() {//test code }二、类内部访问。 类内部非直接访问带注解标记的方法 B&…

类初步认识与对象

一,对于面向对象的认识 Java是一门面向对象的语言,一切都可以称为对象。将一个大象装进冰箱,甭管步骤多复杂,大象便是对象;将牛奶放进冰箱,牛奶便是对象;你我均是对像。 再比如洗一个衣服&…

如何在Linux中安装ARM交叉环境编译链

安装ARM交叉环境编译链过程如下: 首先创建一个文件夹如下: mkdir -p Linux_ALPHA/toolcahin然后将arm交叉编译工具链安装包拖到Linux中如下: 先输入mv 拖入的安装包即可 mv /var/run/vmblock-fuse/blockdir/pXeysK/gcc-4.6.4.tar.xz .直接…

进程:守护进程

一、守护进程的概念 守护进程是脱离于终端控制,且运行在后端的进程。(孤儿进程)守护进程不会将信息显示在任何终端上影响前端的操作,也不会被终端产生的任何信息打断,例如(ctrlc).守护进程独立…

【数据结构】哈希

在一个数据序列中查找某一个数据元素,是数据管理时经常涉及的,通常以比较的方式来完成,典型的案例有无序序列的暴力查找(O(N))、有序序列的二分查找(O(logN))、平衡搜索树(O(logN)&a…

融合软硬件串流多媒体技术的远程控制方案

远程技术已经发展得有相当水平了,在远程办公,云游戏,云渲染等领域有相当多的应用场景,以向日葵,todesk rustdesk等优秀产品攻城略地,估值越来越高。占据了通用应用的方方面面。 但是细分市场,还…

试用Claude3

1 简介 好消息是,2024 年 3 月 4 日发布了 Claude3,据传比 GPT-4 更好,snooet 版本可以免费试用,坏消息是我们这儿不能用。 在官网注册时,需要选择国家并使用手机接收短信验证码。而在选项中没有中国这个选项。即使成…

IT外包怎样帮助企业控制成本?

在当今激烈的商业竞争中,企业不仅需要保持创新,还需要有效控制成本。IT外包作为一种管理模式,成为许多企业降低成本的得力工具。究竟IT外包如何帮助企业控制成本呢? 首先,IT外包在减少人力资源成本方面发挥了至关重要的…

【微服务生态】Nginx

文章目录 一、概述二、Nginx 的安装三、常用命令四、Nginx 配置4.1 反向代理配置(1)反向代理实例1(2)反向代理实例2 4.2 负载均衡配置4.3 动静分离4.4 集群配置 五、nginx 原理与优化参数配置 一、概述 本次为简易版,…

3.6 day1 FreeRTOS

1.总结keil5下载代码和编译代码需要注意的事项 注意要将魔术棒的的debug选项中的setting中的flashdownload中的reset and run 勾选上,同时将pack中的enable取消勾选 2.总结STM32Cubemx的使用方法和需要注意的事项 可以通过功能列表对引脚进行设置,并且可…

调用Mybatis plus中的saveBatch方法报找不到表的问题

1.问题现象 在用Mybatis plus开发的项目中,用自带的API批量保存的方法saveBatch操作时,发现报没有找到表的错误。 错误日志截图如下: 表实际是存在的,且发现其他的方法都没有问题,包括save、update等单个的方法&…

springcloud2022 feign超时时间配置

spring:application:name: order-webcloud:openfeign:client:config:default:connectTimeout: 60000readTimeout: 60000 默认connection10秒,readTimeout 60秒

C# Mel-Spectrogram 梅尔频谱

目录 介绍 Main features Philosophy of NWaves 效果 项目 代码 下载 C# Mel-Spectrogram 梅尔频谱 介绍 利用NWaves实现Mel-Spectrogram 梅尔频谱 NWaves github 地址:https://github.com/ar1st0crat/NWaves NWaves is a .NET DSP library with a lot …

计算机mfc140.dll文件缺失的修复方法分析,一键修复mfc140.dll

电脑显示mfc140.dll文件缺失信息时,不必担心,这通常是个容易解决的小问题。接下来让我们详细探究并解决mfc140.dll文件缺失的状况。以下将详述相应的解决方案,从而帮助您轻松克服这一技术难题。通过几个简单步骤,即可恢复正常使用…

elementUI表单验证遇到的问题

1.同一个addForm表单,同样的验证规则,有的输入框在没填写时能够显示红色,有的却毫无反应 解决方案:去elementUI官网看了一下验证表单的规则及属性,第一句就写 Form 组件提供了表单验证的功能,只需要通过 r…

网工内推 | 上市公司售前,大专以上即可,最高15K*13薪,补贴多

01 北京神州新桥科技有限公司 招聘岗位:售前工程师 职责描述: 1、完成项目的售前技术支持工作; 2、 配合销售进行新产品及解决方案的推广工作; 3、 配合销售完成用户的售前技术交流方案准备、现场技术交流、技术方案宣讲等工作…

在PyCharm中使用Jupyter Notebooks实现高效开发

大家好,在数据科学领域,Jupyter Notebooks已成为一种流行的工具,许多专业人士都在使用它来进行数据分析、机器学习等任务。有时,我们希望在更加强大、功能齐全的IDE环境中运行Jupyter笔记本,以提高工作效率和开发体验。…