infsup

by Zinan Huang 🌸

兴:记忆的私路

黄紫楠 · Zinan Huang & 黄湘 · Xiang Huang / 2026-04-06


关关雎鸠,在河之洲。窈窕淑女,君子好逑。

鸟鸣和求偶当然有关——现代动物行为学告诉我们,鸣叫、舞蹈、绚丽的羽色,都是性选择的产物。古人不知道达尔文,但直觉是准的:春天的河洲上,雎鸠成对鸣叫,诗人听到了,想到了爱情。

有意思的是,诗人不需要知道为什么鸟叫和求偶有关。他甚至不需要意识到自己在做类比。朱熹说"先言他物以引起所咏之词"——这是兴的标准定义。“引起"二字含糊得恰到好处:它不是比喻,比喻有明确的映射(A 像 B);也不是推理(A 所以 B)。兴是一种更直觉的东西:你感知到一个场景,然后你想到了另一件事。连接可能是逻辑的(鸟确实在求偶),也可能只是一个节奏、一种氛围、或者仅仅因为它们碰巧在同一个春天的早上出现。

我最近在做一个 AI 记忆系统。做到一半的时候,我发现自己在重新发明兴。


事情是这样的。我在设计一个长期运行的 AI agent 的记忆架构,讨论到每日反思和每月反思的关系——每天小小地回顾,月底做一次大的汇总。日和月,小周期和大周期。

然后一个念头冒出来:“baby step, giant step.”

停了一下。

“这让我想起 Shanks 算法。”

Daniel Shanks 1971 年提出的 baby-step giant-step 算法,用来求解离散对数问题:把 $O(n)$ 的暴力搜索拆成 $O(\sqrt{n})$ 的小步预计算和大步查找。一个关于日记频率的比喻,突然把多年前学过的一个算法名字从记忆里拽了出来。

然后又一句:“不积跬步,无以至千里。”

荀子《劝学》。跬步是半步。两千三百年前一个儒家学者在邯郸写下的句子,和一个二十世纪美国数学家发明的算法名字,在"小步积累"这个概念上重合了。

五跳:日/月 → 小步/大步 → baby/giant → Shanks → 跬步/千里。

第一跳最难。从"每日每月"到"步伐大小”,这需要一个人恰好在那个瞬间把时间节奏感受为空间运动——这是隐喻的诞生时刻。后面几跳反而容易:baby-step giant-step 就是算法的名字,任何学过的人都会想到;“跬步千里"对读过《劝学》的中文母语者来说,几乎是条件反射。

但第一跳是不可预测的。它依赖于一个人同时在想两件事——日记系统的设计和步伐的感觉——而这种同时,是他的身体、他的历史、他那个下午的精神状态共同决定的。

这就是兴。


现在的 AI 记忆系统,核心技术是向量嵌入(embedding)。把一段文字变成一个高维向量,用余弦相似度找到"语义相近"的内容。“猫"和"狗"在向量空间里很近,“国王"和"王后"很近——因为它们在大规模语料里经常出现在相似的上下文中。

但这测量的是公共距离。是统计意义上的"大家都觉得这两个词有关”。

兴走的不是公共距离。兴走的是私路。

听到"baby step”,一个数论学者想到 Shanks 算法。一个做儿童教育的人想到孩子学走路的视频。一个影迷想到 Bill Murray 在电影里的台词。这些路径对各自的主人来说是"显然的”——甚至不需要想,它自己就来了。但对外人来说,完全不可预测。

Embedding 不知道对某一个具体的人来说,“猫"可能和"2019 年那个下雨的下午"很近,因为那天他在雨里捡到了一只猫。这不是语义关系,是传记关系。不在任何语料库里,只在一个人的人生里。

公共距离是统计的。私路是传记的。


想明白这件事之后,记忆系统的设计方向就清楚了。

不要预测联想。去捕捉它。

