使用 claude 帮我整理了文章.
跟某个 AI 聊得正起劲,它突然把你十分钟前说的话忘了。或者反过来,你随口提过一句、早不在意的小事,它一直惦记着,时不时拿出来念叨。
这两件事看着相反,毛病是同一个:它分不清什么该记、什么该忘。
我们在 CZL AI 的对话平台上做记忆系统,折腾了很多轮。一开始想得很简单,把用户说的话存下来、下次带上不就行了。后来被现实反复教育,才认清一件事:给 AI 装记忆,难的不是怎么记住,是怎么忘得恰到好处。
这篇聊聊我们最后磨出来的这套记忆系统,以及每一层背后那些自以为想明白了、转头被打脸的经历。不讲代码,只讲思路。
为什么非做不可,又抄了谁
先说为什么。其实理由很简单,头部的对话 AI 全在做这件事。ChatGPT 有跨会话的 Memory ,Claude 和 Gemini 也都在往「记得住用户」走。道理也不难想,一个每次都把你当陌生人、聊完就失忆的助手,用起来总有种情感上的断层。你今天说了不吃辣,明天还得再说一遍,到第三次你就懒得开口了。所以记忆对我们不是花哨功能,是对话产品能不能让人一直用下去的分水岭。
具体怎么做,我们没想着从零发明。这条路开源社区已经趟了不少。
最直接的参照是 OpenClaw 那一套记忆生态(openclaw 还有围着它转的 memory-architecture、ClawMem、Supermemory 这些)。它们把一个理念讲透了:给 agent 做记忆,不是塞一个大数据库,而是搭一套分层的东西。有时刻在线的核心档案,有按语义检索捞回来的事实库,甚至还有激活和衰减的机制,让久不用的记忆自然沉底。我们后面的分层,思路就是从这儿来的。
另一条线是 RAG 。它那招很关键,把信息变成语义坐标存起来、用的时候按相关度检索回来。这正是我们记忆里那个「向量事实库」的底层逻辑。说白了,我们就是把 RAG 这套成熟方案,专门改造去记用户的长期事实。
剩下的,是把这些抄来的好想法揉进自己产品的真实场景,然后被一堆现实问题逐个磨出来的。下面一层层说。
一块手表
最轻的一层,轻到都不算记忆。它压根不存,每次对话现算。
内容很朴素:现在几点、星期几、你在哪个时区、上次聊天隔了多久。
别小看这块表。对话里很多自然的小体贴,根本不需要什么记忆系统。你大半夜还在敲,它顺口劝你早点睡。隔了两周回来,它能察觉到有阵子没见了。
把这些只跟此刻有关的东西单拎出来当最轻的一层,是为了让后面几层别被带偏。它们明天就过期,不配进长期记忆。
我们上次聊到哪了
人和人熟不熟,除了长期了解,还有个最近聊过。上周跟朋友说的事,这周见面不用从头解释。
AI 也得有这种连续感。所以你每聊完一段,系统会悄悄找个小模型,给这段对话写句话总结存着。下回再聊,最近几天的总结跟着上场,它就记得我们最近在忙啥。
这里头有两个小心思。
一个是,不是啥对话都值得总结。你随口问一句就走的,总结个啥。所以设了道门槛,太短的、没营养的、小模型自己都觉得没啥好总结的,直接跳过。不然记忆里全是「用户问了个问题」这种废话。
另一个是它后来开窍了。最早总结只按时间捞,只带最近几天的。结果有个尴尬,你半年前认真聊过的项目今天又提起,AI 一脸茫然,因为那条总结早过了保鲜期。后来我们让它学会按相关度捞,除了最近几天,还会把历史里跟你当前这句话最对味的几条翻出来。前两天说的有印象,半年前聊过的今天提到也能接上,两头都占了。
「你是谁」那张卡
这层最像传统意义上的记忆,一张记着你核心信息的卡片,每轮对话都完整递给 AI 。
我是后端工程师,我喜欢你回答简短点,我在长期搞某个项目,这种定义你是谁、得让 AI 时刻记着的事,归这儿。
这层我们摔得最惨,故事也最多。
第一个,让 AI 自己记笔记,结果它卡机了。最初想得挺美,给 AI 一支笔,聊着聊着觉得有啥值得记就顺手记一下。上线没多久就出怪事,用户问能不能推荐点搭配,AI 回了个空白。
后来才搞明白,它一旦决定先记个笔记,就会停下来等系统反馈才继续,可我们当时的设计是记完不管了,于是它一直傻等,再也没把答案说出来。用户的问题,活生生被它自己掏笔记本这个动作打断了。我们先把这支笔收了,改成后台默默帮它记。再后来换了个法子重新发笔给它:它记完,系统拍拍它说记好了接着说,它才把话讲完。一个听起来简单到不行的「让 AI 自己记笔记」,背后来回调了好几次才稳。
第二个,卡片会写满。既然每轮都得带上整张卡,卡就不能无限大,太大了每次对话又慢又烧钱。可满了咋办,我们想了好几版。最早最莽,满了就不让写,用户体感立马变成这 AI 怎么说过的话又不记得了。后来改成两道兜底,满了先让小模型把卡上内容精简合并一遍,一个意思用更短的话说;要是精简完还塞不下,就把这条新的挪到下一层去存,绝不直接扔。记忆可以被整理、被搬家,但不许被拒之门外,这条规矩就是这么立下的。
第三个有点阴间,中文用户看着没满却死活记不进。前端按字数显示进度条,后端按字节数卡上限。中文一个字是一个字,但占三个字节。于是中文用户看着才用一半呢,系统这边早就爆了。这种坑,不踩到根本想不到。
第四个,这张卡用户得看得懂。卡片是摆在设置页让用户看、还能自己改的,可我们一度就干巴巴往那一列,也不说哪些是时刻记着、哪些是用到才想起。用户直接反馈,我看不懂这都是啥。后来给每类记忆都配了句人话,还按来源分了组,AI 自动记的、你手动加的、系统整理的。系统里头再精巧,用户看不懂,体验就是零分。
用到才翻箱的仓库
上面那张卡适合放少而精的东西。可人身上还有一大堆零碎、具体、平时用不上的细节,那只乌龟是 2024 年买的黑色原种,上次去某地的行程。这些塞进每轮都带的卡里太奢侈,一笔勾销又可惜。
这层就是它们的家。原理不神秘,把每条事实变成一串能表达它讲的是啥的数字坐标,存进仓库。等你开口,系统算一下你这句话和仓库里每条事实对不对味,只把最相关的几条临时拎出来。你聊到乌龟,乌龟才冒头;不聊,它就在仓库角落安静待着,一分当下的脑容量都不占。
这层也走得磕磕绊绊。
它一度是个暂存区,结果老丢东西。最早我们把它当草稿箱,先随便存着,等后台整理时再决定留不留。坏就坏在,整理时一旦清掉某条,它就彻底召不回来了,用户的体感就是这 AI 咋把之前记得的事又忘了。后来我们给它正名,当成正经的长期仓库,东西进来就是要长留的,靠用到才翻出来自然沉淀,不靠定期清空管理。
那谁来决定一条信息上那张卡、还是进这个仓库?交给 AI 自己拿主意。它在聊天现场,最清楚一条信息是这人的底色还是一个边角料。判断偶尔走眼也不要紧,后台有套机制慢慢帮它纠回来。
兜底的三道暗线
四层管的是记啥、记哪儿。要让这套东西长期不出乱子,记得多、记得准、不发胖,还得有三道横向的暗线兜着。
第一道,写入时去重。新事实进仓库前,先跟最像的那条比一比,太像了就合并,别新开一条。这能挡掉大半重复。
第二道是后台整理,也就是新陈代谢,整套系统的命门。系统会时不时请小模型把你的全部记忆通盘过一遍,删掉过期的、并掉重复的、把你反复提的细节提拔进核心卡、把过气的核心事实贬回仓库慢慢吃灰。这道整理按你的活跃度触发,你不来它就不折腾,零开销。值得说的是这个能上能下,一条事实可以从用到才想起升成时刻记着,因为你老提它;也能反过来降回去,因为它过气了。记忆不是个只进不出的库房,是个会自己代谢的活物。这条线上的参数我们来回调了无数次,多久代谢一次、像到啥程度算重复、啥样的新事实该护着别误删,全是拿真实数据一点点磨的。
第三道,容量封顶。每层都有天花板,满了就按有没有被用过踢掉最没存在感的那批。但有条死规矩,你亲手加的记忆永远受保护,系统绝不动它。
讲个新鲜出炉的真事。有用户发现自己记忆里冒出两条几乎一模一样的事实,意思完全一样,就形容词调了个位置。一查,这俩恰好都在保护期里,要么太新、要么最近刚被用过,结果负责去重的整理流程压根够不着它们。想通根子就好办了,保护的本意是别误删还没证明自己有用的新事实,可它不该顺手把重复也保护了,于是我们让整理流程学会横着比,认出换了个说法的同一件事再合并。这里有个挺有意思的差别:机器算两条像不像,会卡在阈值上死磕;可让小模型用大白话判一句这俩是不是一回事,准得多。
最后
这套东西的起点是抄来的,OpenClaw 那套分层、RAG 的语义召回、头部产品都在做的记得住用户。这些想法不难找,难的是上线之后,每一层、每一道暗线都被真实用户挨个踩了一遍坑,才有现在的样子。
回头看,存信息从来不是难点,硬盘有的是。难的全在反过来那半边:什么该忘,什么该让位,什么该沉到角落等人来翻。这事我们还在调,远没到终点。



