使用MetaGPT 创建智能体(2)多智能体

先给上个文章使用MetaGPT 创建智能体(1)入门打个补丁:
补丁1: MeteGTP中Role和Action的关联和区别?这是这两天再使用MetaGPT时候心中的疑问,这里做个记录
Role(角色)和 Action(动作)是MetaGPT中的两个重要概念和对象,Role顾名思义也就是角色,这Role子类中表示一个独立的功能模块,一个Role里面调用多个Action;Action(动作)具体任务中的最小操作单元。
举个例子的话就是,一个讲师(Role),如果要讲课的话就需要备课(Action),开始讲课(Action),上课期间还有提问(Action),最后由多个讲师(Role)来完成整个学生上课的这个功能。
补丁2: 安装volcengine-python-sdk[ark]~=1.0.94报错
Could not build wheels for volcengine-python-sdk, which is required to install pyproject.toml-based projects
由于 Windows 系统有最长路径限制,导致安装失败,按照以下方式设置:
-
按下 Win+R ,输入 regedit 打开注册表编辑器。
-
设置 \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem 路径下的变量 LongPathsEnabled 为 1
再蹭个热度:
deepseek前段时间爆火,这里写个怎么在MetaGPT中使用deepseek(本地启动版),使用的话也很方便,第一启动ollama里面的deepseek模型,打开控制台,输入
ollama run deepseek-r1
等待模型下载运行就好,修改config2.yaml配置文件
llm:api_type: "ollama" # or azure / ollama / groq etc.model: "deepseek-r1" # or gpt-3.5-turbobase_url: "http://localhost:11434/api" # or forward url / other llm urlapi_key: "ollama"
然后就可以使用了,有一说一确实不错。
正文
多智能体指的就是创建多个智能体去进行执行任务,这也是实际业务中的常用处理。
多个智能体的使用大致3步,
1、定义多个Role,Action
2、Role中定义_watch监听相关Action
3、使用Team对象加入多个Role启动
在 MetaGPT 多智能体框架中,Team 对象是协调和管理多个智能体(Agent)协作的核心组件。它的作用类似于一个“虚拟团队”,负责组织智能体之间的交互、任务分配、通信协调,以及整体协作流程的控制。
Team 的核心作用
- 多智能体协作的容器
Team作为多个智能体的容器,集中管理智能体的生命周期(创建、销毁)、状态监控和资源分配。 - 任务分配与调度
将复杂任务拆解为子任务,并根据智能体的角色(Role)和能力(Skill)动态分配任务,确保高效协作。 - 通信与协调
管理智能体之间的通信(如消息传递、事件触发),避免冲突并确保信息同步。例如,在自动化客服系统中,协调“用户意图识别”和“工单生成”两个智能体的协作。 - 环境管理
提供共享的上下文环境(如全局数据、知识库),使智能体可以访问统一的信息源,避免重复计算或数据不一致。 - 容错与恢复
监控智能体运行状态,处理异常(如任务超时、逻辑错误),并触发恢复机制(如重试任务、切换备用智能体)。
代码
创建Role1和对应的Action1,第一个Role需要接收用户传来的指令,所以_watch监听用户UserRequirement消息,因为需要具体操作所以也不用重写_act函数(全部代码在最下面)
def parse_code(rsp):# r 定义原始字符串,忽略其中的所有转义字符pattern = r"```python(.*)```"match = re.search(pattern, rsp, re.DOTALL)code_text = match.group(1) if match else rspreturn code_textclass Action1(Action):name:str = "Action1"PROMPT_TEMPLATE:str = """ 编写一个python函数,可以 {instruction} """async def run(self, instruction: str):prompt = self.PROMPT_TEMPLATE.format(instruction=instruction)# 令 LLM 赋予这个动作能力rsp = await self._aask(prompt)# 解析返回内容code_text = parse_code(rsp)return code_text# 角色
class Role1(Role):name:str = "Role1"profile:str = "Role1"def __init__(self, **kwargs):super().__init__(**kwargs)self._watch([UserRequirement]) # 监听来自用户或其他智能体的重要上游消息self.set_actions([Action1])
编写Role2和Action2,因为需要等待Action的执行内容,所以_watch监听Action1
class Action2(Action):name:str = "Action2"PROMPT_TEMPLATE:str = """ 上下文:{context} 假设您已导入给定函数,则使用pytest为其编写{k}个单元测试。 """async def run(self, context: str, k:int=3):prompt = self.PROMPT_TEMPLATE.format(context=context, k=k)rsp = await self._aask(prompt)code_text = parse_code(rsp)return code_textclass Role2(Role):name:str = "Role2"profile:str = "Role2"def __init__(self, **kwargs):super().__init__(**kwargs)self.set_actions([Action2])self._watch([Action1]) # 监听来自用户或其他智能体的重要上游消息async def _act(self) -> Message:todo = self.rc.todocontext = self.get_memories() # 查找消息code_text = await todo.run(context, k=5) # 这里开始执行Action2的处理# role 消息角色# cause_by 专门用于追踪消息的触发来源,建立消息与动作(Action)之间的关联msg = Message(content=code_text, role=self.profile, cause_by=type(todo))return msg
最后Role3,Action3,监听Action2,监听是可以监听多个Action的
class Action3(Action):name:str = "Action3"PROMPT_TEMPLATE:str = """ 上下文:{context} 审查测试用例并提供一条关键意见: """async def run(self, context: str):prompt = self.PROMPT_TEMPLATE.format(context=context)rsp = await self._aask(prompt)return rspclass Role3(Role):name:str = "Role3"profile:str = "Role3"def __init__(self, **kwargs):super().__init__(**kwargs)self.set_actions([Action3])self._watch([Action2])
最后是运行,运行时创建Team对象,添加角色,然后运行
# 运行函数
async def main(idea:str,investment:float,n_round:int):# MetaGPT中的团队team = Team()# 添加角色team.hire([Role1(),Role2(),Role3()])# 注入资源 invest 属性用于设定或表示团队对某个任务或目标的资源投入程度team.invest(investment=investment)team.run_project(idea) # 启动团队协作流程await team.run(n_round=n_round)if __name__ == '__main__':asyncio.run(main('计算列表乘积的函数', 3.0, 3))
三个智能体
Role1,执行Action1,监听用户输入;
Role2,监听Action1,执行Action2;
Role3,监听Action2,执行Action3;
这就是多个智能体的合作使用,重点总结的话就是,监听_watch其他人,Team运行。
最后是全部代码
import asyncio
import refrom metagpt.actions import Action, UserRequirement
from metagpt.roles import Role
from metagpt.schema import Message
from metagpt.team import Team# 多个智能体案例
def parse_code(rsp):# r 定义原始字符串,忽略其中的所有转义字符pattern = r"```python(.*)```"match = re.search(pattern, rsp, re.DOTALL)code_text = match.group(1) if match else rspreturn code_textclass Action1(Action):name:str = "Action1"PROMPT_TEMPLATE:str = """ 编写一个python函数,可以 {instruction} """async def run(self, instruction: str):prompt = self.PROMPT_TEMPLATE.format(instruction=instruction)# 令 LLM 赋予这个动作能力rsp = await self._aask(prompt)# 解析返回内容code_text = parse_code(rsp)return code_text# 角色
class Role1(Role):name:str = "Role1"profile:str = "Role1"def __init__(self, **kwargs):super().__init__(**kwargs)self._watch([UserRequirement]) # 监听来自用户或其他智能体的重要上游消息self.set_actions([Action1])class Action2(Action):name:str = "Action2"PROMPT_TEMPLATE:str = """ 上下文:{context} 假设您已导入给定函数,则使用pytest为其编写{k}个单元测试。 """async def run(self, context: str, k:int=3):prompt = self.PROMPT_TEMPLATE.format(context=context, k=k)rsp = await self._aask(prompt)code_text = parse_code(rsp)return code_textclass Role2(Role):name:str = "Role2"profile:str = "Role2"def __init__(self, **kwargs):super().__init__(**kwargs)self.set_actions([Action2])self._watch([Action1]) # 监听来自用户或其他智能体的重要上游消息async def _act(self) -> Message:todo = self.rc.todocontext = self.get_memories() # 查找消息code_text = await todo.run(context, k=5) # 这里开始执行Action2的处理# role 消息角色# cause_by 专门用于追踪消息的触发来源,建立消息与动作(Action)之间的关联msg = Message(content=code_text, role=self.profile, cause_by=type(todo))return msgclass Action3(Action):name:str = "Action3"PROMPT_TEMPLATE:str = """ 上下文:{context} 审查测试用例并提供一条关键意见: """async def run(self, context: str):prompt = self.PROMPT_TEMPLATE.format(context=context)rsp = await self._aask(prompt)return rspclass Role3(Role):name:str = "Role3"profile:str = "Role3"def __init__(self, **kwargs):super().__init__(**kwargs)self.set_actions([Action3])self._watch([Action2])# 运行函数
async def main(idea:str,investment:float,n_round:int):# MetaGPT中的团队team = Team()# 添加角色team.hire([Role1(),Role2(),Role3()])# 注入资源,invest 属性用于设定或表示团队对某个任务或目标的资源投入程度team.invest(investment=investment)team.run_project(idea) # 启动团队协作流程await team.run(n_round=n_round)if __name__ == '__main__':# fire.Fire(main) 快速将 Python 对象(如函数、类、模块)转换为命令行接口(CLI)# main('编写一个计算列表乘积的函数', 3.0, 5)asyncio.run(main('计算列表乘积的函数', 2.0, 3))
相关文章:
使用MetaGPT 创建智能体(2)多智能体
先给上个文章使用MetaGPT 创建智能体(1)入门打个补丁: 补丁1: MeteGTP中Role和Action的关联和区别?这是这两天再使用MetaGPT时候心中的疑问,这里做个记录 Role(角色)和 Action&…...
C# 使用.NET内置的 IObservable<T> 和 IObserver<T>-观察者模式
核心概念 IObservable<T> 表示 可观察的数据源(如事件流、实时数据)。 关键方法:Subscribe(IObserver<T> observer),用于注册观察者。 IObserver<T> 表示 数据的接收者,响应数据变化。 三个核心…...
Redis——网络模型之IO讲解
目录 前言 1.用户空间和内核空间 1.2用户空间和内核空间的切换 1.3切换过程 2.阻塞IO 3.非阻塞IO 4.IO多路复用 4.1.IO多路复用过程 4.2.IO多路复用监听方式 4.3.IO多路复用-select 4.4.IO多路复用-poll 4.5.IO多路复用-epoll 4.6.select poll epoll总结 4.7.IO多…...
【dify实战】chatflow结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载
dify结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载 观看视频,您将学会 在dify下如何快速的构建一个chatflow,来完成数据分析工作;如何在AI的回复中展示可视化的图表;如何在AI 的回复中加入Excel报…...
vue3 传参 传入变量名
背景: 需求是:在vue框架中,接口传参我们需要穿“变量名”,而不是字符串 通俗点说法是:在网络接口请求的时候,要传属性名 效果展示: vue2核心代码: this[_keyParam] vue3核心代码&…...
裸金属服务器有什么用途?
裸金属服务器可以直接在硬件上运行应用程序和操作系统,不需要虚拟化层,裸金属服务器还会为企业提供一种高性能、高可靠性和高安全性的计算资源,通常运用在需要大量计算能力和数据处理能力的应用场景中,下面介绍一下裸金属服务器的…...
旅游特种兵迪士尼大作战:DeepSeek高精准路径优化
DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 随着假期的脚步日渐临近,环球影城等备受瞩目的主题游乐场,已然成为大人与孩子们心中不可或缺的节日狂欢圣地。然而,随之而来的庞大客流,却总让无数游客在欢乐的…...
【MySQL】第一弹——MySQL数据库结构与操作
目录 一. 数据库介绍1.1 什么是数据库1.2 为什么要使用数据库1.3 主流数据库1.3.1 关系型数据库1.3.2 非关系型数据库 二. MySQL 的结构2.1 MySQL服务器和客户端2.2 MySQL服务器是如何组织数据的 三. 数据库的操作3.1 创建数据库语法格式示例 3.2 查看数据库语法格式示例 3.3 使…...
Spring_MVC 快速入门指南
Spring_MVC 快速入门指南 一、Spring_MVC 简介 1. 什么是 Spring_MVC? Spring_MVC 是 Spring 框架的一个模块,用于构建 Web 应用程序。它基于 MVC(Model-View-Controller)设计模式,将应用程序分为模型(M…...
L38.【LeetCode题解】四数之和(双指针思想) 从汇编角度分析报错原因
目录 1.题目 2.分析 去重的代码 错误代码 3.完整代码 提交结果 1.题目 四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元…...
字符串系列一>最长回文子串
目录 题目:解析:代码: 题目: 链接: link 解析: 代码: class Solution {public String longestPalindrome(String s) {char[] ss s.toCharArray();int n ss.length;int begin 0;//返回结果的起始字符串…...
双击热备方案及不同方案的需求、方案对比
双击热备方案概述 一般实现双机热备的方案有三种,分别是共享存储双机热备方案、镜像双机热备方案、双机双柜双机热备方案,这三种方案对硬件要求不同,大家可以根据自身的业务应用特性来选择具体的双机热备方案以及对应的ServHA双机热备软件产品。 1、镜像双机热备 1.1镜像…...
Antd中使用Form.List且有Select组件,过滤问题
当在使用Form.List组件,且组件中有Select选项时,针对每一次选择,都要过滤掉那些已经选择过的选项,可能遇到的问题: 直接过滤会将每一个Select中的options选项都过滤掉,无法正常展示选择的选项 解决办法&a…...
VSCODE插值表达式失效问题
GET https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js net::ERR_CONNECTION_-CSDN博客 更换正确的vue域名 GET https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js net::ERR_CONNECTION_ <script src"https://unpkg.com/vue2.6.14/dist/vue.js"></sc…...
【失败】Gnome将默认终端设置为 Kitty
起因 一会儿gnome-terminal一会儿kitty终端,实在是受不了,决定取缔默认的gnome-terminal。 过程 在 Ubuntu 或 Debian 系统上: 确保 Kitty 已经安装。如果未安装,可以在终端中运行命令sudo apt install kitty -y进行安装。 使用系…...
蓝桥杯:连连看
本题大意要我们在一个给定的nxm的矩形数组中找出符合条件的格子 条件如下: 1.数值相同 2.两个横坐标和纵坐标的差值相等(由此可得是一个对角线上的格子) 那么根据以上条件我们可以用HashMap来解决这个问题,统计对角线上数值相同…...
Ext系列⽂件系统
Ext系列⽂件系统 1. 理解硬件1.1 磁盘的物理结构1.2 磁盘的存储结构1.3 磁盘的逻辑结构理解过程实际过程 1.4 CHS&&LBA地址 2. 引入文件系统块分区innode 3. Ext2文件系统3.1 宏观认识3.2 block group3.3 块组内部3.3.1 GDT(Group Descriptor Table…...
JavaScript 对象复制:浅拷贝与深拷贝
JavaScript 对象复制:浅拷贝与深拷贝使用说明 在 JavaScript 中,对象复制分为 浅拷贝 和 深拷贝,两者的核心区别在于是否递归复制嵌套的引用类型属性。以下是详细说明和示例: 一、浅拷贝(Shallow Copy) 特…...
MTK-Android12 13 屏蔽掉Viewing full screen
去掉ROOM 开机第一次提示全屏弹框 文章目录 需求参考资料修改文件实现方案 解决思路grep 源码查找信息grep 查找 grep -rn "Viewing full screen" 找string 字段grep 查找 grep -rn immersive_cling_title 布局grep 查找 grep -rn layout.immersive_mode_cling 对应的…...
mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置
mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置 https://www.modb.pro/db/1784385883449397248 mysql数据库的线程连接数、状态 、最大并发数、缓存等参数配置 SQL命令行临时设置操作 #查看mysql数据库的线程连接数: mysql> show global statu…...
OpenGauss 数据库介绍
OpenGauss 数据库介绍 OpenGauss 是华为基于 PostgreSQL 开发的企业级开源关系型数据库,现已成为开放原子开源基金会的项目。以下是 OpenGauss 的详细介绍: 一 核心特性 1.1 架构设计亮点 特性说明优势多核并行NUMA感知架构充分利用现代CPU多核性能行…...
GitHub创建远程仓库
使用GitHub创建远程仓库:从零开始实现代码托管与协作 前言 在当今软件开发领域,版本控制系统已成为开发者必备的核心工具。作为分布式版本控制系统的代表,Git凭借其强大的分支管理和高效的协作能力,已成为行业标准。而GitHub作为…...
【AI部署】腾讯云GPU -—SadTalker的AI数字人访问web服务—未来之窗超算中心
访问部署在Cloud Studio上的web服务 当你把该项目部署在本地时,访问该服务的请求地址为http://localhost:8080/hello;当你把该项目部署在Cloud Studio工作台启动时,要想访问到该服务,需要先在工作台右侧打开访问链接面板ÿ…...
基于spring boot 集成 deepseek 流式输出 的vue3使用指南
本文使用deepseek API接口流式输出的文章。 环境要求 jdk17 spring boot 3.4 代码如下: package com.example.controller;import jakarta.annotation.PostConstruct; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.mes…...
fastdds:传输层SHM和DATA-SHARING的区别
下图是fastdds官方的图,清晰地展示了dds支持的传输层: 根据通信双方的相对位置(跨机器、同机器跨进程、同进程)的不同选择合适的传输层,是通信中间件必须要考虑的事情。 跨机器:udp、tcp 跨机器通信,只能通过网络, f…...
堆栈溢出 StackOverflowError 排查
报错: exHandler dispatch failed; nested exception is java.lang.StackOverflowError org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError at org.springframework.web.servlet.D…...
树莓派_利用Ubuntu搭建gitlab
树莓派_利用Ubuntu搭建gitlab 一、给树莓派3A搭建基本系统 1、下载系统镜像 https://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ 2、准备系统SD卡 二、给树莓派设备联网 1、串口后台登录 使用串口登录后台是最便捷的,因为前期网络可能不好直接成功 默…...
ARINC818协议(三)
源特定参数 源特定参数被定义,用于在源和目的之间进行传输 源特定参数包括初始化,合适的解释,周期性的验证。 gamma or palette tables:伽马或者调色板 color format:颜色格式 Brightness and backlight control :亮度…...
得佳胜哲讯科技 SAP项目启动会:胶带智造新起点 数字转型新征程
在全球制造业加速向数字化、智能化转型的浪潮中,胶带制造行业正迎来以“自动化生产、数据化运营、智能化决策”为核心的新变革。工业互联网、大数据分析与智能装备的深度融合,正推动胶带制造从传统生产模式向“柔性化生产精准质量控制全链路追溯”的智慧…...
万字解析TCP
通过学习视频加博客的组合形式,整理了一些关于TCP协议的知识。 *图源:临界~的csdn博客。 一、TCP建立连接 TCP的建立连接,大致可以分为面向连接、TCP报文结构、TCP的三次握手、TCP的建立状态、SYN泛洪攻击。 1.1、面向连接 面向连接 --- …...
