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关键设计:read 和 write 可以独立控制——某些记忆只读不写(如参考文档),某些只写不读(如执行日志)。
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:适合需要跨会话长期记忆的场景