LLM 记忆系统也会“甩锅”:MemTrace 把错误追到具体操作
你有没有碰到过这种智能体:昨天明明记住了你的偏好,今天问它,它要么找不到,要么把旧信息当新信息,要么答得像真事一样但就是不对。
更烦的是,出错以后很难定位责任。是记忆抽取时漏了?更新时把旧事实覆盖了?检索时没捞出来?还是答案生成阶段拿到了证据却没用好?如果只有一串按时间排序的日志,这个问题基本会变成“人肉翻案卷”。
这篇 arXiv:2605.28732 的 MemTrace 论文,聊的正是这个痛点:给 LLM 记忆系统做错误追踪和责任归因。
核心摘要
MemTrace 盯住了一个很真实的问题:长期记忆系统的失败不是单步 Agent 那种“刚才工具调用错了”就能解释的,错误可能在几十轮之前的记忆更新里埋下,直到后面检索或回答时才爆出来。作者把记忆流水线转换成可执行的“操作-变量”演化图,再让诊断 Agent 沿着信息流逐步追踪,定位最早的关键错误操作。他们还构建了 MemTraceBench,覆盖 Long-Context、RAG、Mem0、EverMemOS 四类系统、160 个系统相关失败案例。实验里,MemTrace 在 GPT-4.1 mini 上把整体错误类型归因准确率从 MemTrace-OBS 的 20.00% 拉到 36.46%;闭环优化 Mem0 后,端任务 LLM-as-a-Judge 分数提升 7.62 个点。我的判断是:这不是又一个“记忆模块更强”的论文,而是把记忆系统从黑盒产品,往可调试基础设施推进了一步。
论文信息
- 论文标题:MemTrace: Tracing and Attributing Errors in Large Language Model Memory Systems
- arXiv:2605.28732
- 链接:https://arxiv.org/abs/2605.28732
- 提交时间:2026 年 5 月 27 日
- 作者:Xinle Deng、Ruobin Zhong、Hujin Peng、Xiaoben Lu、Yanzhe Wu、Guang Li、Buqiang Xu、Yunzhi Yao、Jizhan Fang、Haoliang Cao、Junjie Guo、Yuan Yuan、Ziqing Ma、Yuanqiang Yu、Rui Hu、Baohua Dong、Hangcheng Zhu、Ningyu Zhang
- 机构:Zhejiang University,Alibaba Group
- 代码:论文摘要页给出的项目地址为 https://github.com/zjunlp/MemTrace
为什么记忆系统的错误特别难查
普通 Agent 出错,通常还能沿着当前任务轨迹回放:哪个工具调用失败、哪一步推理跑偏、哪段检索证据不对,多少有迹可循。
记忆系统麻烦很多。
因为它是有状态的。用户的一句话可能先被抽取成记忆,再被更新、合并、覆盖、删除,过了很多轮以后才被检索出来参与回答。错误不一定发生在失败答案附近,可能早就发生在记忆构建阶段。你看到的是“今天答错了”,真正的原因可能是“上个月某次更新把时间戳改坏了”。
这就是作者说的 traceability gap:失败可见,但错误在哪个操作引入、怎么传播、什么时候变成最终错误,都不可见。
说实话,这个问题在工程里很扎心。长期记忆系统最怕的不是偶发答错,而是“看上去记住了,其实把可回答字段弄丢了”。一旦产品开始依赖用户偏好、项目状态、历史承诺,调试成本会迅速变成上线瓶颈。
MemTrace 的核心想法:别看时间线,要看信息流
论文的关键动作,是把记忆系统运行过程变成一个有向无环的二部图:
这里的 \(\mathcal{V}\) 是变量节点,比如原始消息、抽取出的 memory unit、检索结果、最终 prompt;\(\mathcal{O}\) 是操作节点,比如 LLM 抽取、解析函数、检索、过滤、更新、答案生成;边 \(\mathcal{E}\) 记录信息怎么从变量流进操作,再从操作流出新变量。
这个表达很朴素,但很关键。
线性日志只能告诉你“发生过什么”。执行图能告诉你“某个错误答案依赖了哪些变量,这些变量又由哪些操作产生”。调试视角一下子从翻流水账,变成追溯数据血缘。

