跳转到内容

Agent 记忆系统的多存储实现

Agent 记忆系统的多存储实现

学习目标

  • 理解 ChatDev 的四种记忆存储类型及其适用场景
  • 掌握 SimpleMemory 的向量检索管线(FAISS + Embedding)
  • 了解记忆检索时机(四阶段)的配置方法
  • 能够根据任务需求选择合适的记忆类型

前置知识

本章涉及记忆系统的通用原理,建议先阅读:

下文聚焦 ChatDev 的具体记忆实现。


项目实践

四种记忆存储类型

ChatDev 在 runtime/node/agent/memory/ 中实现了四种记忆存储:

类型存储介质检索方式适用场景
SimpleMemory内存列表 + FAISS 向量索引语义相似度检索短期对话记忆,快速检索
FileMemory文件系统索引 + FAISS文件内容语义检索文档库、代码库检索
Blackboard内存列表 + 最大条目限制FIFO/LRU多 Agent 共享状态
Mem0Memory外部 Mem0 服务 API服务端语义检索跨会话长期记忆

SimpleMemory 实现细节

SimpleMemory 是 ChatDev 的默认记忆类型,核心实现包含三个关键机制:

1. 内容提取与精简

原始内容 → 去除冗余模板 → 提取关键句子(≥20 字符) → 最多取 3 句 → 截断至 500 字符

这个管线避免了将整个 System Prompt 存入记忆造成的噪声和 Token 浪费。

2. 向量索引(FAISS)

  • 使用 faiss.IndexFlatIP(内积索引)存储 embedding 向量
  • Embedding 通过 OpenAI text-embedding-3-small 或自定义 provider 生成
  • 检索时使用 top_k + similarity_threshold 过滤

3. MD5 去重

每个记忆条目通过内容前 8 位 MD5 哈希去重,避免重复写入相同内容。

记忆检索的四阶段配置

ChatDev 的记忆检索可以在 Agent 执行管线的四个阶段触发:

memories:
- name: conversation_history
retrieve_stage:
- pre_gen_thinking # 生成前思考阶段检索
- gen # 模型生成阶段检索
- post_gen_thinking # 生成后思考阶段检索
- finished # 完成阶段检索
top_k: 3
similarity_threshold: 0.7
read: true
write: true

关键设计readwrite 可以独立控制——某些记忆只读不写(如参考文档),某些只写不读(如执行日志)。

FileMemory 实现

FileMemory 用于对文件系统进行索引:

memory:
- name: codebase
type: file
config:
index_path: "./memory_index" # 索引存储路径
file_sources:
- path: "./src"
file_types: [".py", ".js"]
recursive: true
encoding: "utf-8"
embedding:
provider: "openai"
model: "text-embedding-3-small"

工作流程:

Blackboard 记忆

Blackboard 是多 Agent 共享的全局状态板:

memory:
- name: shared_state
type: blackboard
config:
memory_path: "auto"
max_items: 1000 # 最大条目数

当达到 max_items 时,最早的条目被自动淘汰。

全局记忆 vs 节点级记忆

ChatDev 支持两个记忆定义层级:

  • 全局记忆:适合共享上下文(如任务需求、报告结构)
  • 节点级记忆:适合节点私有状态(如 Agent 的个人经验)

问题与规避

问题表现规避策略
FAISS 索引过大内存占用高限制 max_items;定期重建索引
Embedding 成本过高每次写入都调用 API批量写入时聚合后统一 embedding
记忆检索返回不相关内容similarity_threshold 过低调高阈值或使用更精确的 query
Blackboard 条目淘汰过快max_items 过小根据实际消息量调整
Mem0 服务不可用API 超时配置 fallback 到 SimpleMemory

设计取舍

FAISS vs 数据库全文检索

维度FAISS 向量检索数据库全文检索
语义理解支持(embedding 相似度)不支持(关键词匹配)
速度极快(内存索引)较慢(磁盘 I/O)
持久化需手动保存索引文件原生持久化
ChatDev 的选择✅ 默认❌ 未采用

多存储类型并存的原因

ChatDev 没有选择单一记忆类型,而是提供四种:

  • SimpleMemory:轻量、快速,适合大部分场景
  • FileMemory:适合已有文件库的项目(如代码仓库)
  • Blackboard:适合多 Agent 共享状态的场景
  • Mem0:适合需要跨会话长期记忆的场景

参考来源