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

在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) # 这里回到了第一个Actionlogger.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变为下一个actionelse:self._rc.todo = None     async def _act(self):todo = self._rc.todoif type(todo) is PrintAction:ret = await todo.run()if 3 == ret: # 这里判断下是第几个action了,根据任务描述,第三个任务完成后动态添加4,5,6 actionactions = [PrintAction(number=4), PrintAction(number=5), PrintAction(number=6)]self._init_actions(actions) # 动态添加4,5,6 action,这时候action4变成了第一个actionself._rc.todo = None # _think中会设置为第一个Action,也就是action4return "Continue"## 3. 重写_react函数    async def _react(self):while True:logger.info("react")await self._think() ## 首先思考下一步执行哪个actionif self._rc.todo is None:breakresult = await self._act() ## 执行action,这里的action是_think里决定async def main():msg = "start" ## 给一个msg,必须给一个非空的msg,否则run不起来,待研究role = Printer()await role.run(msg) ## 开始运行agent,会调用role里的_reactasyncio.run(main())

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

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

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

相关文章

RPC:Remote Procedure Call 远程过程调用

目前&#xff0c;对于一个完整的应用来说&#xff0c;通常包含了若干支持不同功能的服务&#xff0c;亦或者是函数&#xff0c;这些服务之间往往可能需要互相调用&#xff0c;使用已经实现的服务功能&#xff0c;而不是需要在每个服务进程中再去重复实现已经有的功能。 这不仅…

ADSelfService Plus 推出离线多因素身份验证以提升远程工作安全性

采用先进验证方法&#xff0c;确保在任何时间、地点或连接问题下对业务数据的合法访问即使远程用户未连接到身份验证服务器或互联网&#xff0c;也可通过MFA安全认证。 MFA 得克萨斯州德尔瓦雷 — 2023年5月3日 — Zoho Corporation 旗下的企业IT管理部门ManageEngine今日宣布…

CentOS7单机部署Minio

1、下载二进制文件 # minio运行目录 cd /soft/minio # 下载minio二进制文件 wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio # 赋权 chmod x minio # 建立minio操作目录 mkdir /mnt/minio/data 2、建立启动脚本 cd /soft/minio vi start.sh 脚本内容…

抖音小店无货源爆单技巧大公开!教你如何与达人合作!

大家好&#xff0c;我是电商花花。 现在越来越多的人开始关注抖音小店电商&#xff0c;尝试着做抖音小店&#xff0c;我们做抖音小店除了要选品之外&#xff0c;我们还要学会找达人合作&#xff0c;让达人帮我们带货出单。 今天给大家讲一下如何找达人合作带货&#xff0c;如…

【AIGC】AnimateDiff:无需定制化微调的动画化个性化的文生图模型

前言 Animatediff是一个有效的框架将文本到图像模型扩展到动画生成器中&#xff0c;无需针对特定模型进行调整。只要在大型视频数据集中学习到运动先验知识。AnimateDiff就可以插入到个性化的文生图模型中&#xff0c;与Civitai和Huggingface的文生图模型兼容&#xff0c;也可…

6 功能开发

功能开发 6 功能开发1.发布1.1 小程序1.2 API1.3 规则 2.restful api回顾2.1 APIView &#xff08; 可以 &#xff09;2.2 ListAPIView2.2.1 用户传递某些值2.2.2 fields和exclude的区别&#xff1f;2.2.3 read_only2.3.4 复杂需求2.3.5 serializers嵌套 3. 首页展示扩展&#…

把项目转换为md知识库,提供给gpts使用

把项目转换为md知识库&#xff0c;提供给gpts使用 import osimport chardetproject_path # 项目目录路径 project_name # 项目名称# 定义全局字典&#xff0c;映射文件后缀名到Markdown代码块的语言 language_mapping {.java: java,.py: python,.js: javascript,.html: html,…

polar CTF CB链

一、题目 二、解答 1、通过jar包&#xff0c;可以看到/user路由下有反序列化操作 看到存在commons-beanutils依赖且版本为1.9.2&#xff0c;可利用CB链Getshell。 使用ysoserial项目中的CommonsBeanutils1链写一个POC&#xff0c;注意确保ysoserial项目中的pom.xml中的comm…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第一天-socket编程(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式培训笔记,嵌入式硬件,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机领域.https://blog.csdn.net/weixin_3980490…

8.1 Centos安装部署Redis

