【AI的未来 - AI Agent系列】【MetaGPT】2. 实现自己的第一个Agent

news2025/1/25 9:15:34

在MetaGPT中定义的一个agent运行示例如下:
在这里插入图片描述

  • 一个agent在启动后他会观察自己能获取到的信息,加入自己的记忆中
  • 下一步进行思考,决定下一步的行动,也就是从Action1,Action2,Action3中选择执行的Action
  • 决定行动后,紧接着就执行对应行动,得到这个环节的结果

以Task3 作业为例,来看下使用MetaGPT 实现Agent的思路。Task3任务如下:

经过上面的学习,我想你已经对 MetaGPT 的框架有了基本了解,现在我希望你能够自己编写这样一个 agent

  • 这个 Agent 拥有三个动作 打印1 打印2 打印3(初始化时 init_action([print,print,print]))
  • 重写有关方法(请不要使用act_by_order,我希望你能独立实现)使得 Agent 顺序执行上面三个动作
  • 当上述三个动作执行完毕后,为 Agent 生成新的动作 打印4 打印5 打印6 并顺序执行,(之前我们初始化了三个 print 动作,执行完毕后,重新 init_action([…,…,…]),然后顺序执行这个新生成的动作列表)

实现思路

用最通俗的话来总结:

  1. 要实现一个Agent,其实就是定义一个Role。该Role应该包含自己的Action。
  2. 在Role的初始化中初始化Actions
  3. Role重写_act函数或_react函数,Role run的时候会调用该函数
    • _react函数重写,一般是先思考_think下一步用哪个action,然后再_act
  4. Action重写run函数,这里面决定了我们对传入的内容到底要做什么样的处理,例如调用大模型得到结果

Task3 - 完整代码及注释

  • 先看执行结果:顺序打印1-6,然后结束

在这里插入图片描述

  • 完整代码及细节注释
# 加载 .env 到环境变量
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())

from metagpt.actions import Action
from metagpt.logs import logger
import asyncio        
from metagpt.roles import Role
from metagpt.schema import Message

## 1. 定义Action
class PrintAction(Action):
    def __init__(self, name: str = "", number: int = 0, *args, **kwargs):
        super().__init__(name, *args, **kwargs)
        self._number = number
        
    ## 1.1 run方法中定义具体的处理操作,这里只是打印一个数
    async def run(self):
        logger.info(self._number)
        return self._number


## 2. 定义Role
class Printer(Role):
    def __init__(
        self,
        name: str = "Printer",
        profile: str = "Printer",
    ):
        super().__init__(name, profile)
        
        ## 2.1 初始化中初始化该Role的Actions,这里首先初始化了3个Action,将会按顺序执行
        self._init_actions([PrintAction(number=1), PrintAction(number=2), PrintAction(number=3)])
        
    async def _think(self) -> None:
        """Determine the next action to be taken by the role."""
        logger.info(self._rc.state)
        logger.info(self,)
        logger.info(f"{self._setting}: ready to {self._rc.todo}")
        if self._rc.todo is None:
            self._set_state(0) # 这里回到了第一个Action
            logger.debug("reset state to 0")
            return

		## 这里决定下一个action是什么,_rc.state表示要执行的action的下标,_states记录了所有actions及其下标
        if self._rc.state + 1 < len(self._states):
            logger.debug(f"set state to {self._rc.state + 1}")
            self._set_state(self._rc.state + 1) # todo变为下一个action
        else:
            self._rc.todo = None     
            
    async def _act(self):
        todo = self._rc.todo
        if type(todo) is PrintAction:
            ret = await todo.run()
            if 3 == ret: # 这里判断下是第几个action了,根据任务描述,第三个任务完成后动态添加4,5,6 action
                actions = [PrintAction(number=4), PrintAction(number=5), PrintAction(number=6)]
                self._init_actions(actions) # 动态添加4,5,6 action,这时候action4变成了第一个action
                self._rc.todo = None # _think中会设置为第一个Action,也就是action4
            
        return "Continue"
        
    ## 3. 重写_react函数    
    async def _react(self):
        while True:
            logger.info("react")
            await self._think() ## 首先思考下一步执行哪个action
            if self._rc.todo is None:
                break
            result = await self._act() ## 执行action,这里的action是_think里决定

