MetaGPT部分源码解读--Memory

    storage: list[SerializeAsAny[Message]] = []index: DefaultDict[str, list[SerializeAsAny[Message]]] = Field(default_factory=lambda: defaultdict(list))ignore_id: bool = False
  1. storage 属性是一个列表,用于存储消息对象。每个消息对象都被标记为 SerializeAsAny[Message] 类型,这表示它们可以序列化为任何类型的消息。默认情况下,它被初始化为空列表 []

  2. index 属性是一个字典,用于创建消息的索引。键是字符串类型,对应着消息的某个属性(可能是消息的原因)。值是一个列表,存储与该属性相匹配的消息对象。它使用了 DefaultDict 来提供一个默认工厂函数,以便在索引中添加新键时自动创建一个空列表。默认情况下,它被初始化为一个空字典。

  3. ignore_id 属性是一个布尔值,用于控制是否忽略消息的 ID。默认情况下,它被设置为 False,表示不忽略消息的 ID。

    def serialize(self, stg_path: Path):"""stg_path = ./storage/team/environment/ or ./storage/team/environment/roles/{role_class}_{role_name}/"""memory_path = stg_path.joinpath("memory.json")storage = self.model_dump()write_json_file(memory_path, storage)@classmethoddef deserialize(cls, stg_path: Path) -> "Memory":"""stg_path = ./storage/team/environment/ or ./storage/team/environment/roles/{role_class}_{role_name}/"""memory_path = stg_path.joinpath("memory.json")memory_dict = read_json_file(memory_path)memory = Memory(**memory_dict)return memory
  1. serialize 方法用于将内存对象序列化并保存到指定路径下的 JSON 文件中。参数 stg_path 是保存序列化文件的路径,可以是一个固定路径,也可以是具有角色类和角色名称的路径。首先,构建存储文件的路径 memory_path。然后,调用 self.model_dump() 方法来获取要序列化的数据,并将其写入 JSON 文件中。

  2. deserialize 方法是一个类方法,用于从指定路径下的 JSON 文件中反序列化内存对象。参数 stg_path 是指定路径,类似于 serialize 方法。首先,构建存储文件的路径 memory_path。然后,使用 read_json_file 函数从 JSON 文件中读取数据,并将其作为关键字参数传递给 Memory 类的构造函数,从而创建并返回内存对象。

add

    def add(self, message: Message):"""Add a new message to storage, while updating the index"""if self.ignore_id:message.id = IGNORED_MESSAGE_IDif message in self.storage:returnself.storage.append(message)if message.cause_by:self.index[message.cause_by].append(message)def add_batch(self, messages: Iterable[Message]):for message in messages:self.add(message)

向存储中添加新的消息,并更新索引。

如果 ignore_id 设置为 True,则将消息的 id 设置为预定义的常量 IGNORED_MESSAGE_ID

将消息添加到存储中,并根据消息的 cause_by 属性更新索引


    def get_by_role(self, role: str) -> list[Message]:"""Return all messages of a specified role"""return [message for message in self.storage if message.role == role]def get_by_content(self, content: str) -> list[Message]:"""Return all messages containing a specified content"""return [message for message in self.storage if content in message.content]

 get_by_role(self, role: str) -> list[Message]: 返回指定角色的所有消息

get_by_content(self, content: str) -> list[Message]: 返回包含指定内容的所有消息

    def delete_newest(self) -> "Message":"""delete the newest message from the storage"""if len(self.storage) > 0:newest_msg = self.storage.pop()if newest_msg.cause_by and newest_msg in self.index[newest_msg.cause_by]:self.index[newest_msg.cause_by].remove(newest_msg)else:newest_msg = Nonereturn newest_msgdef delete(self, message: Message):"""Delete the specified message from storage, while updating the index"""if self.ignore_id:message.id = IGNORED_MESSAGE_IDself.storage.remove(message)if message.cause_by and message in self.index[message.cause_by]:self.index[message.cause_by].remove(message)

 delete_newest(self) -> "Message":从存储中删除最新的消息。

  • 返回值为被删除的最新消息对象,如果存储为空,则返回 None
  • 如果存储中最新消息包含在索引中,并且有引起其产生的消息,那么也会从索引中删除。