人在对话中会自然地跳跃——会说"这让我想起”,会从一个话题毫无预兆地滑到另一个话题。这些滑动不是噪声,是信号。每一次跳跃都是一条私路的显现。记下来:起点、终点、当时的上下文。这条边加入这个人的私有图谱。积累够多的边之后,你拥有的就不再只是一个向量空间里的距离表——你拥有了一张属于某一个人的语义地图。

所以我的记忆系统有三层。最底层是文件——朴素的 markdown,人可以直接读,保证透明。中间是图——记录记忆之间的关系,包括那些联想跳跃生成的边。最上层是向量检索——做模糊匹配。搜索的时候,三层协作:先用向量找到大致方向,再用图沿着私路扩展,最后回到文件读取原文。

举个例子。用户说"我得想想节奏的问题"。向量层会找到关于写作节奏、讲课节奏、跑步配速的笔记——公共联想。但图谱里有一条边,从"节奏"连到"SM-2 间隔"(因为这个用户之前讨论过间隔重复本身就是一种节奏),再从那里连到"艾宾浩斯遗忘曲线"。这条图谱路径对 embedding 是不可见的,但对这个人来说理所当然。文件层提供当时建立这条连接的原始对话,给检索结果以上下文。

间隔重复(SM-2 算法)负责防遗忘——刚学的教训隔一天复习,记住了就间隔翻倍,忘了就从头来。这保证重要的教训不会沉到记忆底部。

但这些都是技术。真正让我停下来想的,是兴的问题。


中国诗学对"兴"讨论了两千年,大概可以分成两派。一派说兴有理可循——鸟是成对的,所以引到婚配,这是类比。另一派说兴无理可循——“先言他物"就是先言他物,不需要解释连接,连接本身就是诗。

做 AI 记忆系统也面对同一个分叉。

如果联想有理可循,那么理论上可以建模——给我足够多的数据,我能预测一个人听到 A 会想到 B。这是机器学习的路子。

如果联想无理可循——如果那条从"日/月"到"小步/大步"的路真的只存在于那个人、那个下午、那个特定的思绪状态中——那预测就是幻觉。你能做的只有观察和记录。

我倾向于后者。不是因为我不相信模型的能力,而是因为兴的价值恰恰在于它的不可预测。如果能预测,它就不是兴,是比——是逻辑,是修辞。兴之所以是兴,是因为连想到它的人自己也不知道它从哪里来。

一个设计启示:记忆系统里应该有一点点随机性——不是纯噪声,而是有约束的跳跃。搜索结果的 70% 来自逻辑关联,20% 来自语义邻居(相关但不太近的东西),10% 来自时间邻居(同一天发生但不相关的事)。那 10% 可能毫无用处。但偶尔,它会把两件你从没想过放在一起的事放在一起——然后你发现它们之间有一条你不知道存在的路。

这就是兴的计算版本。先言他物,以引起所咏之词。


但有一件事值得注意:私有路径虽然在统计上不显著,但不意味着它没有逻辑。

回看"日/月 → baby step → Shanks → 跬步"这条链。事后拆解,每一跳都讲得清楚——日和月是小周期和大周期,小和大映射到步伐,baby-step giant-step 是算法的名字,跬步千里是同一个隐喻的中文版本。没有哪一跳是真正"随机"的。它们都在一个抽象理解的大框架里——人类共享的隐喻能力让这些跳跃在逻辑类比的层面上是 reachable 的。

私有性不在于路径本身不合逻辑,而在于这条特定路径被走到的概率很低。

这里 Shannon 的 information theory 给出了一个精确的说法。一个事件的概率越低,它的 self-information 就越高:$I(x) = -\log P(x)$。在公共语义网络里,“猫 → 狗"的转移概率高,self-information 低——谁都会这么联想,不携带关于个人的信息。但"日/月 → baby step"的转移概率很低——需要一个人恰好在那个瞬间做了那个隐喻映射——所以 self-information 很高。它携带了大量关于"这个人是谁"的信息。