async def main():
    msg = "start" ## 给一个msg,必须给一个非空的msg,否则run不起来,待研究
    role = Printer()
    await role.run(msg) ## 开始运行agent,会调用role里的_react

asyncio.run(main())

先写到这,展示个结果和总体步骤,后面有时间会详细拆解每一步的实现和细节,以及过程中遇到的坑及解决方法。

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

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

相关文章

怎么把workspace的数据导入到simulink进行FFT分析?

怎么把数据导入到simulink在这篇博客已经阐述了&#xff0c;那么如何把数据导入到simulink还能进行FFT分析呢&#xff1f; 首先我们看simulink的FFT分析界面&#xff0c;&#xff08;前置步骤&#xff1a;导入powergui模块&#xff0c;双击powergui模块&#xff0c;Tool选项卡…

第8章-第6节-Java中字符流的缓冲流

1、在说正题之前&#xff0c;先说一个小细节&#xff0c;不管是字节流还是字符流都要注意这个细节&#xff0c;具体看这篇博文&#xff1a;关于Java的IO流里面的方法read()的小细节 2、字符流的缓冲流&#xff1a; 1&#xff09;、BufferedWriter 方法名说明void newLine()写…

代码随想录刷题题Day32

刷题的第三十二天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day32 任务 ● 70. 爬楼梯 &#xff08;进阶&#xff09; ● 322. 零钱兑换 ● 279.完全平方数 1 爬楼梯&#xff08;进阶&#…

JavaScript的变量详解

一、变量的声明和赋值 编程中的程序其本质就是处理数据的过程&#xff0c;当输入指令时&#xff0c;就可以输出相应的内容&#xff0c;在输入和输出之间就是处理数据的过程。处理的数据可能有多种&#xff0c;多个&#xff0c;这时就需要使用不同的名字来存储、区分和提取不同的…

Neo4j知识图谱(2)创建与删除

Neo4j - CQL简介_w3cschoolhttps://www.w3cschool.cn/neo4j/neo4j_cql_introduction.html一、创建节点 create(n:Person{name:何仙鸟,age:21}) create就是创建&#xff0c;无论是点还是边都是用create来创建 n相当于一个别名&#xff0c;比如创建一个Person&#xff0c;而Pe…

【数据库】MySQL性能分析和优化

导语 当数据量非常庞大时,使用MySQL进行select操作可能会出现耗时特别多的情况。例如:在一张百万数据的表格good中执行select * from good;查询耗时可能需要十几秒,让客户等待十几秒,是不被接受的, 此时我们就需要对相关语句进行性能分析并优化。下面就一起看一下MySQL的…

八. 实战:CUDA-BEVFusion部署分析-学习spconv的优化方案(Explicit GEMM conv)

目录 前言0. 简述1. 什么是Explicit GEMM Conv2. im2col3. spconv是如何使用Explicit GEMM Conv的4. 使用Explicit GEMM Conv处理spconv的优缺点5. 拓展-conv加速5.1 Introduction5.2 im2col5.3 Forward graph5.4 Backward graph5.5 Python example for forward propagation5.6…

研0或研一|如何快速入门深度学习?

一、经验建议 1️⃣课程篇 直接上手B站【小土堆PyTorch深度学习快速入门教程】&#xff0c;共计9h50min左右&#xff0c;预计一周就可以学完&#xff0c;比较偏向理论和实践相结合跟李沐学AI B站【动手学深度学习 PyTorch版】刘二大人B站【PyTorch深度学习实践】&#xff0c;…

Python武器库开发-武器库篇之Whois信息收集模块化(四十五)

Python武器库开发-武器库篇之Whois信息收集模块化(四十五) 我们在进行渗透的时候&#xff0c;需要进行全面的信息收集&#xff0c;除了主动信息收集之外&#xff0c;我们还经常会进行被动信息收集&#xff0c;Whois信息收集就是其中的一种,我们可以利用一些网站进行Whois信息收…

uniCloud 云数据库(1)

