菜单

大脑内存

相关源文件

MetaGPT中的Brain Memory系统为代理提供了长期存储和记忆管理能力。它处理对话历史存储、知识保留、自动记忆摘要以及使用Redis进行的持久化存储。该系统使代理能够在交互过程中保持上下文,回忆相关信息,并通过智能摘要优化内存使用。

有关Experience Pooling(一种用于缓存函数输出的独立记忆系统)的信息,请参阅Experience Pooling

架构概述

BrainMemory是主要由Assistant角色使用的核心记忆组件,用于存储对话历史、相关知识并生成过去交互的摘要。

来源:metagpt/memory/brain_memory.py26-259 metagpt/roles/assistant.py37-45

核心组件

BrainMemory类由几个关键组件组成,它们协同工作以提供一个全面的记忆系统。

组件类型目的
historyList[Message]存储最近的对话消息
knowledgeList[Message]存储代理可用的知识/事实
historical_summarystr早期对话历史的压缩摘要
last_history_idstr最新消息的ID
is_dirtybool指示自上次保存以来内存是否已被修改的标志
last_talkOptional[str]最近的用户消息
cacheablebool内存是否应缓存在Redis中
llmOptional[BaseLLM]用于摘要和其他操作的LLM实例
configOptional[_Config]配置设置

来源:metagpt/memory/brain_memory.py26-36

记忆处理流程

下图说明了消息如何通过BrainMemory系统进行流动,包括添加消息、摘要和持久化的过程。

来源:metagpt/memory/brain_memory.py45-110 metagpt/roles/assistant.py118-130

消息管理

BrainMemory提供了添加和管理不同类型消息的方法。

添加消息

消息通过两种主要方法添加到内存中:

  1. add_talk(msg):添加用户消息,将角色设置为“user”。
  2. add_answer(msg):添加助手消息,将角色设置为“assistant”。

这两种方法都调用add_history(msg),该方法会:

  • 检查消息ID是否比最后历史ID新。
  • 将消息添加到历史记录列表中。
  • 更新最后历史ID。
  • is_dirty标志设置为True

来源:metagpt/memory/brain_memory.py45-57 metagpt/memory/brain_memory.py103-110

知识管理

The knowledge 属性存储代理可用的信息。get_knowledge() 方法将所有知识消息合并为一个文本块。

此知识文本用于LLM的提示中,以提供响应的上下文。

来源:metagpt/memory/brain_memory.py59-61

通过Redis进行记忆持久化

BrainMemory使用Redis对内存数据进行持久化存储。

保存和加载记忆

内存使用dumps方法保存到Redis。

内存使用loads方法从Redis加载。

Redis中的键使用to_redis_key方法进行格式化。

来源:metagpt/memory/brain_memory.py63-89 metagpt/utils/redis.py19-63

通过摘要优化记忆

BrainMemory通过摘要技术实现了复杂的记忆优化。

摘要方法

该系统支持基于LLM提供商的不同摘要方法:

  1. OpenAI摘要:使用递归方法处理长文本,如有需要则将其分割成窗口。
  2. MetaGPT摘要:使用一种更简单的方法,将最近的历史摘要到一定的字数限制。

摘要过程:

  1. 结合历史摘要和最近历史。
  2. 检查合并后的文本长度是否超过阈值。
  3. 对于长文本,将其分割成窗口并摘要每个窗口。
  4. 如果需要,递归地摘要合并的窗口摘要。
  5. 更新历史摘要并清除历史记录列表。

来源:metagpt/memory/brain_memory.py130-344

语义分析能力

BrainMemory包含文本的语义分析能力。

相关性检测

The is_related 方法确定两个文本是否在语义上相关。

对于OpenAI模型,它使用结构化提示询问两个段落是否在语义上相关。

句子改写

The rewrite 方法使用上下文中的信息来增强句子。

对于OpenAI模型,它构建了一个提示,要求LLM使用上下文来增强句子。

来源:metagpt/memory/brain_memory.py198-246

与Assistant角色的集成

Assistant角色使用BrainMemory来管理对话上下文并生成响应。

关键集成点

  1. 添加用户输入:Assistant的talk方法将用户消息添加到内存中。

  2. 内存优化refine_memory方法:

    • 检索最后的用户输入。
    • 检查是否有相关的对话历史。
    • 如有需要,摘要对话历史。
    • 检查当前输入是否与历史记录相关。
    • 如果相关,将相关上下文与当前输入合并。
  3. 生成响应act方法:

    • 使用内存内容生成响应。
    • 将响应添加到内存中。
  4. 加载和保存内存get_memoryload_memory方法用于在会话之间持久化内存。

来源:metagpt/roles/assistant.py36-140 metagpt/actions/talk_action.py16-96

TalkAction中的用法

TalkAction利用BrainMemory的历史和知识为LLM响应提供上下文。

来源:metagpt/actions/talk_action.py74-90

结论

Brain Memory系统是MetaGPT的一个复杂组件,它为会话代理提供了智能记忆管理。它平衡了即时上下文(近期历史)与压缩上下文(历史摘要)和相关知识,以实现自然、上下文感知的交互。它与Redis的集成允许持久化存储,而其摘要和语义分析能力则优化了内存使用并增强了响应的相关性。

该系统展示了MetaGPT在长期会话中保持上下文并同时高效管理内存的解决方案。