用 AI 写代码的人,多半都遇到过这种小别扭:上周明明跟它说过项目用 Go、错误处理走自定义类型,这周新开一个会话,它还是把日志库写成了 logrus,错误处理一律 return err 裸着抛。你愣一下,提醒它一句"我们不是说过用 slog 吗",它立刻"道歉",姿态摆得很到位,下一段代码改对了。再过两天,又错回去。
一开始我以为是模型记忆不够聪明,再后来才发现:AI 的记忆从来不是智商问题,是工程问题。
它能不能记住你说过的话,下次能不能调出来,新决策做出来的时候听不听话,这些都不是模型脑子里的事,是模型外面那一整套工程系统的事。想通了这一点,"AI 怎么又不记得了"这件事的真相才浮上来:模型自己根本没记任何东西,只有它身边那个替它记笔记的"秘书"在替它做这一整套事。秘书做得到位,它就显得记性好;秘书做得糙,它就显得健忘。
再回头看那些问题,会发现它们不是同一种失灵,而是这套秘书系统里几个不同的环节,在以不同的方式出错。
一、先把反直觉的事挑明
模型本身是无状态的。
这件事大多数人都听说过。但听说过和真的想清楚是两回事。一旦真的当回事去想,你会发现"AI 加了记忆功能"这句话听起来像是模型变了,但实际上其实模型一点没变,变的是它外面那一圈东西。
那一圈东西其实并不复杂。模型外面挂了一个外部存储,再挂一段自动注入逻辑。你说话的时候,系统判断哪句值得记、写进去;下一次开新会话,系统从里面捞几条相关的,拼进 System Prompt。模型"看到"了这段被拼进来的文本,于是表现得像是记得你。把这段文本删掉,它立刻就不记得了。
换言之:模型是个有失忆症的同事,每次开会前你都得把昨天的纪要重新念给他听。所谓"AI 加了记忆功能",不是治好了他的失忆症,而是给他配了个秘书,每次开会前替他把相关的便签念一遍。
它的"认得你"不是脑子里的认得,是桌上那张便签条上的认得。撕掉便签,它立刻就不认得你了。
开头那些反复出现的问题,都能在这套秘书系统里找到对应的位置。一句话先变成一张便签,再从一堆便签里被挑出来念给模型听,每一步都可能出岔。
二、第一种失灵:它记住的,不是你让它记住的
秘书要做的第一件事,是从一段对话里挑出哪句话值得抄下来。
这件事比想象中难。你和 AI 一次完整的对话可能几十轮,绝大多数都是临时性的,改个变量名、问个参数含义、加个空行。这些当下有用,但没有任何跨会话的价值,下次你不会需要知道自己曾经改过一个变量名。真正值得跨会话留下来的,往往就那么一两句:某一轮你说"我们决定用 gRPC 而不是 REST",某一轮你说"错误消息一律用英文"。秘书要在几十句"没价值的"里面,把这一两句"有价值的"挑出来。
现在主流做法是让模型自己挑,给它一段提取指令,告诉它什么算有跨会话价值,什么算临时性,让它在对话结束后自己判断、自己写入。这套思路是合理的,但落到一段真实对话上,会发现它有几种系统性的偏差,秘书自己察觉不到。
它分不清你是在"决定"还是在"讨论"。你只是在比较 A 和 B 各自的取舍,最后选了 A。但秘书在听的时候,会把"B 适合某某场景"这种像知识陈述的句子也当成事实抄下来。下次便签翻出来一念,你会发现 AI 居然在推荐 B,它不是不记得你选了 A,是它的便签里同时记着 A 和 B,今天没翻到 A 那张而已。
它也分不清你是在表扬还是在吐槽。你嫌某个库难用,秘书读到的是"用户提到了某某库"。语气这种东西落到便签上几乎全没了,一条吐槽就这么被反向记成了一条偏好。
它更分不清"现在"和"以前"。你随口一句"这个项目用 Go",是哪个项目?哪个时期?这次决定还是事后回忆?秘书没有这种分辨力,只会把句子原封不动地存下来,等下次原封不动地念出去。你当时的语气、上下文、犹豫,全都不在便签条上。
所以你以为它记住的,和它真的记住的,常常不是同一件事。AI 后来"记错了"的那些瞬间,很多时候不是模型推理错了,是它前面那张便签从一开始就抄歪了。错的地方不在脑子里,在那张纸上。
三、第二种失灵:它记住了,但下次没拿出来
就算秘书这一轮抄得很准,下一轮他还得做另一件事:从一堆便签里挑出今天该念的那几张。这一关也容易出岔。
便签少的时候问题不大,全塞进上下文让模型自己看就行了。但几个月、几个项目下来,便签堆得太厚,全塞已经塞不下了,秘书必须仔细挑选。主流的挑法是语义检索,把你今天的问题和每张便签都映射成向量,按距离匹配。听起来很合理,离得近的就是相关的,远的就是不相关的。
但这里有一个挺隐蔽的坑:语义相似不等于任务相关。
你今天说"加个缓存",秘书翻遍便签,找出语义最像"缓存"的那几张。但这几张里,可能混着另一个项目的 Redis 配置、之前讨论过但没采用的方案、你曾经吐过槽的某个库。它们和今天这件事都"有点像",但都不是真正需要的那几张。
更糟的是,你话说得越短,挑得越离谱。新会话第一句"帮我写个 API",几乎和便签堆里所有便签都"有点像",因为"API"这词太宽泛了,这时候秘书基本上是在抓阄。反过来,你话说得越具体、上下文越多,秘书才挑得准。所以新会话刚开口的那几句,宁愿啰嗦一点,把项目背景、现在在做什么、卡在哪儿,先交代清楚。这不是为了让模型懂,模型当然懂,是为了让秘书能挑对便签。
你以为它记不得,其实它记得,只是这次没翻到那张。便签躺在桌上,但桌上的纸太多了,今天能不能挑对,和你这句话怎么提、上下文给得够不够,关系比想象中要大。
四、第三种失灵:新便签和旧便签打架
时间再拉长一点,你会撞上第三种失灵,而且它比前两种都更难受。
世界是会变的。上周你说前端用 React,这周项目讨论后决定迁移到 Vue,过几周某个模块由于历史原因又保留了 Angular。这三件事都是真实发生过的,三张便签都被秘书认认真真写下来、整整齐齐摆在桌上。下次你让 AI 写一个新组件,秘书翻便签,三张都"和前端有关",三张都被翻了出来。模型看到三张相互冲突的便签,多半会基于离自己语义最近的那一张写代码,而那张可能恰好是早该作废的那一条。
这件事的本质,是记忆系统天然是累积式的,不是覆盖式的。它擅长"再加一条",不擅长"作废一条"。
人类同事身上不存在这个问题,新决策做出来的那一刻,旧方案就会自然地从他脑子里沉下去,不需要谁去手动撕。但秘书不会。秘书桌上是只增不减的,今天加一张,明天加一张,旧的那张除非有人专门去撕,否则会一直躺在那里,和新的一起被翻出来念。
所以很多人会有那种"AI 怎么又冒出一段早就废弃的方案"的体验,不是它记错了,是它记得太多。AI 不像人类同事会随着新决定做出而自动忘掉旧的,它的便签只增不减。真正让 AI 看起来"忘性大"的,往往不是它忘了,而是它记得太多,记得连那些早就该被撕掉的也一起记着。
还有一种更慢的过时。不是被新决策推翻,是被时间一点点蚀掉的。项目用 Go 1.20 过一年变成了 1.22,上次讨论的连接池大小过几个月已经无人在意。这些便签没人主动去推翻,但它们的有效性是在悄悄衰减的。秘书察觉不到,除非你显式去告诉他。
这里有个反问绕不过去:现在不是已经有结构化记忆、KV 覆盖那一套了吗?同一个键写进去,旧值不就自动被替掉了。
这一层升级是真的,但它把问题挪了个地方,没把问题解决。判断"这条该不该覆盖、该挂在哪个键下"这件事,本身又是一次"抄"。上周写下的"前端用 React"和这周说的"这个新模块用 Vue",到底是覆盖同一个键、是另起一个新格子放进去、还是干脆共存?这个判断还是秘书在做,秘书还是会判断错。结构化只是把第三关的难题,倒回第一关重新来一遍。便签从手写纸条变成带字段的卡片,秘书还是那个秘书。长上下文也是同样的道理。模型上下文从几万 token 涨到几百万,看起来可以把所有便签一股脑塞进去、不用挑了。但塞得进去不等于看得清楚。上下文一长,注意力就被摊薄了,中间那些容易被冲淡,相互冲突的内容塞在一起反而更乱。所以真到了几百万 token 这个量级,反而更需要秘书在塞之前先挑一遍——只是这位秘书的工作,从以前的"从几十张里挑几张"变成了现在的"从几百万张里挑几千张"。台子大了,活儿没少。
讲到这里,三种失灵讲完了。回过头看,它们其实是同一句话的三个侧面:
AI 的记忆从来不是智商问题,是工程问题。
第一种失灵是"抄"这一步出了岔,第二种是"挑"这一步出了岔,第三种是"撕"这一步根本就没人做。每一种都不是模型推理错了,模型每一步推理都是它能力之内的最优解,错的是它身边那张纸、那只挑纸的手、那只本该撕掉旧纸但没去撕的手。
你不是在和一个时聪明时糊涂的智能体打交道。你是在和一个失忆者打交道,而它今天能看到什么、看不到什么,是被外面那套工程系统严格规定好的。它今天的表现,不是它今天聪不聪明决定的,是今天那叠纸怎么递到它手上决定的。
五、那要怎么用
讲到这里,你可能会觉得这个秘书一身毛病。但我自己的态度是:该开还是开。比起每次新会话都从头讲一遍项目结构、技术选型、代码规范,有秘书还是比没秘书强,哪怕这个秘书会犯错。冷启动的代价,多数时候比被一张错便签误导的代价要高。
只是用法跟默认姿势不太一样。
默认姿势是把它当成一个"会自动学会你"的智能体,你正常聊,它自己悟。这个姿势在前期还行,越用到后面越不灵。真正能扛住时间的姿势,是反过来的:把它当成一套需要你主动维护的工程系统,不指望它自己变好,而是指望你主动管理它桌上的那叠纸。
这件事一旦想通,落到日常用法上其实就那么几条。
第一是主动喂比被动提准。重要的事顺手让它记一下,不要全指望秘书自己从对话里淘出来。尤其是新项目的第一次对话,值得多花一点时间,把骨架、技术选型、约定一次性交代清楚,比后面零散地在几十次对话里反复提到划算得多。
第二是隔一段时间翻一翻便签。这是大多数人不做但回报很高的一件事。一张错便签会持续地、悄悄地影响 AI 的行为,等你意识到的时候,往往已经被它带偏好一阵子了。
第三是把"团队规则"和"个人记忆"分开放。判断标准就一个,这是团队共识还是你的个人默契。共识的东西放规则文件、进 Git,让所有人都看得到;记忆这一层只放属于你和这个 AI 之间的东西。
这几条听起来不复杂,但它们背后有一个共同的姿态转变:你不是在使用一个有记忆的 AI,你是在替一个没有记忆的 AI,管理它的记忆。 这两件事差得很远。前者你是甲方,等它服务你;后者你是它的协作者,是你和它一起在维护这套系统能不能跑下去。
至于这套姿态背后更细的工程选择,三个主流产品(ChatGPT、Cursor、Claude)在这件事上各自做了什么权衡、检索这一关里那些更隐蔽的细节、记忆和规则文件之间到底该怎么分工,我在书里展开聊了,这里就点到为止。
六、AI 没有记忆,对人意味着什么
讲完工程,再往上想一层。
模型还会继续变聪明,便签会越记越多,检索会越做越准,结构化做得越来越细,上下文窗口也会越撑越大。但只要"无状态推理"这个底层架构不变,秘书这套东西就还会一直在那里。
而这件事的另一面,常常被忽略,
AI 越擅长记,人越要擅长帮它忘。
三种失灵里,第三种最难治,因为它不是技术问题,是判断问题:哪一张便签该作废了?哪一条决策已经被新的覆盖了?哪一个偏好已经过时了?这些事情秘书做不出来,模型也做不出来,只有你自己知道。模型越能记,便签堆得越厚,"该被撕掉但没被撕掉"的那一部分就越多,它的失灵也就越隐蔽。
所以这一代 AI 协作里,真正在拉开差距的能力,可能不是把 prompt 写得花、把工具配得炫,而是这几件事,
知道哪些事值得让它记,哪些不值得;知道一段时间之后,哪些旧便签该被作废了;知道在它桌上那叠纸越堆越厚的时候,主动去翻一翻、撕一撕。
这是一种新的工作能力。它还没有一个准确的名字,也很难被速成。但它会越来越值钱,因为在 AI 越来越擅长"加"的时代里,主动决定它该减什么这件事,没有人能替代你做。
模型还会继续变聪明。但它聪明到什么程度,你都得替它做这件事。理解这一点,比指望它哪天突然变完美要靠谱得多。
我把这两年关于 AI 编程的一些理解整理成了一本开源书《AI 编程的第一性原理》,这篇文章里讲到的"秘书 + 便签"那一套秘书系统具体怎么设计、三个主流产品(ChatGPT、Cursor、Claude)在这件事上各自做了什么权衡、记忆和规则文件之间到底该怎么分工、检索这一关里那些更隐蔽的工程细节,这些都在第 8 章里完整展开了。
如果你也在用 AI 写代码,欢迎来读:https://github.com/caozhiyi/ai-programming-book
夜雨聆风