AI 记了五千条却答不出自己的事——瓶颈不在向量模型

AI 记了五千条却答不出自己的事——瓶颈不在向量模型

本文分享方法论与纠错过程,不含商业推广。

一个 Agent 有五千多条记忆,问它「你上周排查过什么问题」,它答错——或者干脆说「没有相关记忆」。

这不是 embedding 模型不行,也不是记忆库太小。我们把检索召回率从 2.5% 拉到 95%,换的不是模型,是排序权重。

1. 三个「记忆病」

做 Agent 记忆层的人会遇到三类症状相似、根因完全不同的问题。

硬编。 模型编出看起来合理的时间、数字、人名,但库里根本没有——这是幻觉,不是记忆问题。

经验流失。 同一条经验被反复写入(我们实测精确重复 563 条,约占库的十分之一)。写入无纪律,库会变成垃圾场。

检索到却排不进 top-k。 最隐蔽:记忆在库里,embedding 也有相似度,但最终排序把它冲到第 20 名开外,top-5 看不见它。这才是我们的主战场。

2. 先怀疑尺子,再怀疑模型

我们用的体检口径是 自召回 hit@5:用记忆原文去检索,看它能否排进前 5。自己的原文都找不到自己,检索系统一定有问题。

修复前,生产默认配置 hit@5 只有 2.5%。

修复后的成品体检口径:自召回 hit@5 94.7%(20 条探针 18 命中,有可核的体检 JSON 产物)。排序调优后的主指标 hit@5 在 2026-09-30 实测为 95.0%;2026-10-02 用同一脚本复算为 92.5%(40 样本 seed=23,基线 2.5% 已完整复现)——都在「9 成以上」量级。

第一反应往往是「换更强的 embedding」。我们也试了更大的模型(1024 维):改写问法 hit@5 大约只有 68.8%,延迟从约 10ms 级跳到约 200ms 级。

结论:embedding 不是瓶颈,排序才是。

3. 两次根因

排序权重失衡

得分 = 语义 × w1 + 新近度 × w2 + 重要性 × w3。

默认权重是 0.6 / 0.2 / 0.2,看起来语义占大头。但在真实语料里,记录之间语义差异往往只有 0.02~0.05,新近度/重要性的差异却可以大一个数量级。

粗算:0.6×0.03≈0.018,0.2×0.8=0.16——新近度的实际贡献远大于语义。

调成 0.94 / 0.03 / 0.03 后,hit@5 从 2.5% 提到 95% 量级(2026-09-30 实测 95.0%;2026-10-02 复算 92.5%,40 样本 seed=23,基线 2.5% 已完整复现),平均命中位次 20.5 → 2.0。

写入无去重

重试写入导致约 563 条精确重复;去重后库约 4.4 千条,重复归零;概念图孤立节点 20.6% → 3.9%。

记忆库不是越大越好——重复会制造检索噪声。

4. 假引擎事故

一度以为更大模型更差,因为遥测显示某个引擎,对比分数也「不好看」。

后来发现:加载失败会静默 fallback 到另一个引擎,响应里的引擎字段还回显请求值。

修好集成后,两引擎在改写问法集上 hit@5 打平(约 68.8%);延迟差约 15~20 倍(约 193221ms vs 1013ms)。

结论:默认仍用更轻的模型;先修集成,再谈换模型。

5. 诚实报空

词面和语义都很低时,应该说「没有相关记忆」,而不是硬编。

我们改为 双低才报空 后,标注集上的假阴性从 17 → 0,总错误 20 → 4。

边界仍存在,但方向是对的:报空是诚实,不是失败。

6. 可迁移清单

  1. 先测排序权重,再测 embedding;自召回 hit@5 是便宜的体检。
  2. 写入侧去重 + 分层记忆;教训不回滚。
  3. 遥测必须报真实引擎,不能回显请求值。
  4. 诚实报空要有验收指标。
  5. 换模型前先修集成 bug。

7. 收束

AI 不是不会记,是记完之后被自己的排序公式冲掉了。

约四千多条记忆,召回从 2.5% 到 95%,换的不是模型,是权重、去重和诚实。瓶颈不在向量维度,在你有没有检查过排序公式里每一项系数的实际贡献。


AI 记了五千条却答不出自己的事——瓶颈不在向量模型
https://genui.art/2026/10/02/2026-10-02-ai-memory-hit95/
作者
快乐
发布于
2026年10月2日
许可协议