← 博客

AI 长期记忆:向量相似,不等于记住了事实

2026年9月26日

English

现在做 AI 长期记忆,最常见的做法是:把对话切块、转成向量、存进向量库,下次按相似度取回来。《AI Agent 开发实战》第 8 章讲的就是这一套怎么搭。

它擅长回答“我们以前聊过什么相关的”。但用户真正考验记忆的时候,问的往往是另一类问题:“我那台车需要加油吗?”“我今年参加了几场婚礼?”“我导师在哪所大学任教?”这些问题要的是事实,不是相似的段落。

过去几个月,我一直在做一个基于 Tensor Logic 的个人记忆系统。这篇写其中一个让我改掉原设计的实验,以及它推出来的几条工程规则。

一个实验:位置对了,知识没跟过来

系统先从大量合成数据里学一套公共常识。我用大模型生成了 1,800 个小世界,一共约 127 万条关系,内容是什么东西属于哪一类,每一类通常有什么性质、用来做什么、依赖什么。

然后来了一个新东西 X。系统只知道一件事:“X 是一种 K”。

我问了两个问题:

  1. 正确类别会排在第一名吗?
  2. K 身上那些已经写明的事实,X 能继承吗?比如写明了“K 用来做饭”,那 X 也应该用来做饭。

结果:

问题向量打分写下来的规则
正确类别排在第一名16 次里 14 次—
继承 K 身上已写明的 24 条事实24 条里对 2 条24 条全对,每条附推理依据
另外 40 条系统里没有记录的事实40 条里猜对 1 条40 条都回答“没有依据”

在“向量打分”一列,“对”指正确候选排在第一名。这个排序器每次都会返回一个第一名,没有弃答状态;规则列执行的是明确继承。所以这不是两种承担同一任务的算法在比赛,而是一个更窄的工程问题:当前排序路径能不能代替继承?在这次审计里,不能。

第一行要看仔细。16 次里有 14 次,正确类别排在第一名,但这 16 次只是一次很小的检查。向量和类别本身并不靠近,平均余弦是 −0.18。第二行才是问题:就算类别排对了,也不等于拥有 K 的事实。向量给出的是一个排序,不是一张事实清单。被归到医院名下,不会因此变成医生。

一个很诱人的捷径,是直接把 X 的向量设成 K 的向量。它能让这个特定指标拿满分,但等于宣布“X 就是 K 本身”。一旦 X 同时属于两个类别,比如一台电动车既是“车”也是“电器”,这个办法就失效了。组合式或多向量设计可以避开这个具体捷径;它们仍需要单独验证,排序是否真正实现了所需的继承语义。

第三行同样重要。这 40 条事实是真实存在的,但我故意没写进系统。规则路径回答“没有依据”,这是对的,它确实不知道。向量路径每条都给了答案,40 条只猜对 1 条。一个会自信地回答自己不知道的事情的记忆系统,比一个会说“不知道”的系统麻烦得多。

规则长这样(示意):

X 是一种 K        ← 用户说过(附出处)
K 用来 做饭        ← 公共常识(已收录)
─────────────────
X 用来 做饭        ← 推出,附上面两条作为依据

没有魔法,就是把推理写下来。

分工:先查,再推,最后才猜

这个结果让我把记忆系统的回答分成三档,并且每个答案都要标明自己属于哪一档:

档位来源怎么回答
查到用户亲口说过的事原样返回,附出处
推出用户的事实 + 公共常识 + 写好的规则返回结论,附完整推理链
猜测以上都没有,是真正的空白可以给候选,但标成“模型推测”,不升级成事实

还有第四种合法的回答:没有依据。它不是失败,是系统在诚实地描述自己的边界。

向量没有被扔掉,只是换了岗位。找候选、做模糊回忆(“那个做芯片的朋友叫什么来着”)、给真正的空白排序,这些事它仍然有用。它只是不再充当事实的来源。

实验之后定下的四条规则

1. 先解决“这是谁”,再谈推理。记忆出错,最常见的原因不是推理错了,而是把两个东西当成了一个,或者把一个东西拆成了两个。所以名字绑定只认精确的名字和登记过的别名,模糊匹配只能给候选,不能直接绑定。“Paris”和“Paris Hilton”不能因为字面相近就合并;“巴黎”和“Paris”也只有在用户明确表示是同一个地方时才连起来。认不出来,就回答认不出来。

2. 数数交给代码。“我今年参加了几场婚礼”,不该让语言模型去数。每场婚礼记成一条带日期的事件,由代码来数。如果有几条事件缺日期、判断不了是不是今年,就回答“至少 N 场,另有几条日期不全”,而不是给一个看起来很确定的错数字。同一件事的状态更新,比如体重从 3 月到 5 月记了三次,要归成一个当前值,不能数成三件事。

3. 推出来的结论,不写回事实库。这条最容易被忽略。如果今天推出来的“X 用来做饭”被存成一条事实,明天它就会作为依据去推别的东西,后天甚至反过来支撑它自己。错误就这样变成了“常识”。推出来的结论每次现推,事实库里只放真正被说过、被核实过的东西。

4. 语言模型只在离线整理时用。从对话里抽取事实、整理实体,交给大模型在后台做;回答问题时不再调用模型。这样同一个问题每次得到同一个答案,也总能追溯到它从哪来。

规则就是方程,但方程目前还得人来写

搭这个框架,就是把继承写成一条方程。方程写清楚了,就不需要靠一大组权重去“学会”同一步。

在记忆这件事上,这几乎是字面的。“X 是 K,K 有性质 P,所以 X 有性质 P”就是一条方程。写一次,24 条事实全部正确继承,还能说出理由;靠向量去“学会”继承,只学到了 2 条。

接下来的问题是:方程谁来写?我试过让大模型一次写出事实、规则、适用条件和出处。第一版产出的 12 条规则,没有一条通过独立复核。后面几版有时能通过格式检查,语义复核仍然过不了。所以现在的做法是:规则少而精,由人写,经过复核;大模型只负责提出候选事实,先进待审队列,不能直接写进事实库。

这不是说模型永远写不了规则。只是说,在“写下来的东西会被当成真的”这个位置上,现在还省不掉人。

结论

AI 长期记忆的核心问题,不是“有多像”,而是“你怎么知道的”。相似度回答前一个问题,查、推、猜三档分工回答后一个问题。

快一年前我在 Tensor Logic:一种类脑架构 里写过,逻辑和学习可以运行在同一个基底上。现在回头看,更准确的说法是:它们可以共用一个基底,但要分清岗位。逻辑负责“知道”,学习负责“猜得好一点”。

另一次更早的合成语料里,还有一个“模型越大、迁移越差”的结果,放在下一篇:一次迁移实验:容量越大,拟合越好,迁移越差。