delete(self, message: Message):从存储中删除指定的消息,并更新索引。

  • message:要删除的消息对象。
  • 如果 ignore_id 为真,则会将消息的 ID 设置为 IGNORED_MESSAGE_ID
  • 从存储中删除指定的消息对象。
  • 如果消息有引起其产生的消息,并且存在于索引中,则也会从索引中删除该消息

 

    def clear(self):"""Clear storage and index"""self.storage = []self.index = defaultdict(list)def count(self) -> int:"""Return the number of messages in storage"""return len(self.storage)def try_remember(self, keyword: str) -> list[Message]:"""Try to recall all messages containing a specified keyword"""return [message for message in self.storage if keyword in message.content]
  1. clear(self):将存储和索引都重置为空列表或字典。

  2. count(self) -> int:返回存储中消息的数量

  3. try_remember(self, keyword: str) -> list[Message]:尝试回忆所有包含指定关键字的消息。

    • keyword:要搜索的关键字。
    • 返回存储中所有包含指定关键字的消息列表。

get

    def get(self, k=0) -> list[Message]:"""Return the most recent k memories, return all when k=0"""return self.storage[-k:]

从storage里面拿最近k个


    def find_news(self, observed: list[Message], k=0) -> list[Message]:"""find news (previously unseen messages) from the the most recent k memories, from all memories when k=0"""already_observed = self.get(k)news: list[Message] = []for i in observed:if i in already_observed:continuenews.append(i)return newsdef get_by_action(self, action) -> list[Message]:"""Return all messages triggered by a specified Action"""index = any_to_str(action)return self.index[index]def get_by_actions(self, actions: Set) -> list[Message]:"""Return all messages triggered by specified Actions"""rsp = []indices = any_to_str_set(actions)for action in indices:if action not in self.index:continuersp += self.index[action]return rsp
  1. find_news(self, observed: list[Message], k=0) -> list[Message]:从最近的 k 个存储的消息中查找新消息(之前未见过的消息),当 k=0 时从所有消息中查找。返回未见过的新消息列表。

  2. get_by_action(self, action) -> list[Message]:返回由指定动作触发的所有消息

  3. get_by_actions(self, actions: Set) -> list[Message]:返回由指定一组动作触发的所有消息

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

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

相关文章

Yarn与Zookeeper的介绍

Yarn--三大调度策略 FIFO(先进先出): 目前几乎已经没有人使用了. 类似于: 单行道. 好处: 每个计算任务能独享集群100%的资源. 弊端: 不能并行执行, 如果大任务过多, 会导致小任务执行时间过长. Capacity(容量调度): 我们用…

找到矩阵中位于降序15%位置的值

MATLAB实现 clc clearvars; matrix randn(10, 10); % 一个示例矩阵 disp(matrix)value find_value_at_15_percent(matrix); disp([位于降序中15%位置的值为: , num2str(value)]);% 验证 xreshape(matrix,1,100); ysort(x,descend); y(1:16)function value_at_15_percent fi…

缓存(反向代理)服务器-varnish

varnish简介: varnish是一款高性能且开源的反向代理服务器和HTTP加速器,(其实就是带缓存的反向代理服务器)它可以把整个HTTP响应内容缓存到内存或文件中,从而提高web服务器器的响应速度。 与传统的squid相比&#xff0…

【Java后端开发】教程及案例

Java后端开发是软件开发中的一个重要领域,它涉及到服务器端的程序设计、数据库交互、API开发、安全性处理等多个方面。以下是关于Java后端开发的教程和案例的详细介绍: ### Java后端开发基础 #### 1. Java基础知识 - 掌握Java基础语法、面向对象编程、…

压测Nginx时对Linux内核参数优化,以支持更高的并发

文章目录 Linux内核参数优化参数意义解析注意事项 Linux内核参数优化 编辑/etc/sysctl.conf文件 fs.file-max 999999 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_keepalive_time 600 net.ipv4.tcp_fin_timeout 30 net.ipv4.tcp_max_tw_buckets 5000 net.ipv4.ip_local_port_…

如何提高图片的分辨率?dpi修改工具推荐

在调整分辨率之前,我们需要了解什么是dpi分辨率,简单来说,分辨率是指图像中包含的像素数量,分辨率越高,图像就越清晰,常见的分辨率包括72dpi、96dpi和300dpi等,在打印照片或者一些考试平台对图片…