目录 1&#xff1a;云数据库入门,基本概念了解 1.1 云数据库是关系型还是Nosql? 1.2 uniCloud 云数据库和关系型数据库的对比 1.3 官方文档传送门 2: 基本操作表 创建 在uniCloud web控制台 进行创建 数据表的3个组成部分 通过传统方式操作数据库 获取集合的引用 集…

完成源示例

本主题演示如何创作和使用自己的完成源类&#xff0c;类似于 .NET 的 TaskCompletionSource。 completion_source 示例的源代码 下面的列表中的代码作为示例提供。 其目的是说明如何编写自己的版本。 例如&#xff0c;支持取消和错误传播不在此示例的范围内。 #include <w…

【Nacos】Nacos 双端版本升级实战手册

背景 由于原来使用的 Nacos 版本&#xff08;1.1.4&#xff09;存在安全漏洞&#xff0c;需要进行升级修复。经过查询后&#xff0c;决定将版本升级到2.2.4。 Nacos 服务共有三个&#xff1a; 192.168.2.190:8848192.168.2.191:8848192.168.2.192:8848 步骤 服务端升级&am…

宝塔安装redis并且远程连接redis教程

第一步&#xff1a;搜索redis并安装 第二步&#xff1a;在防火墙添加端口6379 第三步&#xff1a;查看宝塔防火墙是否开启了6379端口 firewall-cmd --zonepublic --list-ports 很显然并没有开启 第四步&#xff1a;开启防火墙的6379端口 firewall-cmd --zonepublic --add-po…

SLAM第十四讲

基础知识 四元数 先将三维空间的点p(x,y,z) 变成四元数的表示q(0,x,y,z) 其中0为四元数的实部&#xff0c;x,y,z为四元数的虚部。 实部为0的四元数也叫纯虚四元数。 通过 左乘四元数&#xff…

Vue3项目引入canvaskit-wasm库(skia库的wasm版)

1 安装canvaskit-wasm npm install canvaskit-wasm 或者 yarn add canvaskit-wasm 2 将文件node_modules/canvaskit-wasm/bin/canvaskit.wasm复制到public目录 3 引入到组件中 <template><img :src"imgData"/> </template><script setup>…

Redis命令 - Sets命令组常用命令

Set集合&#xff0c;无序&#xff0c;一堆不重复值的组合。利用redis提供的set数据结构&#xff0c;可以存储一些集合性的数据。 使用场景&#xff1a;例如&#xff0c;实现如共同关注、共同喜好、二度好友等 1、SADD key member [member …] 向集合中添加一个或者多个成员 …

顺序表实现(下)(C语言)

几道相关例题,帮助大家更好理解顺序表. 文章目录 前言 一、顺序表二、创建顺序表并初始化三.删除非递减顺序表L中的重复元素四.在非递减顺序表中删除[s,t]之间的元素五.设计算法逆置顺序表L,并将序列L循环左移六.顺序表A和B的元素个数分别为m,n.A表升序排序,B表降序排序,两表中…

四、Qt 的第一个demo

在上一篇章节里《三、Qt Creator 使用》&#xff0c;我们介绍了如何使用Qt Creator创建一个简单的带窗体的demo&#xff0c;在这一章节里&#xff0c;我们详细讲解一下这个demo的文件组成&#xff0c;及主函数&#xff0c;并在UI上加一些控件&#xff0c;实现一些简单的功能。 …

SDRAM小项目——写模块

写模块跟着视频看了一个多星期&#xff0c;一开始始终有点弄不清楚&#xff0c;现在记录一下理解的过程。 阅读文档信息&#xff1a; 首先阅读文档信息&#xff0c;了解SDRAM写过程的状态转换和时序图 SDRAM整体状态流程如图所示&#xff1a; 在SDRAM整体系统中&#xff0c…

谈⼀谈你对TCPIP四层模型,OSI七层模型的理解

TCP/IP四层模型 对比 OSI七层模型 OSI七层模型 为了增强通⽤性和兼容性&#xff0c;计算机⽹络都被设计成层次机构&#xff0c;每⼀层都遵守⼀定的规则。因此有了OSI这样⼀个抽象的⽹络通信参考模型&#xff0c;按照这个标准使计算机⽹络系统可以互相连接 物理层 通过⽹线、光…