memory 厂商批判评审定稿 — 用 ATAM 砸碎 benchmark 排名
memory 厂商批判评审定稿 — 用 ATAM 砸碎 benchmark 排名
日期: 2026-08-14 阶段: Phase 2 - AI-native 参考架构 标签: #agent-memory #atam #mem0-letta-zep #benchmark-credibility
核心问题
P2 给 AML copilot 选 agent 长期记忆方案时,桌上摆着三家:Mem0、Letta(MemGPT 系)、Zep。最省事的做法是看一张 benchmark 排行榜挑分最高的。但本日要证明这条路是错的——
- benchmark 排名根本不可信。 同一个 LongMemEval,Mem0 自报 94.4%,第三方在 50K 会话生产负载下实测 49.0%,差 45.4 个百分点(mem0.ai 2026-06;fountaincity 2026)。Zep 自报 94.8%、第三方 63.8%。信排行榜 = 信厂商自家裁判。
- 选型该看什么? 答案是架构与任务的契合度,不是排名。三家是三种本质不同的记忆模型(OS 分页 / 时间知识图 / 向量+自编辑事实),对应三类不同任务形态。AML 的合规记忆有强时间维度(「该客户 2 月前是低风险、3 月被降级」),这决定了架构选择——而这一点在任何单一准确率数字里都看不见。
所以今天用 ATAM(架构权衡分析法) 做一次正式评审:先把 AML 记忆的质量属性场景钉死,再拿三家架构去碰场景,暴露风险点/敏感点/权衡点,最后才谈数字——并且用一套方法论判定哪些数字能信。
关键内容
A. ATAM 评审结构:场景—质量属性—风险点
ATAM(Kazman et al., CMU SEI)的核心不是「打分」,而是用质量属性场景去逼问架构决策,暴露出风险。它的产物是四类标记,不是一个总分:
- 风险点(Risk):可能危及业务目标的架构决策
- 非风险点(Non-Risk):经分析确认安全的决策
- 敏感点(Sensitivity Point):显著影响某一质量属性的决策(动它,该属性大变)
- 权衡点(Tradeoff Point):一个决策同时正向影响某属性、负向影响另一属性
评审第一步是建 utility tree(效用树):把抽象的「记忆要好」分解成可测的质量属性场景。AML copilot 的效用树(节点格式 (重要性, 难度)):
记忆系统效用
├── 时间正确性 (H, H)
│ └── 场景T1: 客户2月低风险→3月降级,问"当前风险等级"必须答"高",不被旧事实污染
├── 可审计性 (H, M)
│ └── 场景A1: 监管问"为何3月对该客户提SAR",须回放当时记忆快照+来源
├── 召回准确性 (H, H)
│ └── 场景R1: 30天50K会话后,问跨会话事实,准确率不塌方(<10%衰减)
├── 成本可控 (M, M)
│ └── 场景C1: 每次query记忆开销 ≤ 引擎调用token的30%
└── 可解释/可控 (M, H)
└── 场景E1: 能人工审查/编辑某条记住的事实(合规要求人在环)
这套效用树是评审的尺子——它把「选哪家」从口味之争变成「谁更满足 T1/A1/R1/C1/E1」的可论证问题。注意它和 Day 17 的 judge 校准同源:评测器(judge)和记忆(memory)都是基础设施,都必须先有可断言的尺子才能选型。
B. Mem0 / Letta / Zep 三方案架构对比(自编辑 / 分页 / 时间图)
三家是三种记忆哲学,不是同一东西的三个实现。逐一讲透「怎么做 + 为什么」:
① Mem0 — 向量 + LLM 自编辑事实(2025-04 论文) 管线是「抽取 → 决策更新」两段。每轮对话后,一个 LLM pass 从消息里抽取候选事实,再对每条候选与已存记忆做语义比对,输出四种操作之一:
for fact in extract_facts(new_messages):
related = vector_search(fact, memory_store, top_k)
op = llm_decide(fact, related) # 关键的"自编辑"决策
match op:
ADD -> 新事实,插入
UPDATE -> 与已存事实冲突/精化,覆写旧的
DELETE -> 新信息使旧事实失效,删除
NOOP -> 已知/无关,丢弃(防记忆膨胀)
UPDATE/DELETE 是它的灵魂:记忆不是 append-only 日志,而是自我修订的事实集。论文报 LOCOMO 上对全上下文基线 p95 延迟低 91%、token 省 >90%、LLM-judge 准确率相对提升 26%(arXiv 2504.19413, 2025-04)。图变体 Mem0g 加实体关系图,总分再高约 2%。
代价:每条事实的 ADD/UPDATE 判定本身是一次 LLM 调用,自编辑会犯错——把该 UPDATE 的判成 ADD,就留下两条矛盾事实(这正是第三方 49% 的祸根之一)。
② Letta(MemGPT 系) — OS 虚拟内存分页
把上下文窗口当 RAM、外部存储当磁盘,让 LLM 自己调函数把信息 page-in/page-out。两层:main context(在窗口内,working memory) + external context(recall storage 近期对话向量检索 / archival storage 长期事实语义检索)。memory blocks(如 human/persona 块)是结构化的功能单元,模型可以改写自己的 system prompt(lmatlas / letta.com 2026)。
为什么:解决「上下文装不下」——当 working memory 满,模型自主决定把什么换出。代价:分页决策交给模型 = 不可预测;模型可能把关键事实换出又忘了换回,且每次分页是函数调用,延迟与 token 都贵。
③ Zep — 时间知识图(Graphiti) 不存扁平向量,而是 bitemporal 知识图:每条边(事实)带两个时间轴——事件发生时间 与 被记录/失效时间。「Alice 2 月前管预算,之后 Bob 接手」是一等查询,不是字符串相似度猜测(agentmarketcap 2026-04)。 为什么对 AML 关键:合规记忆天生是 bitemporal 的——「我们当时知道什么」(audit) vs 「事实上何时变的」(truth),这正是场景 T1/A1 要的。代价:图构建/维护复杂,写入比向量贵;冷启动需要积累足够边才有价值。
| 维度 | Mem0 | Letta(MemGPT) | Zep(Graphiti) |
|---|---|---|---|
| 核心模型 | 向量+LLM自编辑事实 | OS 虚拟内存分页 | bitemporal 知识图 |
| 冲突处理 | UPDATE/DELETE 覆写 | 模型自行 page/编辑 | 边失效(invalidation),旧边保留 |
| 时间推理 | 弱(向量无时间轴) | 弱~中 | 强(一等公民) |
| 可审计性 | 中(事实被覆写→丢历史) | 中 | 强(旧边可回放) |
| 召回延迟(第三方) | p95 1.44s 级 | 较高(分页=多次函数调用) | ~200ms 检索 |
| 自报 LongMemEval | 94.4% | 93.4%(MemGPT) | 94.8% |
| 第三方 LongMemEval | 49.0%(50K会话/30天) | — | 63.8% |
| 主要风险 | 自编辑错判→矛盾事实 | 分页不可预测/贵 | 写入复杂/冷启动慢 |
反直觉洞察①(选 memory 看架构契合,不看 benchmark 排名):直觉是「Mem0 自报 94.4 > Zep 63.8 第三方,选 Mem0」。但这是拿苹果(自家裁判,理想数据)比橙子(第三方,生产负载)。真正该问的是「AML 记忆是什么形态」——它有强时间维度(T1)和审计回放需求(A1),而 Mem0 的 UPDATE 覆写恰恰销毁审计历史(覆写后「我们当时怎么想的」就没了),Zep 的边失效则保留旧边可回放。架构契合度上 Zep 完胜,哪怕它的裸准确率数字在某些 benchmark 上更低。 benchmark 量的是平均任务,你的任务不是平均任务。
C. benchmark 可信度方法论:哪些数字能信
第三方 49% vs 自报 94.4%,差 45 个点,不是测量噪声,是系统性偏差。要一套方法论判定数字可信度,而非简单「信第三方」:
可信度衰减四问(对任何记忆 benchmark 数字过一遍):
- 谁是裁判? 自报数多用厂商自己的 LLM-judge,口径可调(回顾 Day 17:judge 不校准就是橡皮图章)。第三方用独立 judge 或人工 → 可信度↑。
- 数据多久了? 自报常是单次/短会话理想数据;生产是30天/50K会话累积,记忆膨胀+矛盾事实累积才暴露。「30天后 49%」量的是衰减,不是初始准确率 → 二者不可比。
- 哪个 benchmark? LOCOMO(Mem0 领先)和 LongMemEval(Zep 领先)是不同任务分布——Mem0 领 LOCOMO、Zep 领 LongMemEval,「排名」取决于选哪张榜。没有「记忆最强」,只有「这个任务谁强」。
- 可复现吗? agentmarketcap(2026-04)直言 Mem0 数「来自其自家 arXiv 论文,独立复现值得等」。不可复现的数 = 营销,非证据。
| 数字来源 | 例子 | 可信度 | 用法 |
|---|---|---|---|
| 厂商自报 + 自家 judge + 短会话 | Mem0 94.4 / Zep 94.8 | 低 | 仅作架构能力上界参考,不入选型 |
| 第三方 + 独立 judge + 生产负载 | Zep 63.8 / Mem0 49.0(30天) | 中-高 | 选型主论据 |
| 自己在 AML 金标上实测 | (P3 待测,见落地) | 最高 | 唯一终审依据 |
反直觉洞察②(「30天后49%」不是「准确率49%」,是衰减度量):把第三方 49% 当作「Mem0 准确率只有 49%」是误读——它量的是初始装好后跑 30 天 50K 会话,记忆被矛盾事实污染后跌到 49%。这是时间维度上的衰减,初始准确率可能远高。同理 Mem0 自报 94.4 是初始/短会话。两个数测的是曲线上不同点,直接相减(45个点)制造了一个不存在的"造假"叙事。正确解读:Mem0 初始强、长期衰减快(自编辑错判累积);这恰恰指向 AML 这种长期、强审计场景该选衰减更慢的架构(保留历史的 Zep)。
这条方法论与 Day 17 judge 校准、Day 27 SOTA 复查一脉相承:任何外部数字进本项目设计前,先问裁判是谁、数据多久、能否复现。
设计要点/决策表
| 要点 | 决策 | 理由 |
|---|---|---|
| 选型依据 | ATAM 场景契合度优先,benchmark 排名仅作上界参考 | 排名是平均任务,AML 非平均 |
| 首选架构倾向 | 时间维度强的方案(Zep/Graphiti 类) | 场景 T1/A1 需 bitemporal + 审计回放 |
| benchmark 取信 | 第三方>自报;自己金标实测为终审 | 自报用自家 judge+短会话,系统性偏高 |
| 禁用做法 | 拿自报 94.4 减第三方 49.0 当"造假"证据 | 二者测曲线不同点,衰减≠准确率 |
| Mem0 风险标记 | UPDATE 覆写销毁审计历史 = 风险点 | 合规要求记忆可回放,覆写违背 |
| 落地阶段 | P2 出 ATAM 评审,P3 接真实 LLM 后金标实测 | 不在无数据时谎称已选定 |
对本项目的落地
- 不直接吞任何 SDK,先抽接口。 本仓现有记忆是会话级三层(
src/agent/memory/types.ts的SessionSummary/PinnedFact+summarizer.ts/contextBuilder.ts+sessionStoreLRU),是 working-memory 级,没有跨会话长期事实层。P2 拟新增src/aml/memory/memoryProvider.ts定义MemoryProvider接口(recordFact/queryFacts/invalidateFact/snapshotAt),让 Mem0/Letta/Zep 都作为可替换 adapter——snapshotAt(t)是 AML 特有方法(场景 A1 审计回放),也正是用来甄别哪家架构真支持 bitemporal 的试金石(Mem0 覆写式天然实现不了)。 - ATAM 评审产物入仓。 本日效用树 + 三方案对比 + 风险点表写为
docs/aipa/adr/ADR-memory-selection.md(ADR 格式),作为长期记忆选型的决策记录;倾向 Zep 类时间图,但标注"待 P3 金标实测终审",不预先锁死。 - 金标终审计划。 P3 接入真实 LLM 后,用 AML 66 案金标构造长期记忆衰减测试:模拟客户风险等级随时间变更,断言
queryFacts("当前风险等级")在 N 轮更新后仍正确(对应场景 T1/R1),并断言snapshotAt(过去某时刻)能回放当时风险(A1)。这是 C 节"自己金标实测为终审"的执行,复用 Day 17judgeCalibration的金标抽样模式。 - 诚实标注。
memoryProvider.ts头注明确:三方案对比的 benchmark 数字均为外部来源(自报/第三方,带日期),本项目尚未独立复现;选型倾向基于架构契合度(ATAM)而非排名;最终选定以 P3 金标实测为准。
参考资料
- Mem0 — Mem0: Building Production-Ready AI Agents with Scalable Long-Term Memory(arXiv 2504.19413, 2025-04):向量+LLM 自编辑事实;LOCOMO 上 p95 延迟低 91%、token 省 >90%、LLM-judge 相对提升 26%;图变体 Mem0g 高约 2%
- agentmarketcap — Agent Memory at Scale 2026: Letta, Zep, Mem0, LangMem Compared(2026-04-10):Letta 两层 OS 分页;Zep Graphiti bitemporal 知识图;Mem0 向量+图+KV 多存储;Zep 自报 94.8、MemGPT 93.4;全上下文基线 p95 17.12s,专用记忆 p95 1.44s;Zep ~200ms 检索;明确「Mem0 数来自自家论文,独立复现值得等」
- mem0.ai / fountaincity — State of AI Agent Memory 2026 / Agent Memory & Knowledge Systems Compared(2026):第三方 LongMemEval Zep 63.8 / Mem0 49.0(GPT-4o);Mem0 50K 会话 30 天后 49.0% 有效准确率,32.4 点衰减来自 stale data + 实体矛盾
- Letta / lmatlas — Memory Blocks / MemGPT-Letta Virtual Context Management(2026):main context(RAM)+ archival/recall(磁盘);LLM 自调函数 page-in/out;memory blocks(human/persona);可改写自身 system prompt
- CMU SEI / Kazman et al. — The Architecture Tradeoff Analysis Method (ATAM):效用树、场景、质量属性、风险/非风险/敏感点/权衡点(经典方法,本日配 2026 记忆案例应用)
- 本仓物证:
src/agent/memory/types.ts(会话级三层) +summarizer.ts/contextBuilder.ts+src/agent/__tests__/memory/(2026-06)
SOTA 检查 (2026-08-14)
注:本笔记日历日为 2026-08-14;事实核查与一手原文检索在 2026-06-11 完成,执行当周需按下方待跟踪项重新确认版本与新榜。
- 三方案格局在 2026 年中稳固但仍在分化:Mem0(自编辑事实)、Letta(OS 分页)、Zep(时间图)是三条不同技术路线,2026-04~06 的多份对比(agentmarketcap / mem0.ai / fountaincity / atlan)一致确认无单一赢家,排名随 benchmark(LOCOMO vs LongMemEval)翻转。
- benchmark 可信度危机是本日核心 live 问题:厂商自报(94.4/94.8)与第三方生产实测(49.0/63.8)差距高达 45 个点,且广泛被独立来源指出"自报数依赖自家 judge + 短会话、独立复现值得等"。本笔记的 C 节方法论(裁判/数据时长/可复现/选哪张榜四问)仍是当前必要的防忽悠工具。
- bitemporal/时间维度成为差异化主线:Zep Graphiti 的时间知识图在"事实随时间变化"任务上的优势被反复印证,这与 AML 合规记忆(审计回放 + 风险等级随时间变)高度契合——架构契合论点未被替代。
- 过时认知警示:(1) 不可把任一家自报 benchmark 当选型依据;(2) 不可把第三方"30天后49%"误读为"准确率49%"——它是衰减度量;(3) MemGPT 已演进为 Letta,引用须用 Letta 当前形态而非原始 MemGPT demo。
- 待跟踪(执行当周必做):重新 WebSearch 当周 "LongMemEval 第三方复现 2026" 看是否有更权威的独立基准发布;确认 Mem0/Letta/Zep 各自最新版本号与是否有新自报数;P3 金标实测后回填本笔记 C 节"自己金标实测为终审"列的真实数字,以本项目数据覆盖外部数字。