使用MetaGPT 创建智能体(1)入门
metagpt一个多智能体框架
官网:MetaGPT | MetaGPT
智能体
在大模型领域,智能体通常指一种基于大语言模型(LLM)构建的自主决策系统,能够通过理解环境、规划任务、调用工具、迭代反馈等方式完成复杂目标。具备主动推理能力和多步行动策略的智能实体,简单点讲就是 智能体 = 大语言模型(LLM) + 观察 + 思考 + 行动 + 记忆
其中大模型作为大脑, 负责核心的自然语言理解、逻辑推理和生成能力,例如分析用户指令、分解任务步骤、生成代码或决策依据。
理解指令后,开始规划任务, 将复杂问题拆解为可执行的子任务 , 常用方法:思维链(Chain-of-Thought)、思维树(Tree-of-Thoughts)等 。
执行任务的时候调用外部工具,来弥补大模型的不足,比如调用API获得实时数据。
执行任务期间可以存储相关数据,例如知识库,用户偏好等。
执行任务后获得反馈,根据反馈迭代优化结果。
例如用户要求“分析某公司近三年股价趋势并预测未来走势”,智能体的行动可能包括:
① 调用财经API获取历史数据 → ② 用Python代码绘制图表 → ③ 基于统计模型预测 → ④ 生成图文并茂的报告
思维链:大模型提示技术,目的是提升模型解决复杂问题的能力, 显式引导模型“像人类一样逐步思考”,将问题拆解为多个中间推理步骤,最终得出答案。
例子:小明有5个苹果,他吃了2个,又买了3包苹果,每包有4个。他现在有多少个苹果
- 初始苹果:5个
- 吃掉后剩余:5 - 2 = 3个
- 购买的苹果:3包 × 4个/包 = 12个
- 总数:3 + 12 = 15个
思维树: 大模型提示技术, 通过模拟人类“多角度思考→评估→决策”的认知过程,显著提升复杂问题的解决能力,并行探索多条路径,形成树状结构
多智能体
Multi-Agent System, MAS,多个自主智能体(Agent) 通过协作、竞争或混合交互完成复杂任务的分布式系统。 每个智能体具备独立感知、决策和执行能力,同时通过通信、协商或共享环境状态与其他智能体交互,最终实现全局目标。
常见交互模式有协作,竞争,混合三种。
在MetaGPT中,多智能体 = 智能体 + 环境 + 标准流程(SOP) + 通信 + 经济
其中环境可以理解为上下文,
标准流程是管理智能体行动和交互的既定程序 ,
通信时多个智能体里面多个智能体交互的过程,
经济指的是多智能体环境中的价值交换系统,决定资源分配和任务优先级 (这个经济不太理解,后面学完再来补充)
环境搭建
GitHub - geekan/MetaGPT: 🌟 The Multi-Agent Framework: First AI Software Company, Towards Natural Language Programming 先下载到本地,然后PyCharm打开,当然直接用PyCharm也行。
docs/README_CN.md就是中文文档,可以作为参考
修改config2.xml配置文件,这里使用的是ollama
llm:api_type: "ollama" # or azure / ollama / groq etc.model: "gemma2:2b" # or 模型名称base_url: "http://localhost:11434/api" # or llm地址api_key: "ollama"
安装ollama,Ollama 是一个开源的本地化工具,作用是方便部署运行大模型,命令一键部署,这个的安装没太多说的,Download Ollama on macOS 官网下载,然后下一步下一步就好,安装好后运行命令启动
ollama run gemma2:2b
这里模型是gemma2,也可以使用其他的大模型,需要注意别忘了换配置文件里面的模型名称
新建一个t1.py文件,这是一个最简单的小案例,运行文件后就可以看到控制台在打印相关文件
from metagpt.software_company import generate_repo, ProjectReporepo: ProjectRepo = generate_repo("创建一个 2048 游戏") # 或 ProjectRepo("<路径>")
print(repo)
运行结束后在项目的workspace文件夹下可以看到game_2048项目文件夹,里面包含相关代码文件
具体使用
定一个自己的智能体需要三步,定义活动,定义角色,运行角色,本质就是创建多个类,然后相互调用
定义活动
创建一个 Action 类的子类,活动类里面prompt,并解析返回结果
import refrom metagpt.actions import Actionclass DemoAction(Action):# 提示词的模板PROMPT_TEMPLATE: str = """编写一个可以{instruction}的java函数,并提供两个可运行的测试用例。代码和使用的说明使用中文返回“python your_code_here”,没有其他文本, 您的代码:"""name: str = "SimpleWriteCode"async def run(self, instruction: str):prompt = self.PROMPT_TEMPLATE.format(instruction=instruction)# 令 LLM 赋予这个动作能力rsp = await self._aask(prompt)# 解析返回内容code_text = DemoAction.parse_code(rsp)return code_text@staticmethoddef parse_code(rsp):# @staticmethod 定义静态方法直接调用# r 定义原始字符串,忽略其中的所有转义字符pattern = r"```python(.*)```"match = re.search(pattern, rsp, re.DOTALL)code_text = match.group(1) if match else rspreturn code_text
定义角色
创建一个类继承Role类,然后重写_act函数,角色调用活动, 拥有记忆、思考并采用各种策略行动
from demo.test.DemoAction import DemoAction
from metagpt.logs import logger
from metagpt.roles import Role
from metagpt.schema import Messageclass DemoRole(Role):name: str = "DemoRole"# profile: str = "DemoAction"def __init__(self, **kwargs):super().__init__(**kwargs)self.set_actions([DemoAction]) # 设置执行的活动# 重写_act函数, 包含智能体具体行动逻辑async def _act(self) -> Message:logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})")todo = self.rc.todo # self.rc.todo 待办事项,执行时会放幕后处理,最后返回一个完整消息msg = self.get_memories(k=1)[0] # 查找最新消息code_text = await todo.run(msg.content)msg = Message(content=code_text, role=self.profile, cause_by=type(todo))return msg
运行
创建角色对象,然后调用run函数运行,在这里创建一个DemoRun.py
import asynciofrom demo.test.DemoRole import DemoRole
from metagpt.context import Context
from metagpt.logs import loggerasync def main():msg = "编写一个计算列表总和的函数"context = Context()role = DemoRole(context=context)logger.info(msg)result = await role.run(msg)logger.info(result)if __name__ == '__main__':asyncio.run(main())
这是一个简单使用案例,参照官网案例
多个活动运行
首先再定义一个活动
import subprocessfrom metagpt.actions import Action
from metagpt.logs import loggerclass DemoAction2(Action):name: str = "DemoAction2"async def run(self, code_text: str):# 通过 Python 程序启动并控制子进程# ["python3", "-c", code_text] 要执行的命令# capture_output 是否捕获输出# text 以字符串形式返回输出result = subprocess.run(["python3", "-c", code_text], capture_output=True, text=True)# stdout 标准输出内容code_result = result.stdoutlogger.info(f"{code_result=}")return code_result
然后在角色中定义多个活动执行
from demo.test.DemoAction2 import DemoAction2
from demo.test.DemoAction import DemoAction
from metagpt.logs import logger
from metagpt.roles import Role
from metagpt.schema import Messageclass DemoRole(Role):name: str = "DemoRole"profile: str = "DemoRole"def __init__(self, **kwargs):super().__init__(**kwargs)self.set_actions([DemoAction, DemoAction2]) # 设置执行的活动self._set_react_mode(react_mode="by_order") # 按照顺序执行action# 重写_act函数, 包含智能体具体行动逻辑async def _act(self) -> Message:logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})")todo = self.rc.todo # self.rc.todo 待办事项,执行时会放幕后处理,最后返回一个完整消息msg = self.get_memories(k=1)[0] # 查找最新消息code_text = await todo.run(msg.content)msg = Message(content=code_text, role=self.profile, cause_by=type(todo))self.rc.memory.add(msg) # 添加新的消息,并更新索引return msg
运行代码还是原本的,运行后查看打印日志会发现程序首先执行Action1,然后会把Action1的结果传给Action2,然后Action2运行,最后返回结果,需要注意的是Action1的执行结果收大模型,最后返回的可能是一个不是特别合适的消息。
相关文章:
使用MetaGPT 创建智能体(1)入门
metagpt一个多智能体框架 官网:MetaGPT | MetaGPT 智能体 在大模型领域,智能体通常指一种基于大语言模型(LLM)构建的自主决策系统,能够通过理解环境、规划任务、调用工具、迭代反馈等方式完成复杂目标。具备主动推理…...
AF3 OpenFoldMultimerDataset类解读
AlphaFold3 data_modules 模块的 OpenFoldMultimerDataset 类是 OpenFoldDataset 类的子类,专门用于 多链蛋白质(Multimer) 数据集的训练。它通过引入 AlphaFold Multimer 论文 中描述的过滤步骤,来实现多链蛋白质的训练。这个类扩展了父类的功能,特别是为了处理多链蛋白质…...
【C++】多态功能细节问题分析
多态是在不同继承关系的类对象去调用同一函数,产生了不同的行为。值得注意的是,虽然多态在功能上与隐藏是类似的,但是还是有较大区别的,本文也会进行多态和隐藏的差异分析。 在继承中要构成多态的条件 1.1必须通过基类的指针或引用…...
[CISSP] [5] 保护资产安全
数据状态 1. 数据静态存储(Data at Rest) 指存储在磁盘、数据库、存储设备上的数据,例如: 硬盘、SSD服务器、数据库备份存储、云存储 安全措施 加密(Encryption):如 AES-256 加密磁盘和数据…...
EIP-712:类型化结构化数据的哈希与签名
1. 引言 以太坊 EIP-712: 类型化结构化数据的哈希与签名,是一种用于对类型化结构化数据(而不仅仅是字节串)进行哈希和签名 的标准。 其包括: 编码函数正确性的理论框架,类似于 Solidity 结构体并兼容的结构化数据规…...
spring boot 集成redis 中RedisTemplate 、SessionCallback和RedisCallback使用对比详解,最后表格总结
对比详解 1. RedisTemplate 功能:Spring Data Redis的核心模板类,提供对Redis的通用操作(如字符串、哈希、列表、集合等)。使用场景:常规的Redis增删改查操作。特点: 支持序列化配置(如String…...
基于S函数的simulink仿真
基于S函数的simulink仿真 S函数可以用计算机语言来描述动态系统。在控制系统设计中,S函数可以用来描述控制算法、自适应算法和模型动力学方程。 S函数中使用文本方式输入公式和方程,适合复杂动态系统的数学描述,并且在仿真过程中可以对仿真…...
每日一题洛谷P8664 [蓝桥杯 2018 省 A] 付账问题c++
P8664 [蓝桥杯 2018 省 A] 付账问题 - 洛谷 (luogu.com.cn) 思路:要使方差小,那么钱不能一下付的太多,可以让钱少的全付玩,剩下还需要的钱再让钱多的付(把钱少的补上)。 将钱排序,遍历一遍&…...
迅饶科技X2Modbus网关-GetUser信息泄露漏洞
免责声明:本号提供的网络安全信息仅供参考,不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我联系,我将尽快处理并删除相关内容。 漏洞描述 该漏洞的存在是由于GetUser接口在…...
【Pandas】pandas DataFrame values
Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于获取 DataFrame 的行索引DataFrame.columns用于获取 DataFrame 的列标签DataFrame.dtypes用于获取 DataFrame 中每一列的数据类型DataFrame.info([verbose, buf, max_cols, …])用于提供 Dat…...
蓝桥杯Java B组省赛真题高频考点近6年统计分类
基础考点 考点高频难度模拟9基础枚举5基础思维4基础动态规划3基础规律2基础单位换算2基础搜索 1基础双指针1基础数学1基础哈希表1基础暴力1基础Dijkstra1基础 二分1基础 中等考点 考点高频难度动态规划6中等数学5中等枚举4中等模拟3中等思维3中等贪心3中等前缀和3中等二分2中…...
关于inode,dentry结合软链接及硬链接的实验
一、背景 在之前的博客 缺页异常导致的iowait打印出相关文件的绝对路径-CSDN博客 里 2.2.3 一节里,我们讲到了file,fd,inode,dentry,super_block这几个概念,在这篇博客里,我们针对inode和dentr…...
PandasAI:当数据分析遇上自然语言处理
数据科学的新范式 在数据爆炸的时代,传统的数据分析工具正面临着前所未有的挑战。数据科学家们常常需要花费70%的时间在数据清洗和探索上,而真正的价值创造时间却被大幅压缩。PandasAI的出现,正在改变这一现状——它将生成式AI的强大能力注入…...
Unity网络开发基础 (3) Socket入门 TCP同步连接 与 简单封装练习
本文章不作任何商业用途 仅作学习与交流 教程来自Unity唐老狮 关于练习题部分是我观看教程之后自己实现 所以和老师写法可能不太一样 唐老师说掌握其基本思路即可,因为前端程序一般不需要去写后端逻辑 1.认识Socket的重要API Socket是什么 Socket(套接字࿰…...
做题记录:和为K的子数组
来自leetcode 560 前言 自己只会暴力,这里就是记录一下前缀和哈希表的做法,来自灵神的前缀和哈希表:从两次遍历到一次遍历,附变形题 正文 首先,这道题无法使用滑动窗口,因为滑动窗口需要满足单调性&am…...
VMware虚拟机卡顿、CPU利用率低、编译Linux内核慢,问题解决与实验对比
目录 一、总结在前面(节约时间就只看这里)0 环境说明1 遇到的问题:2 问题的原因:3 解决办法:4 实验验证:5 关于虚拟机内核数量设置6 关于强行指定Vm能用的CPU内核 二、管理员启动,实验对比实验1…...
【7】数据结构的队列篇章
目录标题 队列的定义顺序队列的实现初始化入队出队顺序队列总代码与调试 循环队列的实现初始化入队出队获取队首元素循环队列总代码与调试 链式队列的实现链式队列的初始化入队出队获取队首元素链式队列总代码与调试 队列的定义 定义:队列(Queue&#x…...
颜色归一化操作
当我们不太关注图像具体细节,只关注图像大致的内容时,为了避免光照角度、光照强度对图像的影响,可以采用下面进行归一化操作。这种颜色系统具有通道对表面方向、照明方向具有鲁棒性的特性,适用于图像分割等领域,在机器…...
2874. 有序三元组中的最大值 II
给你一个下标从 0 开始的整数数组 。nums 请你从所有满足 的下标三元组 中,找出并返回下标三元组的最大值。 如果所有满足条件的三元组的值都是负数,则返回 。i < j < k(i, j, k)0 下标三元组 的值等于 。(i, j, k)(nums[i] - nums[j]) * nums[k…...
05-Spring Security 认证与授权机制源码解析
Spring Security 认证与授权机制源码解析 结合之前的IOC、AOP、事务管理, 这一篇讲讲Spring 的安全性,以下是小弟对Spring Security的一些理解,以及在真实面试中碰到的一些问题做了些整理,欢迎各位大佬一起观摩指点!&a…...
深度学习处理文本(6)
理解词嵌入 重要的是,进行one-hot编码时,你做了一个与特征工程有关的决策。你向模型中注入了有关特征空间结构的基本假设。这个假设是:你所编码的不同词元之间是相互独立的。事实上,one-hot向量之间都是相互正交的。对于单词而言…...
STL-vector的使用
1.STL-vector 向量是可以改变其大小的线性序列容器。向量使用连续的空间存储元素,表明向量可以像数组通过下标来访问元素,但是向量的大小可以动态变化。向量的容量可能大于其元素需要的实际容量,向量通过消耗更多的内存来换取存储管理效率。…...
MySQL深入
体系结构 连接层:主要处理客户端的连接进行授权认证、校验权限等相关操作 服务层:如sql的接口、解析、优化在这里完成,所有跨存储引擎的操作在这里完成 引擎层:索引是在存储引擎层实现的,所以不同的存储引擎他的索引…...
为什么LoRA在目标检测方向不奏效?
最近在思考,为啥目标检测方向没有出现LORA的相关用法,搜索到了一篇文章,挺有深度的。 Why LoRA Struggles with Object Detection (and Why I Learned This the Hard Way) 链接:https://medium.com/predict/why-lora-struggles-with-object-detection-and-why-i-learned-…...
Vue面试常考内容[从宏观到微观]
以下是Vue面试常考内容的系统性解析,从框架设计思想到源码实现细节,结合最新技术动态(截至2025年4月)整理而成: 一、宏观层面:Vue设计哲学与框架定位 渐进式框架核心 • 分层可扩展架构:从视图层核心逐步集成路由、状态管理等能力,支持"按需取用"的渐进式开发…...
Genspark:重新定义搜索体验的AI智能体引擎
关于我们 飞书-华彬智融知识库 由前百度高管景鲲(Eric Jing)和朱凯华(Kay Zhu)联合创立的AI搜索引擎Genspark,正以革命性的技术架构和用户导向的设计理念,为全球用户带来一场搜索体验的范式革命。本文将基…...
从零实现Json-Rpc框架】- 项目实现 - 服务端主题实现及整体封装
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
AI助力PPT制作,让演示变得轻松高效
AI助力PPT制作,让演示变得轻松高效!随着科技的进步,AI技术早已渗透到各行各业,特别是在办公领域,AI制作PPT已不再是未来的梦想,而是现实的工具。以前你可能需要花费数小时来制作一个完美的PPT,如…...
React-01React创建第一个项目(npm install -g create-react-app)
1. React特点 JSX是javaScript语法的扩展,React开发不一定使用JSX。单向响应的数据流,React实现单向数据流,减少重复代码,比传统数据绑定更简单。等等 JSX是js的语法扩展,允许在js中编写类似HTML的代码 const …...
HTML应用指南:利用POST请求获取三大运营商5G基站位置信息(二)
在当前信息技术迅猛发展的背景下,第五代移动通信(5G)技术作为新一代的无线通信标准,正逐步成为推动社会进步和产业升级的关键驱动力。三大电信运营商(中国移动、中国联通、中国电信)在全国范围内的5G基站部署,不仅极大地提升了网络性能,也为智能城市、物联网、自动驾驶…...