图1 展示了完整框架:先执行记忆系统并收集执行图,再对失败案例逐步追踪,定位图中真正可疑的操作。作者强调两个特征:memory-system agnostic,也就是不绑定某个具体记忆框架;以及 faster than human,也就是希望替代人工翻长日志。
作者还定义了一个挺严谨的目标:Decisive Error Set,直译就是“决定性错误集合”。可以把它理解成最早、最小、足以导致最终失败的错误操作集合。论文当前主要处理单个决定性错误操作的情况,也就是找到 \(o^*\)。
我的第一反应是:这个目标定义比“找一个看起来有问题的步骤”要硬很多。它要求上游是对的,下游如果理想执行,修掉这个操作就能救回失败。这更接近软件调试里的 root cause,而不是泛泛的解释。
MemTrace 怎么追图
MemTrace 把失败归因做成一个 Agentic graph exploration 问题。直觉上,它不是把几百万 token 的日志一口塞给模型,而是让模型像调试程序一样,一小块一小块看。
流程大概分三段。
起点选择。 不能从所有历史消息开始搜,那样分支太大。MemTrace 用“问题 + 标准答案”构造查询,对原始消息做 dense retrieval 和 sparse retrieval,再用 RRF 融合,选出最可能包含关键证据的源消息,同时把当前问题也加入待探索队列。
局部图探索。 每轮取时间更早的变量节点 \(v_t\),找到所有直接涉及它的操作:
然后把这些操作子图转成文本,让诊断 Agent 判断:这个操作是否正确?如果正确,就沿着信息流把下游变量加入队列;如果发现某个操作引入了错误,就停止并给出归因。
上下文管理。 执行图可能非常大,变量值也可能很长。MemTrace 支持 preview 模式、分页、正则搜索、局部变量查看,还会在超过安全阈值时摘要工作上下文。这个设计比较工程,不花哨,但很必要。

图2 是一个很清楚的例子:Agent 先看输入消息 \(v_1\),发现事实抽取 \(o_1\) 没问题,于是继续看解析操作 \(o_2\),再追到记忆更新决策 \(o_3\)。第三步发现 \(o_3\) 没有把事实加入 memory,于是把它定位为错误操作。这个例子也说明,MemTrace 的重点不是“哪个地方语义相关”,而是“关键事实沿着图流到哪里断了”。
论文还给了一个变体 MemTrace-OBS。它不严格沿图走,而是把每个操作子图压缩成 operation block,按时间拼成弱结构日志,再让模型用全局搜索找操作。它更省 token、更快,但小模型更容易跳到后面的检索或回答步骤,然后把问题误判成抽取错误。
这里我觉得作者的取舍很清楚:MemTrace 更像图上单步调试,稳但贵;MemTrace-OBS 更像在日志里 grep,快但容易被关键词带跑。
MemTraceBench:这篇论文真正费工夫的地方
没有诊断基准,方法再漂亮也没法评估。作者构建了 MemTraceBench,来源是三个长期记忆问答数据集:LoCoMo、LongMemEval、RealMem;系统覆盖四类代表性记忆方案:Long-Context、RAG、Mem0、EverMemOS。
这里的设计有个点我挺喜欢:它不是只存“问题、答案、系统答错了”。每个样本还包含完整执行图、错误类型、错误操作 ID、人类解释。也就是说,它评估的是“你能不能查案”,不是“你能不能猜到答案错了”。

