Skip to content

为什么我让 AI 管我的记忆 ​

每次会话开始,AI 都是失忆的。五月写下这篇的时候,我刚给 AI 搭好一套三层记忆系统——短期、长期、语义检索,纯当技术实验。四个月用下来,它成了我工作流里不起眼、却离不开的部分。用的 AI 越深,这个反差越明显:它几分钟能写完我一天的代码量,却记不住上周我们刚定的一个决定。这篇把设计思路和四个月的实战一起补全。

失忆是常态,不是 bug ​

大模型有上下文窗口限制,超长对话还会被摘要压缩——保住剧情,丢掉事实。一个排障会话拉到几千行之后,早期确认过的端口号、路径、运行用户名,会被后续的摘要一轮轮磨掉。摘要记得住「我们在修一个崩溃循环」,记不住「运行用户叫 www 而不是 www-data」——而后者才是下一步推理的开关。真实的任务又恰恰是跨会话的。

很典型的是这个博客自己的统计服务。从本地写完到线上跑通,横跨了好几个会话:服务器是 CentOS 还是 Ubuntu?nginx 前面挂着宝塔?运行用户叫 www 还是 www-data?python3 在哪个路径?这些环境硬事实没有一行写进代码,git 里也查不到,但每次排障都由它们决定方向。

同一个坑还撞过两回。systemd 报 217/USER,服务进崩溃循环,journalctl 翻到底,原因只是配置文件里的运行用户写错了一个名字。第一次是环境不熟;第二次,修复的知识留在了早已结束的对话里,重传上服务器的配置文件又把错误的用户名原样带了回去。排障结论活得比会话短——这就是失忆的代价。

三层,各管一段 ​

  • 短期记忆:其实没有专门的存储,就是模型的上下文窗口——装得下一天的对话,装不下一个月的项目。会话没完先断了,靠自动摘要续命,但摘要天然失真:它记的是「发生了什么」,不是「配置是什么」。
  • 长期记忆:跨会话的持久层。一事一文:一个 markdown 文件只装一个事实,frontmatter 里写名字、一行描述和类型(用户偏好 / 协作反馈 / 项目状态 / 参考资料)。
  • 检索:每次会话开场只加载一份一屏看完的索引,正文按需取。

记忆库长这样:

memory/
├── MEMORY.md            ← 索引:每条记忆一行,开场只加载这个
├── user-linux-basics.md
├── friends-data-flow.md
└── ...

索引里每行长这样:

- [友链数据流](friends-data-flow.md) — friends.json 单一数据源 + 构建期 RSS 聚合

五月写下「语义检索」的时候,我以为那意味着向量数据库。四个月后真正在跑的,是一套土得多、也稳得多的东西。

真正起作用的,是三条笨纪律 ​

一、索引先行,description 当摘要写。 记忆库的入口不是全文检索,是每条记忆开头的那一行描述。写得像摘要,召回就准;写得像标题,召回就靠运气。这一下把「检索」从技术问题变成了写作问题——向量数据库反而成了次要的。

二、不记代码能自己说话的事。 代码结构、修过的 bug、历史提交——仓库自己就是记录,AI 随手能查。记忆留给查不到的东西:环境硬事实、被否定的方案和为什么、用户的偏好、进行中的决定。一个简单的检验:这句话三个月后大概率还成立吗?「服务器运行用户是 www」成立;首页某张卡片长什么样、某次构建出了哪些文件,都不成立。

三、敢删。 错的记忆比没记忆危险。一条过期的「某文件已就位」会让下个会话白排查半小时,而它躺在那里看起来很有道理。删除是维护记忆的日常动作,不是例外。

什么时候写 ​

三种时刻值得落笔:

被纠正的时候。 用户否定 AI 的那一刻,是冲突代价很高、教训很深的一刻。归档页改版时某个磨砂底板方案被否了,记下的不是「被否」这个结果,而是为什么被否、下次动手前先问什么——一条记忆要长出「为什么」和「下次怎么办」,才算成形。

踩完坑的时候。 本地预览重建后必须重启并杀干净端口,否则新资产一律 404——一句备忘,下次五秒钟对上号,不用重新 debug 半小时。

拍板的时候。 定了案没开工的方案、留在草稿箱的文章和原因。跨会话的进度条,不写下来就会凭空消失,或者过期之后还被当成新决定翻出来重议。

落笔之前顺手问一句:「下个会话的它,至少需要知道哪几件事才能无缝接手?」答案超过三件,说明该拆成几条记忆;一件都想不出来,说明这事根本不值得记。

快照会过期 ​

有一条记忆曾经写着「统计服务这轮改动尚未提交 git」——写下那一刻它是真的。两天后改动提交了,这条记忆就成了陷阱:哪个会话若照着它办事,要么重复提交,要么误以为代码丢了。

记忆不是数据库,是写入那一刻的快照。它只能保证「写入那一刻为真」,无法保证「现在仍为真」。所以规矩是:**召回进来的记忆只是背景线索,不是指令——引用之前,先对照仓库和现实验证一遍。**过期的还要删:维护记忆库和整理房间是一回事,过时的东西不清理,房子迟早没法住。

至于向量检索,还在愿望清单上。目前记忆量还小,一行写好的描述就是它的穷替身。等哪天索引一屏装不下了,再谈升级。

很容易忽略的一层:是它在记 ​

这个记忆库容易让人误会成「我写给 AI 看的日记」。其实方向是反的——落笔的是 AI 自己。它在被纠正、踩坑、拍板的时刻决定写什么,自己维护索引,自己删过期的条目;我只负责在它记错的时候说一句「不对」,而这次纠正本身,又会变成一条新的记忆。

管记忆这件事,从头到尾都外包了出去。而我得到的是一个每次都接着上一次继续干的合作者,而不是一个每次都要重新自我介绍的聪明人。

记忆管的不只是效率。一个每次都从零开始的合作者,谈不上了解你;一个记得住你为什么否定过某个方案的合作者,才会在下次动手之前先问一句。

这谈不上完善——记忆管理本身就是个开放问题。但比「每次都从零开始」好太多了。

更新于: