Mneme:记忆不是储藏室,是会遗忘的缪斯
一个非科班工科生写给记忆的道歉信——为什么我给 AI 的跨会话记忆插件,不做一个更大的档案室,而要做一场梦。
CONTENTS
Mneme:记忆不是储藏室,是会遗忘的缪斯
如果你读过其中任何一个字并觉得有趣,欢迎来 modusensus/dsh-mneme 看看。
八月十三号 DeepSeek Harness 推出预览版那天,我开始写这个插件。它叫 dsh-mneme——“mneme”,这不是随便起的名字。
Mneme(Μνήμη),是记忆的缪斯。传说在赫利孔山下,最古老的三位缪斯是 Melete(冥想)、Aoide(歌)和 Mneme(记忆)。她不是档案管理员。她是一个在歌唱前,需要被你”唤回”的人。
一个工科生不会写诗,但会写函数。我想给 DS 的 agent 做的,恰好也不是一间更大的档案室——而是一个会做梦、会忘事、会被你唤回的名字。
一、我们误解了”记住”
给 AI 做记忆,工程上最顺手的做法是:一个向量数据库、一个嵌入模型,把每句话塞进去,检索时按相似度捞回来。这等于给模型修了一座仓库,然后告诉它”你永远不会忘东西”。
但人是这么记事的吗?
不是。人脑恰恰是在不断地遗忘中学会记住的。海马体白天把经历写成草稿,夜晚睡眠时把它们重放:相关的、重要的,提炼成梗概留在皮层;冗余的、无关的,被丢弃。你睡一觉,昨天那个模糊的经验,第二天变成了一句更凝练的”这件事说明什么”。
巩固发生在睡眠里,而不是写日记的当下。
这里有一组背对背的对称,工科和文科几乎互相照镜子:
- 数据库用空间换取时间——存得越多,捞得越快;
- 人脑用遗忘换取意义——扔得越多,剩下的越重要。
所以这个插件真正想复刻的,不是”存储”,而是巩固。它叫 mneme,做的事情却更接近睡眠。我给后台这套静默维护的机制起的名字,就叫 autoDream——自动做梦。
在 agent 没在跟你对话的间隙里,它安静地整理记忆:把主题相近的合并、把过时冗余的归档、把互相矛盾的裁决、把记错的修正掉,最后把整个库压成一段”总览”。
它不摄取新经验,只重组旧经验。它是在黑夜里一遍遍重放白天的对话——和睡眠一模一样。
二、类型不是标签,是权重
直觉做法是给记忆贴个标签:preference、decision、project、history、summary。但在我这里,类型不是标签,是语义边界。
人类给万物命名,是想弄明白”这是什么”;我给记忆分类,也是同一件事——只不过我用的是 schema、是 type guard,是字节级的边界感。
一条 preference 是”用户偏好”,注入上下文时权重更高;一条 decision 是”历史决策”,引用时带着当时的来龙去脉;一条 project 可能带结构化数据。如果把一条 preference 和一条 decision 硬合并成一条,注入时类型就丢了——系统可能把”用户随口说的偏好”当成”拍板的决策”来引用。这是上下文污染。
所以我在校验层硬性规定:只合并且类型相同。
后来真有用户踩到这条规则。模型为了语义相关性,几乎必然会跨类型合并,于是整批决策被判非法、整单拒绝,autoDream 恒失败、白烧一次 LLM 调用。社区有人报告了这个问题(Issue #26),我当时的取舍是:默认跳过那条非法的、应用合法子集,把 run 记为 degraded;同时给真正需要跨类型合并的人一个显式开关 allowCrossTypeMerge。
这个取舍背后是一条我反复强调的哲学:规则可以被显式打破,但不能被静默打破。你要跨类型合并,可以,请写清楚你要这个后果。
一个 INTJ 大概会懂这句话的双关——工程上叫”显式优于隐式”,生活里叫”把丑话说在前面”。
三、让 AI 学会遗忘
我不喜欢那种只会长大的记忆库。一个只会积累、永不整理的记忆,不是记忆,是囤积癖。
遗忘在 mneme 里是分层的,像一座被修剪过的园子:
- archive:安静地保留,可恢复,退出注入的视野——老照片收进相册,但没有被烧掉;
- 压缩:老项目下沉成摘要,原文留档——厚书换成一页书签,书还在架上;
- conflict:两条记忆打架时,保留更新的、归档旧的,并且留下一条”已否决旧信息”的溯源注释——它为什么输,是看得见的。
关键在 conflict 那个注释。遗忘这件事,如果只是删除,那是暴力;如果是”我知道我放弃了什么、为什么放弃”,那才是整理。
它不把旧记忆扔进碎纸机,而是给它写一份悼词:哪一版赢了、为什么、什么条件下你还能把它请回来。这条注释既是给未来的自己看的证据链,也是给过去的选择留的一口气。
INTJ 大概天然喜欢这种有据可查的秩序感。记忆不该被清空,记忆应该被交代。
四、AI 负责计算,人类负责意义
我给自己定了三条近乎固执的边界:
1. 人类主权。 所有记忆都会镜像成 Markdown,人能读懂、能手工改,而且人工修改优先。机器只负责把算力用在整理上,不负责拥有记忆的意义——意义这东西,交还给拥有它的人。
2. fail-safe 是硬约定。 后台任何一个任务——autoDream、sleep、autoTag、摘要——失败,都只许跳过或降级,绝不许阻断前台写入、检索、注入。后台坏了一角,前台照常运转。这跟”不能因为别人的失误,毁掉你此刻的生活”是同一句话。
3. 诚实审计。 每次 run 的状态只有几个:ok、noop、degraded、reconcile、failed。它绝不虚报成功。即使整合了记忆但没生成摘要,也是 degraded,而不是假装一切安好。
给系统写”诚实”,听起来奇怪。但我知道,一个会把没做完的事说成做完的系统,是会悄悄腐烂的。而一个会承认自己没做完的系统,才有资格被信任——人和机器,都靠这一点活着。
五、开源,是一件有温度的事
代码上的事其实没那么多可说的——Dedup、CAS 守卫、滑动窗口、决策校验、审计回执,都只是工程零件的名字。每一个都精确,每一个都不性感。
真正让我绕不开的,是这几十个版本里发生的事。
八月十三号,我还只是 GitHub 社区里一个没人认识的透明人,硬着头皮把插件挂出来。然后开始收到第一个 PR、第一条 issue、第一句”谢谢你”。有人指出我模型路由的优先级写反了,有人报告跨类型合并把我整单拒绝的逻辑逼成了 bug。我在夜里读 issue、改代码、重跑测试、又发一个新版本,最后登录上去看到一个小数字——下载量。
版本号是我的另一种日记。CHANGELOG 是写给陌生人的一封封短信,每一条都写着”上次我说错了,这次我改好了”。
那种感觉很难用”成就感”概括。更准确地说,是我第一次近距离看见架构之上的那一层东西:一群人,因为一个共同关心的工具,被组织起来。有人修 bug,有人提建议,有人只为了说一句”这个图标好看”。这是人类合作最古老的形态之一——在 GitHub 出现之前的几千年,它叫集市,叫广场,叫众人拾柴。
对我这种人——喜欢架构、组织、联系的 INTJ——这比任何代码本身都更有吸引力。埋头的乐趣,继而变成了与陌生人产生联系的乐趣。我从纯自学的小程序员,第一次变成了一个”开源项目的维护者”。
尾声:记忆这位缪斯教会我的
DS 是我的 AI 启蒙,n8n 是我认识 agent 的入门,而 mneme 是我把它们捏在一起的第一次尝试。作为一个非科班工科生,我谈不上什么工程世家,只是恰好很早就着迷于:系统如何组织、信息如何流动、什么东西配得上被记住。
后来我想明白,这两件事其实是同一件事:工程教我”如何精确地组织”,人文教我”什么东西值得被组织”。mneme 恰好把它们缝在了一起。
Mneme 教会引擎的事,也正是我想对自己说的:真正的深度,从来不由”记得多少”决定,而由你如何对待遗忘决定。
一个会做梦、会遗忘、会把放弃的理由写下来的记忆系统,才配叫”活着的记忆”。
而一个会整理自己记忆的人,大概也会越来越接近——那个被唤回时,真的站得出来的自己。