图5 展示了数据构建过程:在记忆系统源码里插入 smartcomment tracing 代码,运行系统得到执行图和失败案例,再由标注者确认错误不是标注问题或 judge 问题,随后标出具体错误操作、原因和类型。
论文里最终收集了 1,514 个 distinct errors;经过过滤和人工标注,形成 160 个 system-related failure cases。错误类型覆盖 extraction、update、retrieval、response、deletion 等,其中五类是记忆系统特有或高度相关的失败。
顺着这里再聊一句背景。Mem0 这类系统强调从对话中抽取、更新、删除结构化记忆;EverMemOS 则进一步把长期记忆做成更复杂的自组织系统,有检索、重排、充分性判断和查询改写。LoCoMo、LongMemEval 这类 benchmark 之前更多回答“系统记得怎么样”。MemTraceBench 问的是更底层的问题:“它为什么没记住,或者为什么记住了还答错?”
这个问题更像基础设施问题。
实验结果:能定位类型,但精确找操作还很难
主实验看两个指标:
- ETA:error type accuracy,错误类型预测准确率。
- OIA:operation identification accuracy,错误操作 ID 命中率。
我把主表里最关键的数摘出来:
| Backbone | 方法 | Long-Context ETA/OIA | RAG ETA/OIA | Mem0 ETA/OIA | EverMemOS ETA/OIA | Overall ETA/OIA |
|---|---|---|---|---|---|---|
| GPT-4.1 mini | MemTrace-OBS | 9.17 / 3.33 | 25.83 / 17.50 | 33.33 / 16.67 | 11.67 / 0.00 | 20.00 / 9.38 |
| GPT-4.1 mini | MemTrace | 20.83 / 4.17 | 41.67 / 26.67 | 35.83 / 23.33 | 47.50 / 2.50 | 36.46 / 14.17 |
| GPT-5.4 | MemTrace-OBS | 7.50 / 7.50 | 87.50 / 87.50 | 60.00 / 55.00 | 60.00 / 35.00 | 53.75 / 46.25 |
| GPT-5.4 | MemTrace | 20.00 / 20.00 | 72.50 / 65.83 | 70.00 / 59.17 | 55.00 / 7.50 | 54.38 / 38.13 |
几个数字很有意思。
在 GPT-4.1 mini 上,图探索版 MemTrace 明显更强,整体 ETA 从 20.00% 到 36.46%。这说明小模型很需要结构约束。给它一个全局搜索工具,它可能会被关键词吸引,直接跳到检索或回答阶段;强迫它沿信息流走,反而更不容易乱归因。
但到了 GPT-5.4,情况没那么单向。MemTrace 的整体 ETA 略高,54.38% 对 53.75%;但 MemTrace-OBS 的整体 OIA 更高,46.25% 对 38.13%。这让我有点皱眉:图结构并不是在所有条件下都赢。更强的模型可能可以利用全局搜索快速定位候选操作,而严格的图探索反而会在复杂系统里绕远。
作者自己也承认,精确定位操作比判断错误类型难很多。整体最好的 OIA 也只有 46.25%。如果你想把它直接接进自动修复流水线,这个数还不能让人完全放心。
成本也不能忽略:
| Backbone | 方法 | Overall Tokens(千) | Overall Time(分钟) |
|---|---|---|---|
| GPT-4.1 mini | MemTrace-OBS | 859.17 | 2.41 |
| GPT-4.1 mini | MemTrace | 1816.88 | 4.82 |
| GPT-5.4 | MemTrace-OBS | 298.72 | 0.80 |
| GPT-5.4 | MemTrace | 1875.49 | 4.09 |
MemTrace-OBS 便宜很多。长上下文子集上,GPT-4.1 mini 的 OBS 只用 692.79K token、2.45 分钟;MemTrace 要 4471.10K token、7.06 分钟。我的判断是,实际工程里很可能会做混合策略:先用 OBS 粗定位,再用图探索做局部确认。
失败分布:记忆系统的问题不是“记不记得”,而是“哪里丢了答案字段”

图3a 把错误来源拆开:system-related error 占 69.57%,annotation error 占 29.13%,LLM-as-a-Judge error 占 1.30%。左侧堆叠条还展示了不同数据集贡献的案例数量。这个图也提醒我们,长期记忆评测本身就很难,标注答案也会出错。

