mem0 团队详解了 ByteDance 开源的 DeerFlow(GitHub trending #1,49.2k stars)的记忆系统设计。核心思路:不存储对话历史,而是用异步 LLM 提取器把对话「蒸馏」成结构化 Facts。
记忆写入流程
- 用户发消息 → Agent 响应
- MemoryMiddleware 过滤,只保留用户输入和最终 AI 响应
- 30 秒防抖计时器——新消息到达时重置,避免每轮对话都触发提取
- 防抖结束后,LLM 提取器输出 diff:
newFacts/factsToRemove/shouldUpdate - 原子写入
memory.json
30 秒防抖是个聪明的设计:用户连续发多条消息时不会反复触发提取,但又不会丢失时效性。
记忆注入方式
提取出的 Facts 以置信度评分 + 2000 token 预算的方式注入每个新 prompt 的 system prompt。存储用本地 JSON,结构大致包含:
userfacts:用户偏好、背景、项目状态sessionfacts:当前 session 的 FactslastUpdate:最后更新时间
和传统 RAG 的对比
| DeerFlow | 传统 RAG | |
|---|---|---|
| 存储内容 | 结构化 Facts | 原始文档块 |
| 注入方式 | 直接进 system prompt | 检索后拼入 context |
| 更新粒度 | 异步 diff,不累加 | 通常累加 |
| 存储成本 | 低(JSON 结构化) | 高(向量数据库) |
DeerFlow 的方案回避了向量检索的工程复杂度,用「对话蒸馏」替代 Embedding + Vector DB。对于 Agent 场景,记忆的核心需求是"记住关键事实"而非"检索相似文档",这个取舍很合理。
异步蒸馏 + diff 写入 + 防抖,三个设计组合在一起比堆 Token 进 context 的暴力方案优雅很多。对需要长期记忆的 Agent 项目值得参考。