【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函数了。

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

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

相关文章

哪里下载Mac上最全面的系统清理工具,CleanMyMac X4.15中文版永久版资源啊

哪里下载Mac上最全面的系统清理工具,CleanMyMac X4.15中文版永久版资源啊,CleanMyMac X4.15中文版是一款全面的Mac系统优化工具。它能够扫描、检测并清理不需要的文件和应用程序,优化内存使用和磁盘空间,提高Mac的性能表现。此外&…

运行json文件变成api服务器模拟,json-server

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 json-server数据运行 json-server数据运行 安装json-server // 命令 路径 端口 "server": "json-server ./server/data.json --port 8080",

LeetCode 2673. 使二叉树所有路径值相等的最小代价【贪心】1917

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

C语言指针总结(完结篇)

前言 这篇博客终于迎来了指针博客的大结局,本篇主要分析习题来回顾之前的指针总结的知识点,这篇博客的题有点绕,哈哈算是经典了 个人主页:小张同学zkf 若有问题 评论区见 感兴趣就关注一下吧 目录 1. sizeof和strlen的对比 1.1 …

Python算法100例-3.6 自守数

1.问题描述2.问题分析3.算法设计4.求给定数的位数5.分离给定数中的最后几位6.确定程序框架7.完整的程序 1.问题描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如, 5 2 25 , 2 5 2 625 , 7 6 2 5776 &#xff0c…

oss-fuzz-gen:一款基于LLM的模糊测试对象生成与评估框架

关于oss-fuzz-gen oss-fuzz-gen是一款基于LLM的模糊测试对象生成与评估框架,该工具可以帮助广大研究人员使用多种大语言模型(LLM)生成真实场景中的C/C项目以执行模糊测试。 该工具基于Google的OSS-Fuzz平台实现其功能,并对生成的…

参加美国大学生数学建模大赛,Matlab和Python该怎么选?

经常有小伙伴在数学建模竞赛会问到,MATLAB和Python到底哪个更好?这个问题一直困惑很多同学,今天数乐君来给大家从实用型来综合分析一下: 首先从两者各自的应用做个对比。 一、python的优势 Python相对于Matlab最大的优势&#…

光线追踪11 - Positionable Camera(可定位相机)

相机和介质一样,调试起来很麻烦,所以我总是逐步开发我的相机。首先,我们允许可调节的视野(fov)。这是渲染图像从一边到另一边的视觉角度。由于我们的图像不是正方形的,水平和垂直的视野是不同的。我总是使用…

初次实战SQL注入

目录 1.判断漏洞是否存在 2.判断注入类型(数字型/字符型) 3.猜列数 4.联合查询判断回显位 6.获取数据库表明 此实验为本人学习内容,从未攻击任何网站!!!请伙伴们同样遵纪守法!!…

转录组总结

1. 软件安装 2.转录组分析步骤: ① 建立环境 #建立python2.7的环境,大部分的转录组信息都需要在Python2的环境下进行 conda create -n py2env python2.7 source activate py2env ② 获取fastqc报告 #单个报告 fastqc -t 15 /home/yinwen/biosoft/DN…

2024年数据库系统工程师全套资料

2024年5月数据库系统工程师全套视频、历年真题及解析、历年真题视频解析、教材、模拟题、重点笔记等资料 1、2023年5月、2022年5月、2021年5月数据库系统工程师全套基础精讲视频。2024年5月全套精讲视频持续更新中。 2、数据库系统工程师2004-2023年历年真题及解析文档&#x…

如何在Win系统部署Tomcat服务并实现远程访问内网站点

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学…

读架构整洁之道的一些感悟

做产品开发时,我们经常跌落在一种无法打破的轮回中。 我们经常说,产品上线最重要,可以未来再重构代码, 但是结果大家都知道,产品上线以后重构工作就再没人提起了。首先,线上跑的好好的,动出问题…

动态规划(算法竞赛、蓝桥杯)--树形DP树的中心

1、B站视频链接&#xff1a;E34 树形DP 树的中心_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N20010; int n,a,b,c,ans2e9; struct edge{int v,w;}; vector<edge> e[N]; int d1[N],d2[N],path[N],up[N];//path记录d1 void dfs1(in…

【Vue】sessionStorage存取数据

一. 需求 1.1 模板 Vab Admin Pro 1.2 组件 ElementUI 1.3 阐述 列表页面搜索【关键词】点击【查询】后&#xff0c;点击【查看】按钮跳转到【详情页】&#xff0c;详情页【返回】【保留原搜索关键词】 原图 搜索查询【关键词】 详情 返回后【保留】【搜索查询关键词…

潜水耳机哪个牌子好?认准这几个游泳耳机品牌就对了!

在科技日益发达的今天&#xff0c;人们对于运动设备的需求也在不断提升。作为一项独特的水上运动&#xff0c;潜水爱好者们对耳机的要求也越来越高。一款优秀的潜水耳机不仅能够提供卓越的防水性能和舒适度&#xff0c;还必须具备出色的音质。那么&#xff0c;在众多品牌中&…

2024宠物行业未来发展趋势:京东宠物健康(宠物营养保健和医疗)市场品类数据分析报告

近段时间&#xff0c;广州某知名宠物医院的医疗事故正在被大众热议&#xff0c;也让越来越多从业者开始关心宠物医疗行业的未来形势。 在2022年下半年&#xff0c;京东平台专门设立了一个一级大类目&#xff1a;宠物健康&#xff08;将其从原本的宠物生活类目中独立出来&#…

【C++】c++入门之递归上 数值类

文章目录 前言一、 递归1.1 基本概念1.2 递归的过程1.3 使用场景 二、例题讲解问题一&#xff1a;1002 - 编程求解123...n问题二&#xff1a;1241 - 角谷猜想问题三&#xff1a;1108 - 正整数N转换成一个二进制数问题四&#xff1a;1088 - 求两个数M和N的最大公约数 三、练习问…

Chrome禁止自动升级

一、关闭计划任务 1、首先我们需要右键点击我的电脑&#xff0c;在打开的选项里选择管理。   2、在打开的对话框中选择任务计划程序。   3、在任务计划程序库中找到两个和chrome自动更新相关的任务计划GoogleUpdateTaskMachineCore与GoogleUpdateTaskMachineUA。     4…

onlyOffice-windows 安装说明(二)

onlyoffice windows 安装 onlyoffice 支持多个平台比如&#xff1a;Windows Server、Linux、Docker 以下内容是对官网安装说明做了简单翻译&#xff0c;仅供参考&#xff0c;原文链接地址参见文末。 社区版允许您在本地服务器上安装ONLYOFFICE文档&#xff0c;并将在线编辑器…