← 文章

合成集选了 C,44 道真题选了 B

约 4 分钟#记忆#评测#实验方法#LLM

记忆该存成什么粒度,合成评测集给了一个很干净的答案。换成真实聊天出的题,答案变了,过程中还查出了三个测量上的问题。

目录

Autarkia 的长期记忆每晚跑一次:把当天的对话压成之后能检索的条目。这一版要重新决定的是「一条记忆该有多大」。候选有三种:A 是逐条消息各写一句摘要;B 是把对话切成段,每段写一条梗概;C 是原文本身保持可检索,再把每段拆成若干条原子事实。

01合成集上的答案

第一轮比较用的是我手写的合成集:10 个案例、90 条消息、20 道题、25 条标准事实,覆盖知识更新、时间推理、多会话、应拒答这些题型。结果很干净,端到端答对 A 13/20、B 17/20、C 19/20,换一个模型重跑,C 还是 19/20。我在记录里写下「候选形态 = C」,同时写了一句限制:合成集只有 20 道题,需要真实标注集复核。

真实标注集是从两条长期对话主线里出的 44 道题,题型和合成集一样,每道题都标了出处(会话和事件 ID),我自己逐题审过。这批题只放在本地,不进仓库。

02三个方案都是 15/44

第一次真实实跑,三个方案都是 15/44。最省事的读法是「粒度不重要」,然后去做别的。这个结果其实是无效的:提取用的是推理模型,思考 token 也算进 max_tokens,而我沿用了合成集的预算。C 方案 237 次调用里有 169 次正文为空,额度全烧在思考上了。三个方案都没拿到够用的额度,这一轮其实什么也没比出来。

回头查原型,又找到两处度量本身的问题,它们在合成集那一轮就已经在了:

  • nDCG 在一条相关结果都没检到的时候返回 1.0。检索最差的情况拿到了满分,合成集报告里的 nDCG 因此偏高。
  • C 方案解析失败的段被静默丢掉了,于是它的解析失败率永远是 0。

修完之后重新设了预算(A 1024、B 3072、C 4096),检索加了 BM25 与向量的混合排序,统计上每个比较都给 Wilson 区间和配对的精确 McNemar 检验。44 道题不多,不做检验的话,差两三道题很容易被读成结论。

03真题上的答案

结论换了。B 在 BM25 和混合检索下都是最好的:混合检索时 B 答对 27/44,A 14/44(p=0.002),C 20/44(p=0.039)。两组消融也指向同一个方向:只留原子事实是 15/44;把原文和梗概放进同一个池子里一起取 top-k,掉到 20/44,原文条目把梗概挤出去了。

为什么合成集会选 C,我只有解释,没有单独验证过:手写的案例里每个事实都被明确说过一次,原子事实和题目几乎一一对应,拆得越碎越好答。真实聊天里,一件事经常是散在好几轮里、带着前后语境、中途还被改口的;拆成原子事实会丢掉语境,原文又太多太碎,反而是一段一条梗概最接近题目要问的东西。

生产侧按 B 改:每段一条梗概,原文不再和梗概同池竞争,而是在梗概命中之后,按来源事件展开原文。混合检索放到后面一个阶段接入。

这次结论的边界也写清楚:44 道题,语料是抽样不是全量;答题统一由同一个模型完成;知识更新只答对 5/9,时间推理 3/8,这两类不管哪种粒度都还弱。

这次差点出事的是第一次真实实跑。三个 15/44 看着很像结论,当时要是信了,我会以为粒度无所谓,直接按合成集选的 C 上线。

作者Shihao Qi