Ch08: DB-Agent-Memory——四层金字塔与零依赖哲学
Part 3: 七大开源项目精读 前置章节:Ch07: 记忆系统的设计约束——存什么、怎么存、何时忘 后续章节:Ch09: mem0——极简事实提取与 25+ 后端生态
0. 一句话定位
腾讯出品的 Agent 记忆引擎,约 90 文件,零第三方依赖,用四层金字塔(Observation → Fact → Summary → Profile)对记忆做分层压缩,是目前代码量最小、部署最轻、分层最明确的开源记忆系统。
如果你只用一个关键词记住这个项目,那就是”分层”——所有设计选择都围绕”把记忆按重要性和抽象度分层”展开。
1. 设计哲学——快递分拣中心
1.1 从一个日常场景说起
想象一个快递分拣中心。每天几万个包裹涌入,从货车卸下来的时候,它们只是”原始包裹”——有的写着”3 号楼 502 王女士”,有的写着”退回发件人”,有的贴着”易碎品”标签。分拣中心要做的事情,就是把这些原始包裹逐层处理:
第一步:接收原始包裹。包裹从货车上卸下来,工人扫描条码,记录”什么时间、从哪里来、外观如何”。这一步不判断包裹重不重要,只是忠实记录——就像你写日记,今天发生了什么事,先记下来再说。
第二步:分拣归类。根据包裹上的信息,把它归入不同类别——生鲜件、普通件、退件。同时提取关键事实:”王女士的包裹是电子产品”“李先生的包裹标注了退货”。这一步开始做判断了,但判断还很具体,每个事实都是独立的。
第三步:装箱汇总。同一个楼栋的包裹装进一个箱子,箱子上贴一张汇总单:”3 号楼今日 12 件,其中电子产品 3 件、生鲜 2 件、普通 7 件”。汇总比单个事实更抽象,但也更紧凑——你不需要知道每件包裹的细节,看汇总单就知道今天的大致情况。
第四步:客户画像。经过长期观察,分拣中心发现王女士每周至少收 3 件电子产品,偏好下午签收,对包裹完好度要求高——这就是客户画像。画像是所有层级中最精炼的,一条画像可以概括几十条汇总、上百条事实、上千条原始记录。
DB-Agent-Memory 的四层金字塔就是这个逻辑:
| 层级 | 快递类比 | 记忆内容 | 特征 |
|---|---|---|---|
| L0: Observation | 原始包裹 | 对话中的原始观测(用户说了什么、Agent 做了什么) | 最详细、最冗余、变化最快 |
| L1: Fact | 分拣归类 | 从观测中提取的独立事实(”用户偏好 Python”“项目用 React”) | 结构化、可验证、独立存在 |
| L2: Summary | 装箱汇总 | 对事实的阶段性总结(”用户本周主要在学后端开发”) | 更精炼、有时效性、可刷新 |
| L3: Profile | 客户画像 | 长期稳定的用户/项目画像(”用户是后端工程师,偏好 Python”) | 最精炼、最稳定、跨会话持久 |
1.2 越往上越精炼
四层金字塔的核心规律:越往上,信息越精炼,越稳定,越通用。
精炼:一条 Profile 画像(”用户是后端工程师”)可能浓缩了数十条 Summary(”用户本周学 Django”“用户上周部署 FastAPI”),每条 Summary 又浓缩了数十条 Fact(”用户选择 Python 而非 Go”“用户询问 ORM 方案”),每条 Fact 来自数条 Observation(”用户输入:我该用 Flask 还是 Django?”“Agent 回复:取决于你的项目规模”)。
做一个粗略的量化估计。假设一天 10 次对话,每次产生约 50 条观测:
- L0 Observation:500 条/天
- L1 Fact:约 50 条/天(10:1 压缩)
- L2 Summary:约 5 条/天(再 10:1 压缩)
- L3 Profile:约 0.5 条/天(再 10:1 压缩,且很少变化)
一个月下来,L0 累积 15000 条,L3 可能只有 15 条。但那 15 条 Profile 的价值,可能比 15000 条原始观测更大——因为它们是经过反复验证、高度凝练的核心认知。
稳定:Profile 一旦形成就不容易变化。”用户是后端工程师”这个画像可能在数月内都成立。而 Observation 每次对话都在变化——上一条还是”用户在写 Flask”,下一条可能变成”用户切换到 Django 了”。稳定性意味着上层记忆不需要频繁重写,存储和检索的开销更可控。
通用:Profile 层的画像适用于各种场景——不管用户是在问代码问题、讨论架构还是请求代码审查,”用户偏好 Python”这条画像都有用。而底层 Observation 的适用范围很窄——”用户在第三次对话中说了一句嗯”几乎没有任何复用价值。
1.3 每层的写入触发、存储方式、容量特征
要真正理解四层金字塔,需要知道每一层”什么时候写入”“怎么存”“能存多少”。这些细节决定了系统的运行方式。
L0 Observation(观测层)
- 写入触发:每次对话交互后自动写入。Agent 收到用户消息并回复后,整个交互被作为一条观测记录下来
- 存储方式:JSON 格式,包含时间戳、角色(用户/Agent)、内容、会话 ID
- 容量特征:增长最快、最占空间,但同时也是信息密度最低的一层。不设容量上限(理论上可以无限累积),但过期的观测价值迅速衰减
- 关键问题:噪声多。一次对话中的”好的”“嗯”“谢谢”都是观测,但几乎不携带有用信息
L1 Fact(事实层)
- 写入触发:LLM 从 Observation 中提取。每条观测被送入 LLM,LLM 判断其中是否包含值得记录的独立事实
- 存储方式:结构化文本,每条事实是一个独立的陈述句(”用户在北京工作”“项目使用 PostgreSQL”)
- 容量特征:比 L0 小一个数量级,但仍然会持续增长
- 关键问题:冲突检测。新事实可能与已有事实矛盾(”用户用 Python” vs “用户改用 Rust 了”),需要机制来识别和解决冲突
L2 Summary(摘要层)
- 写入触发:当 L1 Fact 累积到一定数量或经过一定时间后,LLM 对一批事实做总结
- 存储方式:自然语言段落,每条摘要概括一个时间段或一个主题的事实集合
- 容量特征:比 L1 再小一个数量级,且可以定期刷新(用新摘要替换旧摘要)
- 关键问题:质量评估。摘要好不好,不像事实那样可以简单判断真假——”用户本周主要在学后端”这个摘要是否准确,需要衡量标准
L3 Profile(画像层)
- 写入触发:当 L2 Summary 中出现反复出现的模式或长期稳定的特征时,晋升为 Profile
- 存储方式:键值对形式(”技术栈: Python”“角色: 后端工程师”“偏好: 函数式风格”)
- 容量特征:最稳定、最精炼,通常不超过几十条
- 关键问题:多维度建模。一个用户画像可能有多个维度——技术偏好、沟通风格、项目类型、学习节奏——如何结构化地表示这些维度
这四层不是孤立的,而是通过”晋升”机制连接:L0 中的信息经过提取变成 L1,L1 经过总结变成 L2,L2 经过模式识别变成 L3。信息从底层流向顶层,每经过一层都被压缩和精炼。
反过来,检索的时候是从顶层往下找:先看 Profile 有没有直接相关的画像,再看 Summary 有没有更具体的上下文,最后才去 Fact 和 Observation 层找细节。这个”写时从底到顶,读时从顶到底”的流向是 DB-Agent-Memory 的核心设计。
2. Host-Adapter 架构
2.1 为什么需要 Host 和 Adapter 分离
如果你做过 Android 开发,一定熟悉一个概念:操作系统提供标准 API,手机厂商做适配。Android 系统本身不关心你用的是小米还是三星——它定义好摄像头、屏幕、传感器等接口,具体硬件怎么实现由各厂商的驱动层负责。
DB-Agent-Memory 的 Host-Adapter 架构用了同样的思路:
- Host:记忆引擎的核心。包含四层金字塔的数据结构、写入/读取逻辑、MMD 注入、晋升机制等。它不依赖任何具体的 Agent 框架——不知道你用的是 LangChain、AutoGen 还是自研框架
- Adapter:针对具体 Agent 框架的适配层。负责把 Host 的记忆能力”接入”到特定框架中——监听对话、调用 Host 的写入接口、把 Host 的记忆注入到 Agent 的上下文
这种分离带来的好处是:
- Host 可以独立演进,不受任何框架的 API 变更影响
- 新框架只需要写一个 Adapter 就能接入,不需要改 Host
- 不同 Adapter 可以有不同的接入策略——有的主动推入记忆,有的被动等待查询
2.2 Host 内部结构
Host 是 DB-Agent-Memory 的”心脏”。它提供以下核心能力:
记忆写入:接收新的对话内容,逐层处理——先存为 Observation,然后触发 Fact 提取,再根据条件触发 Summary 和 Profile 更新。
记忆检索:根据当前对话上下文,从四层金字塔中检索相关记忆。检索顺序是 L3 → L2 → L1 → L0,从精炼到详细。
MMD 生成:生成 Memory Meta Document,精炼的记忆摘要文档(详见第 3 节)。
晋升管理:控制记忆从底层到顶层的晋升流程——什么时候把 Fact 合并为 Summary,什么时候把 Summary 提炼为 Profile。
Host 的代码组织非常简洁,核心逻辑集中在几个文件中:
- 金字塔数据模型定义
- 写入和晋升流程
- MMD 生成逻辑
- 检索排序策略
没有框架依赖,没有网络层,没有持久化引擎绑定——这些全部留给 Adapter 或上层实现。
2.3 Adapter 的职责和工作方式
Adapter 做两件事:
监听对话,自动流入记忆引擎:当用户和 Agent 交互时,Adapter 拦截对话内容,自动调用 Host 的写入接口。对 Agent 来说,记忆的记录是完全透明的——不需要在每次对话后手动调用”记住这个”的 API。
注入记忆,影响 Agent 行为:在新对话开始时或对话过程中,Adapter 调用 Host 的检索接口,获取相关记忆,注入到 Agent 的 prompt 中。
目前已有的 Adapter:
- tRPC-Agent-Go:针对腾讯内部的 tRPC-Agent Go 版本
- tRPC-Agent-Python:针对腾讯内部的 tRPC-Agent Python 版本
这两个 Adapter 都是为腾讯内部框架服务的。如果你用的是 LangChain、CrewAI 等开源框架,目前需要自己写 Adapter——但这并不困难,因为 Host 的接口很简单(写入 + 检索 + MMD 生成),Adapter 只需要做”对话拦截 → 调用 Host → 注入 prompt”三件事。
2.4 和 MCP Server 的本质区别
你可能听说过 MCP(Model Context Protocol),这是 Anthropic 提出的 Agent 工具调用协议。MCP 也可以用来做记忆——把记忆系统包装成一个 MCP Server,Agent 通过 tool call 来读写记忆。
DB-Agent-Memory 的 Adapter 和 MCP Server 都是在 Agent 和记忆引擎之间架一座桥,但桥的设计理念完全不同:
| 维度 | Adapter | MCP Server |
|---|---|---|
| 数据流向 | 对话自动流入,无需 Agent 主动调用 | Agent 需要通过 tool call 主动读写 |
| 延迟 | 本地调用,几乎零延迟 | 每次读写都是网络往返(HTTP/gRPC) |
| Agent 依赖 | Agent 不需要知道记忆系统的存在 | Agent 需要知道有哪些 memory tool 可用 |
| 记忆质量 | 系统自动决定记什么,Agent 专注业务 | Agent 需要决定”是否值得记”“记什么” |
| 灵活性 | 接入策略由 Adapter 控制,Agent 无法干预 | Agent 可以主动选择何时读写记忆 |
关键区别在”自动流入 vs 显式调用”。
Adapter 模式就像手机操作系统的后台同步——你打开通讯录 App,通讯录自动从云端同步最新数据,你不需要点”同步”按钮。Agent 每次对话的内容自动流入记忆引擎,Agent 不需要想”我该不该记这个”。
MCP 模式就像你手动导出通讯录到 U 盘——你需要主动执行”导出”操作。Agent 每次想读写记忆都要通过 tool call,这要求 Agent 有足够的元认知能力来判断”现在该不该记”“记什么”。
哪种更好?取决于你的 Agent 设计哲学:
- 如果你觉得记忆应该是”系统基础设施”,Agent 应该专注于业务逻辑——选 Adapter
- 如果你觉得 Agent 应该有自主权,自己决定记什么忘什么——选 MCP
DB-Agent-Memory 目前走的是 Adapter 路线,但竞赛贡献方向之一就是增加 MCP Adapter(详见第 6 节),让两种模式可以共存。
3. MMD(Memory Meta Document)注入优化
3.1 核心问题:记忆太多怎么办
假设 Agent 和用户交互了一个月,累积了:
- 15000 条 Observation
- 1500 条 Fact
- 150 条 Summary
- 15 条 Profile
把这些全塞进 prompt?16665 条记忆,即使每条只有 20 token,也是 333300 token——远超任何模型的上下文窗口,更不要说成本和延迟。
只塞 Profile?15 条画像确实放得下,但如果用户问了一个具体的细节问题(”上周三我们讨论的数据库方案是什么”),Profile 里没有这个信息。
只塞相关记忆?用什么判断”相关”?语义搜索需要向量数据库,但 DB-Agent-Memory 是零依赖的——不想引入向量搜索组件。
这是 DB-Agent-Memory 面临的核心矛盾:分层压缩解决了”存什么”的问题,但没解决”注入什么”的问题。
3.2 MMD 的解决思路
MMD(Memory Meta Document)的思路是:不把记忆内容本身塞进 prompt,而是生成一份精炼的”记忆摘要文档”,把这份文档注入 prompt。
类比一下:你想了解一本书的内容,两种方式:
- 把整本书 300 页全读一遍
- 读一份 3 页的读书摘要——摘要包含全书的核心论点、关键论据、章节结构,但不包含原文
MMD 就是第二种方式。它不是把 16665 条记忆的原文塞进 prompt,而是由 LLM 生成一份精炼的文档,概括当前记忆库的核心内容。
具体来说,MMD 的生成流程是:
- 收集所有 Profile(最精炼层,只有十几条)
- 收集最近和最相关的 Summary
- 用 LLM 将这些信息整合成一份结构化文档
- 文档长度控制在预设的 token 预算内
MMD 示例:
## 用户画像
- 角色:后端工程师,3 年经验
- 技术栈:Python (FastAPI/Django),PostgreSQL,Redis
- 偏好:函数式风格,注重代码可读性
- 沟通风格:喜欢直接给出结论,不需要过多铺垫
## 近期项目
- 正在开发一个用户认证服务,使用 FastAPI + JWT
- 上周解决了 JWT token 刷新的并发问题
- 本周计划:添加 OAuth2 第三方登录
## 已知约束
- 项目要求 Python 3.10+ 兼容
- 部署环境为腾讯云,使用 tRPC 框架
这份 MMD 大约 200 token,但它浓缩了数千条原始记忆的核心信息。
3.3 和 KV Cache 的类比
MMD 和 KV Cache 有相似的”预计算复用”思想。KV Cache 缓存已计算的 Key-Value 向量复用,用空间换时间;MMD 预蒸馏记忆库为精炼文档复用,用计算换 token。两者都需要处理”源数据变化时缓存是否失效”的问题——当记忆库发生重大变化时,旧 MMD 需要重新生成。
3.4 效果场景与局限
MMD 在”记忆条目多但注入 token 预算有限”的场景下最明显:长期交互用户(每次注入从 O(n) 降到 O(1))、多用户系统(为每个用户维护 MMD 比实时检索高效)、高频对话(生成一次服务多次,摊薄成本)。
MMD 的局限:
- 长尾信息丢失——三个月前的冷门偏好 MMD 可能不包含
- 时效性模糊——”近期项目”缺乏精确时间标注
- 无法动态调整——MMD 是通用摘要,不能根据当前问题针对性检索
4. 零依赖设计
4.1 什么叫”零依赖”
DB-Agent-Memory 的依赖列表极其简短:Python 标准库 + 任一 LLM provider。不需要向量数据库,不需要图数据库,不需要 Redis,不需要任何第三方框架。
对比其他记忆系统的依赖:
| 系统 | 核心依赖 | 可选依赖 |
|---|---|---|
| DB-Agent-Memory | Python 标准库 + LLM | 无 |
| mem0 | LLM + 向量数据库 | 25+ 向量后端 |
| Letta | LLM + PostgreSQL + 多个框架 | Docker |
| Graphiti | LLM + Neo4j + 多个库 | 无 |
| cognee | LLM + 图数据库 + 向量数据库 + 多个库 | 多种后端 |
| MemOS | LLM + MongoDB + Redis + 多个库 | Docker |
从依赖数量来看,DB-Agent-Memory 是 7 个项目中最少的——只有 1 个(LLM provider)。其他项目至少需要 2-3 个核心依赖。
4.2 零依赖的好处
部署极简:只需要 pip install 一个包,配置好 LLM API key,就能跑起来。不需要安装 Qdrant/Neo4j/PostgreSQL 等外部服务,不需要 Docker Compose 编排多个容器。这在以下场景特别有价值:
- 快速原型验证:你想测试一个记忆系统是否对你的场景有用,5 分钟就能搭起来
- 嵌入式部署:你的 Agent 运行在资源受限的环境中(如边缘设备、小程序后端),跑不起向量数据库
- 腾讯内部集成:腾讯的基础设施有自己的一套(tRPC 而非 gRPC,TDSQL 而非 PostgreSQL),零依赖意味着不需要适配外部组件
无版本冲突:每个 Python 开发者都经历过”依赖地狱”——项目 A 要求 numpy 1.24,项目 B 要求 numpy 1.26,两个版本不兼容。零依赖意味着不会有这个问题——DB-Agent-Memory 的代码只用了标准库,不会和其他项目的依赖冲突。
安全审计容易:企业内部使用开源软件需要做安全审计。每个第三方依赖都是一个潜在的安全风险点——它可能有已知漏洞(CVE),可能有恶意代码(供应链攻击),可能使用不安全的协议。零依赖 = 零第三方安全风险。在腾讯这样的企业环境中,这是一个重要优势。
代码可读性高:约 90 个文件,全部是项目自己的代码,没有第三方”黑盒”。任何一个贡献者都可以在合理时间内读完所有代码,理解整个系统。相比之下,cognee 有 2290 个文件,MemOS 有 1796 个文件——要完整理解它们的代码库需要数周时间。
4.3 零依赖的代价
零依赖不是没有代价的。选择不用某个组件,意味着要么自己实现,要么放弃那个能力。
代价一:没有向量搜索——无法处理语义等价但措辞不同的情况(”偏好函数式”和”喜欢 FP 风格”),LLM 筛选延迟高且成本随记忆量增长。
代价二:没有图数据库——无法表达记忆间的”因为”关系,无法做多跳推理(”用户喜欢 Python → Python 生态有 FastAPI → 可能偏好 FastAPI”),层间关系只是隐含的。
代价三:持久化需自己解决——Host 只提供内存数据结构和操作接口,持久化由 Adapter 或上层实现。这是设计哲学:用 SQLite(标准库自带)或 TDSQL 都行,Host 不强制。
4.4 零依赖的边界在哪里
零依赖是一个设计选择,不是宗教信条。DB-Agent-Memory 选择零依赖,是因为它的定位是”记忆引擎核心”——只做分层压缩和注入优化,把检索、持久化、框架集成等工作交给上层。
但如果你需要在生产环境中使用 DB-Agent-Memory,你几乎必然需要引入额外依赖:
- 需要向量搜索 → 引入 Qdrant 或 ChromaDB
- 需要持久化 → 引入 PostgreSQL 或 MongoDB
- 需要高并发 → 引入 Redis 做缓存
- 需要框架集成 → 引入 LangChain 或其他 Agent 框架
零依赖的价值在于:这些选择都是”可选的”而不是”强制的”。你可以从最简配置开始,按需增加依赖——而不是一开始就被迫安装一整套基础设施。
这就像搭积木:DB-Agent-Memory 提供了最核心的那块积木(四层金字塔 + MMD),你可以自由选择其他积木来扩展它。而其他系统更像是一套预拼好的模型——功能完整,但不容易拆开重组。
5. 代码结构与核心流程
5.1 项目文件组织
DB-Agent-Memory 约 90 个文件,核心分两层:host/(记忆引擎,纯逻辑)和 adapter/(框架适配,胶水代码)。host/ 下包含 models/(四层数据模型)、engine/(写入/检索/MMD 逻辑)、config/(配置管理)。adapter/ 下目前有 tRPC-Agent Go 和 Python 两个适配。
5.2 晋升流程
记忆从 L0 到 L3 的晋升是核心流程:
- 每次对话后,Observation 自动存入 L0
- LLM 从 Observation 中提取 Fact → 冲突检测 → 存入 L1
- Fact 累积到一定数量时触发 Summary 生成 → 存入 L2
- Summary 中出现稳定模式时触发 Profile 更新 → 存入 L3
三个关键触发条件:should_summarize(新事实超过 N 条)、should_update_profile(出现新模式)、find_conflicts(新事实与已有事实矛盾)。
5.3 冲突检测
典型冲突场景:
- 明确矛盾——”用 React” vs “改用 Vue”:后到优先,旧事实标记为 superseded
- 语义模糊——”喜欢简洁代码” vs “代码要详尽注释”:可能不矛盾,需 LLM 判断
- 提取错误——”不喜欢 Python 的 GIL” 被误提取为”不喜欢 Python”:非事实冲突而是提取质量问题
当前策略”够用但粗糙”——依赖 LLM 判断,没有形式化推理,没有”部分冲突”概念。这些都是竞赛贡献的方向。
6. 竞赛贡献方向
这一节是本章最重要的部分——如果你参加犀牛鸟竞赛想给 DB-Agent-Memory 贡献代码,这里有具体的技术方向和难度评估。
6.1 L0 Observation 层:噪声过滤
问题:当前 L0 层对所有观测一视同仁——”用户说嗯”和”用户说我要从 React 切换到 Vue”被同等存储。噪声太多导致后续提取效率低、存储浪费。
方向一:观测重要性预评分——给每条观测打”重要性分数”,低于阈值的丢弃或降优先级。可借鉴 Claude Code 的 staleness 标注机制。难度:中等。
方向二:观测压缩——把多条相关观测压缩成一条,如日志系统把多轮寒暄压缩为一条摘要。难度:中等。
6.2 L1 Fact 层:冲突检测增强
问题:当前的冲突检测依赖 LLM 判断,质量不稳定。而且只能检测”二元冲突”(新事实和旧事实矛盾),无法处理”部分冲突”和”上下文依赖冲突”。
方向一:结构化冲突检测——先把事实结构化(如”用户偏好 Python”→{技能偏好: Python}),在结构化维度上做精确冲突判断,而非依赖 LLM 的模糊判断。难度:中高。
方向二:上下文感知冲突——给每条事实加上下文标签(如”工作项目”vs”个人项目”),冲突检测只在同一上下文内进行。难度:中等。
6.3 L2 Summary 层:质量指标
问题:当前的摘要质量全靠 LLM 生成能力,没有客观的评估标准。一个好的摘要应该覆盖重要事实、不遗漏关键信息、不包含错误推断——但系统无法自动判断摘要是否满足这些条件。
方向一:摘要覆盖率指标——摘要覆盖的事实 / 总事实数。用 LLM 反向检查,但需区分”覆盖重要事实”和”覆盖所有事实”。难度:中等。
方向二:摘要一致性检查——验证摘要每条陈述都能在原始事实中找到依据,防止 LLM “脑补”。难度:中高。
6.4 L3 Profile 层:多维度建模
问题:当前的 Profile 画像比较扁平——就是一组键值对。但一个人的画像是多维度的——技术偏好、沟通风格、学习节奏、项目类型、工作习惯——这些维度之间还有关联。
方向一:结构化画像模板——为不同角色设计画像模板(如开发者模板含技术栈、经验水平、代码风格等维度),每条 Profile 属于某个维度。难度:中等。
方向二:画像维度权重——给维度加相关性权重(时间衰减或主题相关度),注入时按权重排序。难度:低中。
6.5 跨层联动:自动晋升机制
问题:当前的晋升触发条件比较粗糙——”累积到 N 条事实就触发摘要”。但理想的晋升应该是”当 L1 的某些事实已经足够稳定和重要,应该自动晋升到 L2/L3”,而不是机械地计数。
方向一:稳定性检测——给事实加引用计数,被多次提及的事实自动标记为”稳定”,优先晋升。难度:低,最简单实用的晋升优化。
方向二:重要性评分——结合稳定性(被反复提及)和重要性(对 Agent 行为有实际影响)两个维度判断是否晋升。难度:中等。
6.6 Dreaming/整合机制
问题:当前的记忆更新是”增量式”的——每次对话后只处理新产生的观测。但记忆系统需要”整合式”的处理——定期回顾所有记忆,发现新的关联,修正错误,精简冗余。
这就像你整理房间:日常是把新买的东西放到该放的位置(增量式),但每隔一段时间需要大扫除——扔掉不需要的、重新归类放错的、发现被遗忘的好东西(整合式)。
方向:借鉴 OpenClaw 的 Dreaming 机制和 MemOS 的后台巩固管线,在 Agent 闲置时(如用户不在线的夜间)做后台整合:
- 回顾 L0 中的观测,提取之前遗漏的事实
- 检查 L1 中的事实是否有可以合并的(”用户喜欢 Python”“用户偏好 Python”“用户选了 Python 而非 Go”→ 合并为一条)
- 刷新 L2 摘要,确保它们反映最新的 L1 状态
- 更新 L3 画像,修正过时的信息
难度:高。这是最有挑战性但也最有价值的方向——Dreaming 机制是目前所有开源记忆系统的薄弱环节,做出一个好的实现会是强有力的竞赛贡献。
6.7 MCP Adapter 增强
问题:当前只有 tRPC-Agent 的 Adapter,没有 MCP 接口。如果 DB-Agent-Memory 能作为 MCP Server 提供记忆服务,就能接入任何支持 MCP 的 Agent 框架(如 Claude Desktop、Cursor)。
方向:实现一个 MCP Server Adapter,把 DB-Agent-Memory 的记忆能力包装为 MCP tool:
memory_search:语义搜索记忆memory_add:手动添加记忆memory_profile:查看当前用户画像memory_mmd:获取 MMD 文档
难度:中等。MCP 协议本身不复杂,挑战在于如何让”自动流入 + MMD 注入”和”MCP tool call”两种模式共存——有些记忆应该自动处理(不需要 Agent 意识到),有些需要 Agent 主动参与(如 Agent 发现了一个重要偏好,主动调用 memory_add 记录)。
7. 和其他系统的对比定位
7.1 在七项目版图中的位置
DB-Agent-Memory 在七个开源记忆项目中,占据一个独特但边界清晰的生态位:
代码量最小:约 90 文件。mem0 约 200+ 文件,Letta 约 1155 文件,cognee 约 2290 文件。小代码量意味着低上手门槛——竞赛贡献者可以在一两天内通读全部代码。
部署最轻:零第三方依赖。其他项目至少需要 2-3 个外部服务。轻部署意味着容易嵌入各种环境——从腾讯内部的 tRPC 服务到个人开发者的笔记本电脑。
分层最明确:四层金字塔的分层是最清晰的。mem0 只有扁平的事实列表,Letta 分 Core/Archival/Recall 三层但不做压缩,Graphiti 和 cognee 用图结构而非分层,MemOS 有分层但不如 DB-Agent-Memory 的四层明确。
检索能力最弱:没有向量搜索、没有图遍历,检索主要靠关键词匹配 + LLM 筛选 + MMD 注入。在记忆量大时,检索质量可能不如 mem0(向量搜索)和 Graphiti(图遍历)。
图结构最弱:没有显式的关系建模,记忆之间的关系只是隐含的(通过 source_observation_ids 追溯)。Graphiti 和 cognee 在这方面有天然优势。
7.2 和其他项目的关键对比
和 mem0 的分歧在”分层 vs 扁平”:DB-Agent-Memory 用四层金字塔 + MMD 注入 + 零依赖 + Adapter 自动流入;mem0 用扁平列表 + 向量搜索 + 25+ 后端 + API 调用。前者认为记忆有层次之分,后者认为所有事实同等重要。
和 Letta 的分歧在”谁管理记忆”:DB-Agent-Memory 系统自动管理(Adapter 流入 + Host 晋升),Letta Agent 自管理(tool call 读写)。详见 Ch10。
和 Graphiti/cognee 的差距在”关系建模”:DB-Agent-Memory 没有显式关系,只有层间追溯;Graphiti 用时序知识图谱、cognee 用本体论驱动。需要多跳推理的场景 DB-Agent-Memory 做不到。
7.3 独特价值
尽管有检索弱、无图结构的局限,DB-Agent-Memory 有三个其他项目不具备的独特价值:
-
分层压缩的清晰示范:四层金字塔是目前开源项目中最好的分层记忆示范——概念清晰、实现简洁、可扩展。即使你不用 DB-Agent-Memory 的代码,这个分层设计也值得借鉴。
-
零依赖的可嵌入性:没有任何其他项目能做到”5 分钟部署、不引入任何外部服务”。对于需要将记忆能力嵌入现有系统的场景,这是巨大优势。
-
腾讯生态的原生支持:tRPC-Agent 适配、腾讯云部署友好——在腾讯内部的技术栈中,DB-Agent-Memory 是最自然的选择。
8. 本章小结
DB-Agent-Memory 的核心设计可以浓缩为三个关键词:
分层:四层金字塔(Observation → Fact → Summary → Profile)对记忆按重要性和抽象度分层压缩。越往上越精炼、越稳定、越通用。写入时从底到顶晋升,检索时从顶到底查找。
零依赖:只需 Python 标准库 + LLM。好处是部署极简、无版本冲突、安全审计容易。代价是没有向量搜索和图数据库,检索和关系建模能力受限。
MMD 注入:不把记忆全塞进 prompt,而是预生成精炼的”记忆摘要文档”,用预计算换 token 效率。在记忆条目多、注入预算有限的场景下效果最明显。
竞赛贡献的七个方向按难度排列:
- (低)稳定性检测——给事实加引用计数,稳定的事实自动晋升
- (低中)画像维度权重——给画像维度加时间衰减或主题相关度
- (中)噪声过滤——给观测打重要性分数,过滤低价值观测
- (中)上下文感知冲突——给事实加上下文标签,避免误判冲突
- (中)MCP Adapter——把 DB-Agent-Memory 包装为 MCP Server
- (中高)结构化冲突检测——先结构化事实再做精确冲突判断
- (高)Dreaming 整合——Agent 闲置时的后台记忆整合机制
下一章我们将看 DB-Agent-Memory 的”反面”——mem0 的扁平设计哲学,以及 25+ 后端生态带来的工程实践价值。两者对比,能帮你更深刻地理解”分层 vs 扁平”这个记忆系统的核心设计分歧。
导读目录:README.md 上一章:Ch07: 记忆系统的设计约束——存什么、怎么存、何时忘 下一章:Ch09: mem0——极简事实提取与 25+ 后端生态