ChatGPT 转头就忘你说过的话,AI 的记忆到底是怎么拼出来的

cover

哈喽,我是飞飞。

事情是这样的。前两天我跟人聊天,对方吐槽说 ChatGPT 一开新对话就把他之前讲的全忘了,问他名字、问他偏好,跟第一次见面一样。他下了个结论:这玩意儿根本没记性。我当时没急着接话,因为这个「没记性」的感受太普遍了,普遍到大家都默认 AI 就该这样。可它到底为什么会忘,忘的是哪一段,又凭什么有些 AI 又好像记得住你,这事我反倒越想越好奇。

正好我自己每天用 Claude Code 干活,亲手给它搭过记忆,亲眼看着它的「记忆」被一段段挤掉又重新拼回来。掰开看完之后我发现,AI 的「记得」根本就不是单一的一样东西,而是三层完全不一样的机制硬拼出来的。这三个词你大概都听过:Context Window、RAG、Memory。今天我把它们一层层拆给你看,顺便把每个黑话翻译成人话。

它压根没有天生的记忆,只有一张当场摊开的桌子

先认一个反直觉的事实:大语言模型本身是不会记东西的。它不像人,聊完一段话脑子里留个印象。它每次生成回答,靠的只是这一次你喂进去的那一坨文字。喂进去的这坨文字有个上限,这个上限就叫 Context Window。

Context Window,说人话就是模型当场能摊开看的那张桌子。你这次对话的所有内容,连同系统给它的指令、你的提问、它要写的回答,全得摆在这张桌子上。桌子有多大是固定的,按 token 算,你可以粗略理解成「字数额度」。Claude 现在大概是 200K token 这个量级,Gemini 能上到 200 万 token,听着很大,但它是有底的。有一篇讲 RAG 里上下文窗口的文章把它说得很准:这是模型的短期记忆,是它全部的「思维工作台」,而且输入和输出都得从这同一份额度里扣。

关键就在这个「扣」字。我每天用 Claude Code 写东西,最有体感的就是这件事。一个长任务聊到后半程,工具会提示我:上下文太长了,要做压缩。它会把前面那一大段对话总结成一小段摘要,再塞进新的窗口接着干。那一刻我心里咯噔一下。它哪是记得我们聊过什么,它是把聊过的东西压缩成了一段笔记,原话早就从桌上被收走了。桌子就那么大,新东西要进来,旧东西就得被摘要、被挤掉。

所以你那位朋友抱怨的「ChatGPT 转头就忘」,本质上跟笨不笨没关系。新开一个对话就等于换了张干净的桌子,上一桌的东西根本没往这桌端。它谈不上忘,那些话压根从来就没在它眼前出现过。

RAG:给它配个仓库,要用的时候现取

桌子大小有上限,那资料多了怎么办?你总不能把整个公司知识库、几百份文档全堆桌上,堆得下也烧钱。于是有了 RAG。

RAG 这三个字母拆开是「检索增强生成」,说人话就是:先把资料存进一个仓库,等你提问的时候,现去仓库里捞几段最相关的,捞回来摆到桌上,再让模型照着回答。它的流程其实挺朴素:把文档切成一小块一小块,每块转成一串数字存起来,你一提问,系统就拿你的问题去比对,挑出意思最接近的几块,塞进 Context Window。

这里出现了第二个黑话:向量数据库(Vector Database)。说人话就是一个「按意思远近来摆放」的仓库。它把每段文字转成一串固定长度的数字坐标,意思相近的文字,坐标就挨得近。查的时候它不抠关键词,而是算谁离你的问题最近,技术上叫近似最近邻搜索,配上 HNSW 这类索引,几百万条里捞也能压到几十毫秒。一句话,RAG 让模型能查的资料远远超过桌子能摆下的量。

但 RAG 有个被很多人忽略的软肋。它挑「最相关」的那几块,靠的是算坐标距离、算相似度。做记忆系统的 Letta 直接点破过:这种按相似度排序的方式「在找真正相关的片段这件事上出了名地不靠谱」,你以为取回了 top 10,结果可能十条里大半只是「看起来沾边」。所以 RAG 答出来的东西经常对又不对,像是查了资料但没查到点子上。