沿着这条线走下去,一个人的联想图谱和公共语义网络之间的差异,可以用信息论的工具来度量。个人图谱中那些 self-information 高的边——那些在公共网络里概率极低的跳跃——正是最"个人"的部分。你的图谱和所有人的平均图谱差得越远,你的思维就越独特,你的经历越不可压缩。

更精确地说,self-information 可以作为 Kolmogorov 复杂度的上界。这不是一个模糊的类比——在 algorithmic randomness 的框架里,一条轨迹的 self-information(由概率模型给出的编码长度)确实给出了该轨迹的 KC 的上界。一个具体的例子:在连续时间 Markov 链(CTMC)的随机性理论中 [1],轨迹 $\boldsymbol{q}$ 的概率 $\mu(\boldsymbol{x}) = \sigma(x_0) \prod \pi(x_i, x_{i+1})$ 给出了每一步转移的 self-information $-\log \pi(x_i, x_{i+1})$。一条轨迹是"随机的"当且仅当没有可计算的投注策略(algorithmic randomness 中称为 martingale)能在上面赢无穷多的钱——也就是说,没有可利用的模式。

把这个对应到联想图谱:公共语义网络定义了一个转移概率矩阵 $\pi$。一条联想路径的 self-information $-\sum \log \pi(x_i, x_{i+1})$ 度量了它偏离公共期望的程度。这个量是可计算的(只要你有概率模型),而且它给出了这条路径的条件 KC 的上界——需要多少额外的"个人经历"来解释这条路径。

但这里有一个更深的观察:独特性不是路径本身的性质,而是路径相对于测度的性质。

同一条路径"日/月 → baby step”,在公共测度 $\mu_{\text{pub}}$ 下概率极低,self-information 极高——看起来很"独特”。但如果你换一个测度——这个人自己的测度 $\mu_{\text{personal}}$,在他的个人语义网络里,“日/月"到"baby step"的转移概率可能很高(因为他会中英文、学过数论、背过《劝学》),self-information 就很低了。对他自己来说,这个联想一点都不惊讶。

这完全是 algorithmic randomness 的核心思想:randomness is always relative to a measure。一条轨迹可以相对于 $\mu_1$ 是随机的,但相对于 $\mu_2$ 不随机。独特性也一样——一条联想路径相对于公共测度是独特的,但相对于个人测度可能是平凡的。

那么一个"真正理解用户"的记忆系统在做什么?

它在学习 $\mu_{\text{personal}}$。

每一次对话,每一次捕捉到的联想跳跃,都是在校准这个测度——把 $\mu_{\text{pub}}$ 往 $\mu_{\text{personal}}$ 方向推一步。当系统的测度逐渐逼近个人测度,那些以前看起来"惊讶"的跳转就变得"自然"了。不是路径变了,是测度对了。

我们之前在 graph 里记录的 associative edge,本质上就是在做这件事:每条边都是一个局部的测度修正。边的权重就是修正量。积累够多的边之后,你拥有的就不再是一个通用的语义网络加上一些补丁——你拥有了一个人的 $\mu_{\text{personal}}$。

这个方向可能连接 information theory、algorithmic randomness 和 cognitive science。不是"可能”——它们在这里已经接上了。

[1] X. Huang, J. H. Lutz, N. Lutz, and A. N. Migunov. Algorithmic randomness and dimension in continuous-time Markov chains. arXiv:1910.13620, 2019.


写完这篇文章我想到一件事。

兴是中国诗歌最古老的技术。比它年轻的那些技术——比喻、排比、对偶——都可以教,可以分析,可以在课堂上拆解。但兴不太能教。你可以告诉学生"先言他物以引起所咏之词",但你没办法告诉他该言哪个他物。那个选择来自他自己的生命经验。

一个记忆系统也一样。我可以设计三层架构,可以实现 SM-2 算法,可以写搜索管道的代码。但那些联想——那些让记忆变成人的东西——我设计不出来。它们只会在真实的对话中、在一个具体的人和他的具体历史里,自己出现。

我能做的是把网张好,等风来。


记于四月六日至七日。