02-JDK新特性-泛型

泛型 什么是泛型 泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译是检测到非法的类型。 它的本质是参数化类型,也就是说操作的数据类型被指定为一个参数。 也就是将类型有原来的具体类型参数化,然后在…

【CVE复现计划】CVE-2023-27179

CVE-2023-27179 简介: GDidees CMS v3.9.1及更低版本被发现存在本地文件泄露漏洞,漏洞通过位于 /_admin/imgdownload.php 的 filename 参数进行利用。 影响版本: GDidees CMS v3.9.1及更低版本 POC: /_admin/imgdownload.php?filename/fla…

2024蓝桥杯每日一题(树形DP)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:病毒溯源 试题二:没有上司的舞会 试题三:生命之树 试题一:病毒溯源 【题目描述】 病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而…

MATLAB 自定义中值滤波(54)

MATLAB 自定义中值滤波(54) 一、算法介绍二、算法实现1.原理2.代码一、算法介绍 中值滤波,是一种常见的点云平滑算法,改善原始点云的数据质量问题,MATLAB自带的工具似乎不太友好,这里提供自定义实现的点云中值滤波算法,具体效果如下所示: 中值滤波前: 中值滤波后:…

前端性能优化-Table渲染速度优化

教务系统-排课页面性能优化总结 一、前言 在公司教务系统中,排课页面慢的令人发指,在某些情况由于数据量大导致页面主进程卡死,遂组织进行一次排查优化,现记录一下 二、效果对比 以下数据均为UAT环境 Performence对比 更改前: 主进程渲染时间为 8s 教务系统-排课页面性…

Ubuntu安装elasticsearch

Ubuntu系统上安装Elasticsearch可以通过多种方式进行,以下是几种常用的安装方法。在开始安装前,请确保你的系统是最新的,这可以通过运行sudo apt update和sudo apt upgrade命令来完成。 方法一:使用APT仓库安装(推荐&…

【日常积累】指定ruby版本环境安装

背景说明 在redis的5.0版本之前,使用redis提供的redis-trib创建redis集群时还需要依赖ruby环境。当然有时候我们自已也需要安装指定ruby版本环境。下面是安装时的大致过程,以及过程中遇到的问题解决。我使用的环境是centos7,小版本差别应该不…

std::exit功能介绍和析构函数调用

std::exit函数调用后,系统会终止当前执行的程序(无论主线程还是子线程调用,该程序都会被终止),在终止之前会有一些清理步骤会被执行: 静态存储对象(静态的或者全局的)会被析构&#…

MHA的实验部署

一、前期准备 准备四台虚拟机,一台主服务器,一台管理服务器,两台从服务器 在开始之前先要关闭所有服务器的防火墙,以免有一些麻烦 二、实际操作 2.1 配置主服务器 2.2 配置从服务器1和2 2.3 给主从服务器实现软链接 2.4 配置mysql…

Docker学习指南

前言 亲爱的读者们,欢迎来到这篇专为“小白”打造的 Docker 学习博客。作为一名运维工程师,我深知初学者在面对 Docker 这样的技术时可能会遇到的困惑与挑战。因此,本文将以浅显易懂的语言、详实的步骤和实用的示例,带领大家从零…

TypseScript再学习之类型别名和接口(10)

先看类型别名:使用关键字 type 声明,注意有等于号额 // 类型别名 使用关键字 type 声明,注意有等于号额 type Cat {name: string; }; let huahua: Cat {name: "花花", };type和interface不同之处在于:interface 是可以自动合并类型的&#…

【单片机 5.3开关检测】

文章目录 前言一、5.3开关检测1.1没按键按下的1.2有按键按下的 二、改进1.改进 三、独立键盘3.1为什么要取反3.2 实用的按键 总结 前言 提示:这里可以添加本文要记录的大概内容: 课程需要: 提示:以下是本篇文章正文内容&#xf…

春暖助学 梦想启航

(通讯员:赵灿飞 图:杨美、孙红浪) 春风拂面暖阳斜,爱心助学谱华章。为弘扬中华民族传统美德,动员社会力量,传播社会爱心,缓解宁乡西部特殊家庭学子学业面临的实际困难&#xff…