我的 AI 助手有个经验库,四个月攒了 6950 条。
其中 6499 条,从写进去那天起到现在,一次都没被读出来过。
93.5%。
这还是往好了说。后面会讲到,有 29% 的检索记录已经丢了,所以真实情况只会更难看。
更尴尬的是,查出这个数之前,我正准备给它加功能:每条经验被用一次就记一笔,用完被证明是错的就打个标记。论文里就是这么做的,我觉得自己只做了一半。数据出来以后,这个计划我整个撤了。原因是一个除法,在第 3 章。
想直接拿判据的看第 3、4 章;想看这套统计自己有几处靠不住,看第 6 章。
1. 这个库是怎么攒起来的
每天晚上,一个大模型把当天的对话读一遍,从里面抽两类东西:strategy,下次遇到同类情况该怎么做;lesson,从翻车里得出的「别这么干」。每条一两句话,再让模型给自己打一个 0 到 1 的置信度,意思是这条有多确定、多通用。抽完存进向量库,跟其他笔记混在一起。
思路来自 Google 的 ReasoningBank 那篇论文(arXiv 2509.25140)。论文的完整回路是三步:检索相关经验,用它指导这次任务,再按结果反过来更新经验库。我只做了最前面那半截:存。
存进去以后,一条经验只有一条路回到助手眼前:助手自己主动去搜,正好搜到它。
抽取的 prompt 其实写得挺克制,明说了「宁缺毋滥」「没有值得沉淀的就返回空数组,这是正常且鼓励的」。就这样,103 个晚上,每晚中位数还是抽出 55 条。模型很难忍住不写。
2. 怎么数「被读过」
向量库本身不记谁被查过。但助手每次搜索,返回结果都原样留在对话数据库里。所以办法很土:把所有搜索调用的返回结果翻出来,一条条解析,拿每条结果正文的前 120 个字去跟经验库对。
- 搜索调用 962 次,从 5 月底到 10 月 7 日
- 其中 277 次的结果已经没了。对话太长时,旧的工具输出会被压成一行摘要,原文丢掉
- 剩下 685 次能解析,一共带出 1044 条出自这个经验库的结果,1044 条全部唯一对上了具体条目
结果:
总条目 6950
被返回过 ≥1 次 451 (6.5%)
一次都没有 6499 (93.5%)
我第一反应是不服:新写进去的条目还没来得及被搜到,混在一起算不公平。那就按入库时间切开:
| 入库多久 | 条目数 | 被读过的比例 |
|---|---|---|
| 不到 30 天 | 1360 | 1.3% |
| 30–60 天 | 2257 | 1.9% |
| 60–90 天 | 1978 | 9.2% |
| 90 天以上 | 1355 | 15.3% |
确实不公平,但改不了结论。存了三个月以上的老条目,已经是最好的一档,85% 照样没人碰过。
3. 一个除法:读的速度追不上写
我当时想补的回路,是「被检索到就计数一次,被纠正就打标记」。可一个计数器要有用,前提是它有东西可数。
那就算算每个月这个库能被读出来多少:
新条目被读到的比例上限 ≤ 当月读出条数 ÷ 当月写入条数
9 月的账:
写入 1450 条
读出槽位 165 个(能解析的 123 次搜索里,出自这个库的结果一共 165 条)
上限 165 ÷ 1450 = 11.4%
实际去重后 73 条不同的条目
73 ÷ 1450 = 5.0%
11.4% 是假设每次读出来的都是不同的、而且都是当月新写的。实际上读出来的多半是老面孔,去重以后只剩 73 条。
这就是个除法,跟检索算法好不好没关系。就算我把回路做得完美,它一个月也只能给 73 条记上数,其余 95% 的计数器永远是 0。一个绝大多数值都是 0 的字段,拿来排序也好、拿来淘汰也好,都是在噪声里挑。
按月看,差距还在拉大:
| 月份 | 写入 | 读出槽位 | 读出的不同条目 |
|---|---|---|---|
| 7 月 | 1693 | 543 | 225 |
| 8 月 | 2378 | 258 | 159 |
| 9 月 | 1450 | 165 | 73 |
写的一直比读的多一个数量级,读那头还在往下掉。这库基本是个只进不出的仓库。
那多搜几次行不行?
最自然的反驳:问题出在搜得太少。这个也能算:
让当月每条新条目至少被读到一次,
需要的检索次数 ≥ 每月写入 ÷ 每次检索平均带出几条这个库的结果
9 月每次检索平均带出 1.34 条(165 ÷ 123):
1450 ÷ 1.34 ≈ 1082 次/月,约每天 36 次
实际:9 月 192 次,约每天 6 次
得多搜 5.6 倍。而且这是「每次带出的全是没见过的新条目」的理想情况。现实里前 1% 的条目吃掉了 47% 的命中(第 5 章),想靠多搜把冷门条目捞出来,次数还得再翻好几倍。
还有个细节:这个库占整个向量库 42.9% 的条目,在搜索返回里只占 26.3% 的位置。检索排序本来就更偏爱别的笔记。多搜,多出来的也是别的笔记。
所以瓶颈在写入那头。反馈回路我不做了,下一步改成先收紧抽取。
4. 两个看着有用、其实没信息量的数
置信度
每条经验写入时,模型都给自己打了分。分布长这样:0.8 那档 3113 条,0.9 那档 1605 条,满分 1.0 的 1596 条。模型对自己写的东西相当有信心。
那高分的更常被用上吗?「是否被读过」跟置信度的相关系数:
r = -0.002
分桶看更直观:
| 置信度 | 条目数 | 被读过的比例 |
|---|---|---|
| < 0.7 | 268 | 1.5% |
| 0.7–0.8 | 860 | 5.9% |
| 0.8–0.9 | 2664 | 7.7% |
| ≥ 0.9 | 3158 | 6.0% |
只看入库满 60 天的老条目,把新旧不公平去掉:≥0.9 那档 9.1%,反而比 0.8–0.9 那档的 14.9% 低,相关系数 -0.088。
说白了,这个字段是装饰。模型写下一条经验的那一刻,根本不知道它将来有没有用。
判据:一个打分字段有没有信息量,别看分布漂不漂亮。按分数分桶,看下游结果的比例有没有跟着单调变。没变,就是装饰。
「近重复很少」
我还查过一个怀疑:库里会不会塞满了换个说法的同一件事。拿向量余弦相似度 ≥ 0.9 当重复,只找到 29 条,去重后保留 99.8%。
当时我把这条写进了结论:重复不是问题。
然后去看命中最多的条目榜,前十名里有三条讲的是同一件事:某个开源 LLM 网关在路由前估算 token 数时用的是通用分词器,对中文严重估高。三种说法,存在三个不同分类下,分别被命中 18、15、13 次。0.9 这个门槛抓的是几乎逐字的重复,换个说法就漏了。
所以 29 这个数只能说明逐字重复很少。换句话说同一件事的有多少,我没量。
5. 被读到的那 6.5% 长什么样
集中度很夸张:
前 1% 的条目(69 条)占全部命中的 47.1%
被读过的 451 条里,244 条只被读过一次
被 ≥2 个不同对话捞到过的,只有 110 条
被读得最多的几条是这种:
- 「测试机要还原命题场景,别图方便」,18 次
- 「LLM 端点的真实上下文上限,必须用接近满窗的长 prompt 做大海捞针实测,health 接口返回 200 不算数」,17 次
- 「排查自建 LLM 端点的真实行为,直连端点做对照:不传参、显式各档位分别测」,17 次
共同点:跨项目,能直接拿来当检查步骤,一句话就能判对错。它们长得像检查清单里的一行,不像一段经历。
剩下那 93.5% 随手翻,大量是「某次某个参数怎么调好的」,只对那一次成立。
我的处理方式就从这儿来:真正被反复用到的那几十条,别留在向量库里等碰巧被搜到,直接升格成常驻的检查清单;其余的按时间归档。
6. 这套统计哪里靠不住
-
「被返回」不等于「被用上」。一条经验出现在搜索结果里,助手可能看都没细看。我数的是上限,真被采纳的只会更少
-
29% 的检索记录丢了。277 次搜索的结果被压缩掉,命中数是下界。可以算一个最坏情况:
命中率上界 = (已知被读过的条目 + 丢失的检索次数 × 每次平均带出几条) ÷ 总条目 = (451 + 277 × 1.52) ÷ 6950 ≈ 12.5%这假设丢掉的每一个结果都是一条从没被读过的新条目,现实不可能这么巧。就算按这个算,87% 以上仍然没人读过
-
对条目用的是前 120 个字的文本匹配。1044 条全部唯一匹配,没出现歧义,但两条经验开头 120 字完全一样的话会被算成一条
-
只有一个助手、一个人的使用习惯。我搜得少,别人的助手可能搜得多。第 3 章的式子换上你的数照样能算,但结论的数值别直接搬
-
「多搜」那段只是推算。我没真把检索频率拉到每天 36 次试一遍
-
重复率没量清楚。见第 4 章,0.9 的门槛只抓逐字重复
7. 看到「我的记忆系统攒了 N 条」时,该问什么
这类数字很常见:记忆库多少条、提取了多少条经验、知识图谱多少个节点。它们只能说明写入那头在干活。
问三句就够:
- 每个月读出来多少条不同的?跟每月写入比是多少?
- 读到的那些集中在多少条上?前 1% 占了多少?
- 系统自带的打分字段(置信度、重要性),分桶之后跟「被读到」有没有关系?
我自己的三个答案是:5%、47%、没关系。
8. 清单
给 AI 助手加任何自动写入的记忆层之前:
- 先数读那一头:现在每月有多少次检索,每次平均带出几条这一层的结果
- 用「每月写入 ÷ 每次带出条数」算出需要的检索次数,跟实际比。差一个数量级,先别加写入
- 别让模型给自己写的东西打置信度,除非你准备回头验它跟结果有没有关系
- 每月按入库时间分桶算一次被读比例,别拿一个总数糊过去
- 命中榜头部那几十条,升格成常驻清单
- 入库满 90 天、一次没被读过的,归档到冷库,能恢复,别直接删
- 去重别只信一个高相似度门槛,去命中榜头部看一眼,换个说法的重复一眼就看得到