AI 的长期记忆是把跨会话还会被反复用到的信息,从当次对话里挑出来存成能逐条查看和纠正的条目,需要时再检索回对话;短期记忆则是当次对话里的上下文,工程上就是上下文窗口,随对话滚动被新内容顶掉,这轮结束就不在了。差别不在能记多久,而在写入要不要经过筛选、出错时能不能只改错的那一条。
有长期记忆之后,你省掉的是每次开新对话都要重述一遍背景——你的偏好、你正在做的事、你上次纠正过的说法,不用再说第二遍。代价是记错的传播面变大:一条错的短期上下文只影响这一次对话,一条错的长期记忆会影响之后每一次,所以长期记忆的用处能不能成立,取决于它可不可查、可不可纠、可不可删。
这三件事要成立,一条记忆至少得能回答四个问题:它从哪来、什么时候写进去的、它是你确认过的事实还是系统的推断、它该在哪些场景被调用。第四个问题是这个领域普遍的空白:作用域在多数产品里(包括我们)还不参与召回判定,只是账本上的一栏展示。缺了来源那一项,纠错就无从下手——你只能整条删掉重来,没法指着其中一句说「这里我说的不是这个意思」。
按「存在哪里、怎么被调回来、什么时候失效」来分,比按「能记多久」来分更管用。分下来是三层,短期与长期各占一层,第三层不是每个系统都有。
第一层,会话内上下文。也就是通常说的短期记忆,工程上就是上下文窗口:这一轮说过的话原样留在窗口里,模型不用检索就直接看得到。它的失效方式是被挤出去——新内容进来,最早的内容被顶掉,或者这轮结束、窗口清空。丢了不是它记错了,是装不下。
第二层,沉淀成条目的长期记忆。从对话里挑出来、单独存成一条一条的记录,跨会话保留,不占窗口,要被检索到才回到这次对话里。它的失效方式不是被挤掉,而是被取代:出现一条更新的、与它冲突的记忆,旧的那条才作废。所以它出错的样子也不一样:短期记忆出问题你会觉得它「忘了」,长期记忆出问题你会觉得它「记岔了」——它一直照一条过时的说法回答你,而且答得很笃定。
第三层,归档。被取代的旧条目不再参与检索,但不删除,仍可回看。有这一层,你才查得出某条记忆是被什么换掉的、哪天换的;没有这一层,取代就等于覆盖,改动过程不留痕,你只能看到它现在说什么,看不到它以前说过什么。
一句话记:短期记忆丢了是窗口问题,长期记忆错了是治理问题——前者加容量能缓解,后者加多少容量都没用,只能靠每条记忆带得出来源和时间、并且能单独改掉那一条。想看临时信息在系统内部怎么被筛选和更新,另见工作记忆。
在 OneOneTalk 里,数字分身的长期记忆存在一份可以逐条打开的账本里:每条带来源、时间、置信度、作用域,来源写的是你在对话里说过或确认过它——记忆不是从外部自动采集来的,只有你在对话里确认过的内容才进账本。每一条都可以逐条纠正、冻结或遗忘。
更少被讲到的是冲突与失效这一半。新证据和旧记忆对不上时不静默覆盖:新的先进候选区,你确认之前旧记忆一个字不动;你确认之后,旧条的有效期关到当天、新条指回它,两条并存不删——旧的那条不再参与召回,但留档可回看,你能看到它被什么取代、哪天取代的。边界照实说:按时间自动到期这一层我们还没做,也没有让你自己设保留期或到期时间的入口,失效只发生在「被新记忆取代」这一种情况下。
机制的完整说明见会记住你的 AI 是怎么做到的与记忆账本;产品全貌见数字分身。
实现层通常分存储与检索两段:存储把非结构化的交互数据拆成可管理的结构化条目(向量数据库、知识图谱是常见形态),检索按当前上下文把相关条目取回来。这一层的公开资料已经很密集,此处不再复述(想看实现层可以从 RAG、向量数据库、记忆检索 三条进)——真正决定体验的是它前面那道分层:哪些信息该进长期存储,哪些不该。
可用的分界是两条同时成立:这条信息会在以后被重复用到,并且能指认它从哪来。会重复用到却指不出来源的,只能按推断存、不能当事实用;只在这一次任务里有意义的(这轮的临时数字、这次的措辞),留在会话摘要里过期即弃,不必进长期记忆。
不做这道分层,代价有两个,一是召回噪声:库里条目越多,把不相关的旧条目一并取回来的概率越高,表现是答非所问,或者本该按当前指令做的事被一条旧偏好带偏——所以「记得多」本身不是优点。二是旧事实过期:几年前的偏好如果没有失效机制,会一直被当成现在的你,而这类错误比「没记住」更难发现,因为它看上去像是记得很牢。
多数系统会对长期记忆做结构化处理而不是直接存原始数据:按交互场景分类、给关键信息打标签、定期压缩以减少冗余、用用户反馈调整筛选逻辑。这些工序做得好不好,用户从外面看不出来。
从外面看得出来的,是被普遍跳过的那一步——写入闸门。多数实现把「怎么检索得更准」当成主要工程问题,而把「这句话该不该被记住」交给一段默认打开的自动抽取;于是新证据和旧记忆冲突时,最省事的处理是静默覆盖旧条。静默覆盖伤人的地方不在于它可能改错,而在于你永远不知道自己哪一句被改写了:下次它照新版本回答,你只会觉得它记岔了,却找不到岔在哪一步。所以「什么该被记住、被谁改写过」这个决定,分量大于「怎么检索得更准」。
判断一套长期记忆做得好不好,可以按五个维度看。可验证性:每条能不能追溯到来源与时间。纠错能力:你能不能改单独一条,而不是只能一键清空。筛选效率:检索时会不会把无关的旧条目一并拖进来。适配性:记忆是按当前上下文被调用,还是生硬堆砌过往信息。取代与失效机制:新证据和旧记忆冲突时,系统是静默覆盖,还是先让你确认;被取代之后,旧的那条还能不能回看。前四条讲的是收益,第五条讲的是它出错时你还有没有办法。
这五条可以用一个动作粗筛:挑一条它关于你的记忆,让它说出这条的来源标注和写入日期。说不出来的,那就不是长期记忆,只是一段还没被冲掉的上下文——你既没法核对它对不对,也没法只改这一条。