图3b 更有信息量。RAG 基本没有 extraction error,因为它没有抽取模块;Long-Context 没有 retrieval error,因为它不检索;Mem0 的 extraction、update、retrieval 都会出问题;EverMemOS 抽取错误很少,但 retrieval 和 response 仍然不少。
论文的附录报告里有很多具体失败模式,读起来特别像真实事故复盘。
Mem0 常见问题包括:
- 抽取阶段保留了高层描述,却丢掉时间、地点、数字、确切短语、来源字段。
- 更新阶段把两个相似但不同的事件合并,或者重写时改坏时间戳。
- 检索阶段捞到语义相近的背景记忆,却漏掉真正回答问题的那条。
- 回答阶段即使拿到证据,也可能少数、错算、或者把旧状态当当前状态。
EverMemOS 的问题又不太一样。它常常不是完全没有记忆,而是检索控制、充分性判断、最终回答之间没有对齐:相关事实可能在候选池里,但重排没推到前面;证据还不够,sufficiency checker 却提前放行;回答模型拿着不完整上下文,生成一个听起来合理但状态错误的答案。
其实吧,这正是长期记忆系统最危险的地方:它不是空白回答,而是“有点像对的”。用户体验上,这比直接说不知道还糟。
闭环优化:把归因信号拿去改 prompt
这篇论文最有工程味的一段,是把 MemTrace 接进自动 prompt 优化。
作者的逻辑是:记忆系统大量依赖手写 prompt,比如事实抽取 prompt、更新决策 prompt、问答 prompt。传统 prompt optimizer 会碰到长轨迹问题:要么整个轨迹塞不进上下文,要么候选 prompt 重放成本太高,要么自然语言反馈沿着很长链条反传时信号被污染。
MemTrace 的解法是先定位错误操作。找到局部错误以后,prompt 优化就不必处理整条历史轨迹,只需要针对那个操作附近的 prompt 做反馈和改写。

图4a 是闭环:执行记忆系统,生成执行图;MemTrace 做 failure attribution;优化器根据局部归因结果改 memory configuration;再进入下一轮。

图4b 给出结果:在 LoCoMo 上,Mem0 的 LLM-as-a-Judge score 从约 59.08 提升到 66.70,增量是 7.62 个点。作者强调,这发生在 MemTrace 操作识别并不完美的情况下,说明粗粒度但有用的归因信号已经足够指导 prompt 调整。
这块我是真的觉得有价值。因为很多记忆系统的“优化”现在还停留在人工看 badcase、手写规则、调 prompt 的阶段。如果归因能稳定指出“抽取 prompt 经常丢 assistant-originated content”或“更新 prompt 会抹掉 provenance”,优化就有了具体靶点。
论文的局限,也挺明显
这篇工作很扎实,但不能把它读成“记忆系统调试已经解决了”。
一个限制是规模。MemTraceBench 最终 160 个系统相关失败案例,对诊断基准来说是一个很好的起点,但还不够覆盖真实产品里的长尾问题。尤其是任务记忆、多模态记忆、工具执行记忆,这些都还没被充分纳入。
另一个限制是 decisive error set 主要按单个错误操作处理。真实系统里,经常是多个小问题合起来导致失败:抽取阶段略微压缩,检索阶段没召回完整集合,回答阶段又过度推断。单点归因有助于调试,但可能低估组合错误。
还有成本。几百万 token 的诊断开销,在离线分析可以接受;在线实时诊断就比较重。说实话,我更看好它作为开发期和回归测试期工具,而不是每个用户请求后都跑一遍。
再有一个更微妙的问题:归因结果依赖 tracing 粒度。smartcomment 需要开发者插桩,哪些操作被记录、变量怎么命名、更新粒度怎么切,都会影响诊断边界。插得太粗,根因被包进大黑盒;插得太细,图太大、标注也更难。
对工程的启发
如果你在做长期记忆 Agent,这篇论文给我的启发不是“马上照抄 MemTrace”,而是三件事。
把记忆当状态系统调试,不要当 prompt 附件调试。 记忆抽取、更新、检索、回答是流水线,不是一个 prompt。只看最终回答,很难知道哪里坏了。
保留数据血缘。 哪条用户消息生成了哪条 memory,哪次 update 改了哪些字段,哪次 retrieval 命中了哪些候选,最终 prompt 引用了哪些证据,这些都应该可追溯。没有血缘,后面所有“自动优化”都会变成猜。
错误报告要聚合到操作级别。 单个 badcase 的解释只能帮你修一个例子;操作级别的模式,比如“更新时间戳漂移”“结构化列表抽取为空”“检索偏向语义泛化”,才能指导系统改造。
我自己的判断是,MemTrace 更像一块调试底板,而不是一个最终产品功能。它的价值在于让长期记忆系统可观察、可归因、可优化。今天大家都在追“记忆更强”,但工程上真正需要的是“记忆坏了能查”。
这就是这篇论文最值钱的地方。
参考链接
- 论文:https://arxiv.org/abs/2605.28732
- HTML:https://arxiv.org/html/2605.28732v1
- 代码:https://github.com/zjunlp/MemTrace
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我