文章目录 前言一、下载Redis二、编译Redis三、配置redis.conf四、启动Redis服务端五、启动Redis客户端测试前言 本文将手把手演示在CentOS7上安装部署Redis。 一、下载Redis 可以使用wget命令进行下载,这里下载到/app目录 wget http://download.redis.io/releases/redis-5.…

Codeforces Round 908 (Div. 2) C. Anonymous Informant (思维题)

题目链接 思路: 考虑到 k 的范围很大, 肯定不能进行模拟。 通过观察以及题目的条件, a[i] i 时是定点, 并循环左移 i 次, 则左移后, 数组的最后一位即为该定点, 且通过这个定点可以知道此定点未左移时, 数组的第一个数是什么, 也就可以知道当时数组的最后一个数是什么, 即又找…

webserver面试

1 难点 1.1 网络框架的选取 常见的有reactor和proactor,在linux中&#xff0c;异步io不完善&#xff0c;所以很多项目都采用reactor模式。我又参考了开源的项目&#xff0c;最终选择使用同步io模拟异步的模式。 1.2 RAII 参考开源项目&#xff0c;资源获取即初始化&#xf…

Centos安装Datax

Centos7安装DataX 一、DataX简介二、DataX的数据源支持三、安装DataX1、下载DataX2、解压3、检验是否安装成功4、使用 四、实践案例1、环境信息2、编写同步的配置文件(user_info.json)3、执行同步4、验证同步结果 一、DataX简介 DataX 是阿里云 DataWorks数据集成 的开源版本&a…

【Unity】空引用处理方法总结

在 Unity 中&#xff0c;空处理&#xff08;Null Handling&#xff09;指的是在处理对象引用时&#xff0c;考虑到可能为空&#xff08;null&#xff09;的情况&#xff0c;并采取适当的措施来避免潜在的错误或异常。下面是一些处理空引用的常见方法&#xff1a; 空引用检查&am…

RocketMQ源码阅读-Message消息存储

RocketMQ源码阅读-Message消息存储 1. CommitLog的作用2. CommitLog 存储消息3. 时序图4. 小结 在Broker消息接收一篇中&#xff0c;分析到Broker接收到消息&#xff0c;最终会调用CommitLong#putMessage方法存储消息。 本篇来分析CommitLong#putMessage存储消息的流程。 1. C…

自编C++题目——战争

预估难度 困难 题目描述 国与国以河为界&#xff0c;有一天他们两国发生了战争&#xff0c;在边疆的战士开始了厮杀。小明是一个参谋&#xff0c;他也知道两国的兵都能打个人&#xff0c;所以他想让你帮忙安排布置兵&#xff0c;以击杀所有国的兵。 打仗规则 只能打在同一…

Java-集合-FAQ-List/Set/Map区别

1 需求 2 接口 3 示例 4 参考资料 JAVA学习-List&#xff0c;Set&#xff0c;Map三者的区别_list<list<integer>>和map区别-CSDN博客 Java集合-HashSet的使用及与LinkedHashSet、TreeSet的对比_linkedhashset和treeset的区别-CSDN博客 java中Map有哪些实现类_ma…

鸿蒙应用开发尝鲜:初识HarmonyOS

初识HarmonyOS 来源:华为官方网站 : https://developer.huawei.com/ 相信大家对鸿蒙应用开发也不在陌生,很多身处互联网行业或者不了解的人们现在也一定都听说过华为鸿蒙.这里我将不再说废话,直接步入正题 鸿蒙应用开发语言 HarmonyOS应用开发采用的是ArkTS语言,ArkTS是在Typ…

高校站群内容管理系统开发语言各有优势

站群管理系统开发可以选择多种编程语言&#xff0c;具体选择哪种语言最好需要考虑多个因素&#xff0c;包括开发团队的技术栈、项目需求、性能要求、安全性等。下面列举一些常见的编程语言及其适用场景&#xff1a; PHP&#xff1a;PHP是一种广泛使用的服务器端脚本语言&#…

数据结构:堆和堆排序

数据结构&#xff1a;堆和堆排序 文章目录 数据结构&#xff1a;堆和堆排序1.二叉树的存储结构1.顺序结构2.链式结构 2.堆3.堆的实现4.堆排序&#xff08;选择排序中的一类&#xff09;1. 基本思想2.代码实现 1.二叉树的存储结构 1.顺序结构 顺序结构存储就是使用数组来表示一…