更要命的是,很多人拿 RAG 当记忆用。Reddit 的 LangChain、LocalLLaMA 版里有句话被反复转:「用 RAG 来做记忆,正是 agent 老是忘掉重要上下文的原因。」这句话戳中了一个常见误区。RAG 擅长的是从一大堆杂乱资料里捞知识,要它记住你这个人,它真扛不住。

Memory:记住的不是知识,是你

这就引出第三层,也是最容易跟 RAG 混的一层:Memory。

差别在哪?mem0 那帮做记忆的总结得最干脆:RAG 管的是通用知识,Memory 管的是跟你这个用户绑定的、跨时间的连续性。RAG 是去仓库查一份谁都能查的资料,Memory 是攒下「关于你的事实」,你叫什么、你偏好什么、上次你让它别用某种语气。一个对所有人都一样,一个只对你成立。

有篇 arXiv 的论文把这个结构性差异讲得很到位:RAG 面对的是海量、五花八门、彼此不相关的资料堆,而 agent 记忆面对的是有边界、连贯、高度相关的对话流。这是两种活,硬用同一套向量检索去干,自然两头不讨好。

那 Memory 具体怎么落地?我自己天天在用的就是一个活例子。Claude Code 给我配了一套基于文件的持久记忆:一个 memory 文件夹,里面一个文件存一条事实,每条带一段 frontmatter 标明类型,再有一份 MEMORY.md 当索引,一行一条指过去。这套东西不在向量空间里飘着,就是实打实的几个 markdown 文件。我每开一个新会话,它先读这份索引,于是它「记得」我是谁、我这个博客是干嘛的、我之前纠正过它哪些毛病。

我的博客仓库里那份 CLAUDE.md,本质上也是同一种东西,一份喂给 agent 的长期记忆,把这个项目的规矩、命令、踩过的坑都写进去,越喂越厚。它不靠模型脑子记,它把记忆外挂成了文件。这跟那些拿向量数据库做记忆的方案路子不太一样,但核心是同一件事:模型自己不长记性,那就在它外面给它搭一套能反复读回来的东西。

行业里现在更高级的玩法,是把向量检索和知识图谱拼起来:向量负责按意思快速捞,图谱负责理清「谁和谁有关系」。连 Karpathy 都提过一种绕开传统 RAG、直接攒一个 LLM 知识库的思路。方向都指向同一处:光靠相似度捞不够,得有人替模型把「该记什么、该忘什么」管起来。

真正难的那一步:每次该往桌上摆哪几样

把三层拼到一起,你会发现 AI 的「记忆」是这么个分工:Context Window 是当下摊开的桌子,RAG 是查通用资料的仓库,Memory 是攒着关于你的那本小账。它表现出来的「记得」,是这三样在每次回答前临时拼出来的一桌东西。

Redis 那篇讲长期记忆架构的文章点出了真正的难处。存资料、建索引、做检索都不算最难,最难的是「上下文组装」,在所有可能塞进窗口的东西里,到底该挑哪些塞进去?桌子就那么大,仓库里有一万条、记忆里有五百条,这一次回答只能摆下几十条,挑错了就答偏,挑漏了就忘事。

我对这个难处的体感特别真。我那个 memory 文件夹里的条目越攒越多,可模型每次也不是全读,它得判断这一次该把哪几条端上桌。攒记忆是体力活,决定哪条记忆这一刻有用,才是真正的脑力活。所谓 AI 有没有记性,说到底拼的根本不在能存多少,而在它每一次能不能把对的那几条挑出来摆到你面前。

所以下次再有人说「ChatGPT 没记性」,你可以接一句:它的记性其实被拆成了三层,这三层有没有拼好、该端上桌的有没有端上来,全看背后那套机制搭得怎么样。记忆这事,人脑是天生的,AI 是硬攒的,攒得好不好,差距全在这。

你平时用 AI,最受不了它哪种「忘」?是新开对话就当没认识过你,还是聊着聊着把前面说好的设定丢了?评论区聊聊。