1. 从“聊完就忘”到“越用越懂你”:Hermes Memory 要解决的真问题
做过对话式 AI 应用的人,大概都经历过同一个尴尬时刻:用户昨天刚说过自己不吃香菜、对花生过敏,今天再问“帮我推荐个夜宵”,系统照样推了一份花生酱拌面。用户当场就炸了,你只能尴尬地解释“模型没有记忆”。这不是模型笨,而是绝大多数对话系统在设计之初就把“记忆”这件事排除在外了——每次请求都是一次性的,上下文窗口一关,一切归零。
Hermes Memory 这套东西,瞄准的就是这个痛点。它要做的不是简单的“把历史对话塞进上下文”,而是构建一套跨会话的长期记忆机制,并且在此基础上对用户做结构化建模(也就是标题里说的 USER 建模)。说白了,它想让 AI 记住的不只是“你说了什么”,而是“你是个什么样的人”——你的偏好、习惯、身份背景、长期目标,甚至你说话时那些没说出口的隐含需求。
但真正让这套设计有意思的,是标题里那六个字:“有界 + 冻结”双闸。这是两个约束机制,一个管“记忆不能无限膨胀”,一个管“记忆不能随便被改写”。我第一眼看到这个设计的时候就觉得,这才是真正踩过坑的人才会想出来的方案。因为做记忆系统,最怕的两件事就是:第一,记忆库越滚越大,检索越来越慢,成本越来越高;第二,记忆被错误地更新或覆盖,导致用户画像越描越歪,最后系统“记岔了”比“不记”还糟糕。
这篇文章我会把 Hermes Memory 这套设计拆开来讲清楚:它为什么需要跨会话记忆、USER 建模到底建的是什么、有界机制怎么控制记忆规模、冻结机制怎么保证记忆的稳定性,以及在实际落地时那些文档里不会写的坑。适合正在做对话系统、智能助手、个性化推荐,或者任何需要“让 AI 记住用户”的开发者参考。哪怕你只是对记忆机制好奇,看完也能明白一套靠谱的长期记忆系统到底该怎么搭。
2. 跨会话记忆到底难在哪:不是存不下,是管不住
2.1 上下文窗口不是记忆,别把它当仓库用
很多人对“记忆”的第一个误解,就是觉得把上下文窗口开大一点就行了。现在动辄几十万 token 的窗口,好像什么都能塞进去。但实际用起来你会发现,这条路根本走不通,原因有三个。
第一是成本。每次请求都把全部历史对话带上,token 消耗是线性增长的。一个用户用了三个月,历史记录几十万字,你每次对话都要重新付费处理一遍,这个账算下来非常吓人。第二是干扰。上下文里塞的东西越多,模型的注意力越容易被稀释,该记住的关键信息反而被淹没在大量无关对话里,回答质量不升反降。第三是跨会话。上下文窗口是单次会话内的,用户关掉页面再回来,就是一次全新的请求,窗口里的东西全没了。你没法靠窗口实现“上周聊过的事这周还记得”。
所以真正的跨会话记忆,必须把信息从上下文里抽出来,存到外部,在需要的时候再检索回来。这就引出了记忆系统的核心架构:写入、存储、检索、更新。Hermes Memory 的整套设计,本质上就是在回答这四个环节各自该怎么做,以及它们之间怎么配合。
2.2 记忆的三种类型:事实、偏好、关系
在动手设计之前,得先想清楚一件事:你到底要记什么?不是所有对话内容都值得记。如果把每句话都存下来,那跟不记没区别,检索的时候全是噪音。Hermes Memory 把值得长期保留的记忆分成了三类,这个分类我觉得非常实用。
事实型记忆,是那些客观的、相对稳定的信息。比如用户所在的城市、职业、家庭成员、过敏源、正在进行的项目。这类记忆的特点是“一旦确认,长期有效”,除非用户主动更正,否则不该变。
偏好型记忆,是用户的主观倾向。比如喜欢什么风格的回答、讨厌什么类型的推荐、习惯用什么样的表达方式。这类记忆比事实型更软,可能会随时间和场景变化,需要更谨慎地更新。
关系型记忆,是用户和系统之间、以及用户提到的各种实体之间的关系。比如“用户 A 的同事是 B”“用户提到的那个项目属于 C 部门”。这类记忆是构建用户画像的骨架,让系统能理解用户所处的语境。
把记忆分类的好处是,不同类型的记忆可以用不同的存储结构、不同的更新策略、不同的检索权重。事实型记忆可以强一致、低频率更新;偏好型记忆可以允许渐进式调整;关系型记忆则需要图结构来支撑。一锅乱炖地存,后面检索和更新都会失控。
2.3 为什么“记得多”反而会变笨
这里有个反直觉的点,值得单独说。很多人以为记忆系统越全越好,记得越多系统越聪明。实际恰恰相反,无节制的记忆会让系统变笨。
原因在于检索。当记忆库里有十万条记录,用户问一个问题,你怎么从里面挑出最相关的那几条?如果检索不准,把不相关的记忆喂给模型,模型就会基于错误的信息回答。更糟的是,如果记忆之间互相矛盾——比如用户三个月前说喜欢咖啡,上个月说戒了——系统同时检索到两条,模型就懵了,不知道该信哪个。
所以记忆系统的质量,不取决于存了多少,而取决于存得准不准、取得对不对、更新得及不及时。Hermes Memory 的“有界”和“冻结”两个机制,本质上都是在对抗“记忆膨胀带来的质量下降”。有界控制的是数量,冻结控制的是稳定性。这两个闸门一卡,记忆库才能保持在一个“精而不杂”的状态。
3. USER 建模:把零散对话沉淀成一张可用的用户画像
3.1 USER 模型不是标签堆砌,是分层结构
一提到用户建模,很多人第一反应就是打标签:年龄、性别、兴趣、消费能力。但对话场景下的 USER 建模,跟传统推荐系统那套标签体系完全不是一回事。传统标签是从行为数据里统计出来的,而对话里的用户信息是从自然语言里抽出来的,更零散、更隐晦、更需要推理。
Hermes Memory 的 USER 建模,我理解它是一个分层结构。最底层是原始记忆条目,就是一条条从对话里抽出来的事实和偏好,带时间戳和来源。中间层是聚合画像,把同一维度的多条记忆归并成一个结论,比如从“我不吃辣”“上次点的微辣”“提到过胃不好”聚合出“饮食偏清淡、肠胃敏感”。最上层是动态状态,反映用户当前正在关注什么、处于什么阶段,比如“最近在准备换工作”“这周在赶一个项目”。
这个分层很关键。因为不同层级的更新频率和稳定性要求完全不同。原始条目可以频繁写入,聚合画像要谨慎更新,动态状态则应该有时效性,过期就该淡化。如果全混在一起,要么画像僵化,要么状态乱跳。
3.2 从对话到画像:抽取、归并、消歧三步走
具体怎么把一段对话变成 USER 模型里的内容?我把它拆成三步,这也是实际落地时最花功夫的地方。
第一步是抽取。从用户说的话里识别出值得记的信息。这里不能简单用关键词匹配,因为用户很少直白地说“我的偏好是 X”。更多时候是隐含的:“这家店太吵了”隐含“偏好安静环境”,“又要加班”隐含“工作强度大”。抽取环节需要模型做一定的语义理解,判断这句话里有没有可沉淀的用户信息。
第二步是归并。新抽出来的信息,要跟已有的记忆做比对。如果已经有类似记录,是合并、是更新、还是新增?比如用户之前说“喜欢科幻”,这次说“最近在看刘慈欣”,这两条应该归并到“阅读偏好-科幻”这个维度下,而不是各存各的。归并做不好,画像就会碎片化,同一个维度散落十几条记录,检索时互相打架。
第三步是消歧。这是最容易被忽略但最要命的一步。用户的信息经常是矛盾的、有时效的。“我戒咖啡了”和三个月前的“每天两杯美式”,到底哪个算数?消歧的核心是时间权重和显式覆盖。新信息默认优先级更高,但如果用户明确说“我以前喜欢 X,现在改了”,那就是显式覆盖,旧记忆要标记为失效而不是删除。保留失效记忆的价值在于,它能帮系统理解用户的演变轨迹,避免“用户明明说过戒了还一直推咖啡”这种低级错误。
3.3 画像的“保鲜期”:哪些该记一辈子,哪些该忘掉
USER 模型里最微妙的问题,是什么该长期保留,什么该自然衰减。这个判断做错了,要么系统显得“记仇”,要么显得“没记性”。
我的经验是,按信息的稳定性来分。身份类信息——职业、家庭结构、长期健康状况——基本可以视为永久有效,除非用户主动更正。偏好类信息——口味、风格、兴趣——有较长的保鲜期,但应该允许渐进式调整。状态类信息——当前项目、近期情绪、临时需求——保鲜期很短,几天到几周就该淡化。
Hermes Memory 的冻结机制在这里就派上用场了。它可以把那些已经确认的、高置信度的记忆“冻结”起来,不让它们被后续的模糊信息轻易改写。比如用户明确说过“我对花生过敏”,这条记忆就该被冻结,哪怕后面某次对话里模型误判了,也不能覆盖它。反过来,那些低置信度的、推测出来的记忆,就不该冻结,应该允许被新证据修正。
这个设计思路我觉得特别值得借鉴:不是所有记忆都平等,高置信度的记忆需要保护,低置信度的记忆需要流动。一刀切地全部冻结,系统会僵化;全部放开,系统会漂移。分级管理才是正解。
4. 有界机制:给记忆库装一个“容量阀门”
4.1 记忆为什么会无限膨胀:写入没有刹车
任何记忆系统,如果不加约束,最终都会走向膨胀。原因很简单:写入是默认行为,删除是需要勇气的行为。开发者倾向于“先存着,说不定以后有用”,结果就是记忆库只增不减。
膨胀带来的问题是一连串的。存储成本上升只是最表面的,更深层的是检索质量下降。记忆库越大,向量检索的召回噪音越多,真正相关的记忆越难被精准命中。而且随着时间推移,大量过时的、低价值的记忆会稀释整个库的信噪比,让系统越来越“糊涂”。
Hermes Memory 的“有界”机制,就是给记忆库设一个明确的容量上限和淘汰规则。它不是简单地“存满就删最旧的”,而是有一套基于价值的淘汰逻辑。这个逻辑的核心问题是:当容量满了,该淘汰谁?
4.2 淘汰策略:按价值排序,而不是按时间
最朴素的淘汰策略是 FIFO,先进先出,存满就删最早的。但这个策略在记忆场景下很糟糕,因为记忆的价值和时间不成反比。用户三年前说的“我对青霉素过敏”,价值远高于昨天随口说的“今天天气不错”。按时间淘汰,会把最重要的长期记忆删掉,留下最没用的闲聊。
Hermes Memory 的淘汰逻辑,我理解是多维打分。每条记忆有一个综合价值分,由几个因素决定:置信度(这条记忆有多确定)、引用频率(被检索命中过多少次)、信息密度(承载了多少有效信息)、时效性(是否还在保鲜期内)、不可替代性(是否与其他记忆重复)。分数低的先淘汰,分数高的保留。
这个打分机制里,我觉得最巧妙的是引用频率这一项。一条记忆如果经常被检索到、被用到,说明它对系统当前的任务是有价值的,应该保留。反过来,存了很久从来没被命中过的记忆,大概率是冗余的。这有点像缓存系统的 LRU 思路,但结合了语义价值,比单纯的 LRU 更聪明。
4.3 分层存储:热记忆、温记忆、冷记忆
光有淘汰还不够,有界机制的另一半是分层存储。不是所有记忆都需要用同样的方式对待。Hermes Memory 把记忆分成三层,对应不同的存储介质和检索策略。
热记忆是最近活跃的、高频引用的记忆,放在最快的存储里,检索时优先命中。温记忆是中期记忆,有一定价值但不算高频,放在常规存储里,检索时作为补充。冷记忆是长期归档,很少被用到但可能某天需要,放在低成本存储里,只在特定条件下才检索。
这个分层的好处是,它让“有界”不只是删减,而是分级管理。冷记忆不占热存储的空间,热记忆保持精简高效。当冷记忆被重新引用时,可以“升温”回到温层甚至热层。这样既控制了活跃记忆的规模,又没有真正丢失历史信息。实际做的时候,分层阈值需要根据业务场景调,没有万能参数,但思路是通用的。
4.4 容量上限怎么定:从检索延迟倒推
容量上限设多少,这是个工程问题,不能拍脑袋。我的经验是从检索延迟倒推。假设你的检索要求是 P99 延迟不超过 200ms,那么根据你用的向量索引类型和硬件,能支撑的记忆条数是有上限的。超过这个数,延迟就会超标。
另一个约束是召回精度。记忆库越大,同样的 top-k 检索,召回的相关性越难保证。你可以做实验,逐步增加记忆条数,观察召回准确率的变化曲线。通常在某个点之后,准确率会明显下降,那个点就是你的容量参考上限。
Hermes Memory 的有界机制,本质上是在容量、延迟、精度三者之间找平衡。没有绝对的最优解,只有适合当前业务场景的平衡点。关键是这个平衡点要显式地设定、监控、调整,而不是放任记忆库自由生长。
5. 冻结机制:让该稳的记忆稳如磐石
5.1 记忆漂移:比遗忘更可怕的敌人
如果说有界机制防的是“记忆太多”,那冻结机制防的就是“记忆被改坏”。记忆漂移这个词,指的是系统里的用户画像随着时间推移,被一次次不准确的更新慢慢带偏,最后跟真实的用户完全对不上。
漂移是怎么发生的?举个例子。用户某次随口说了句“今天想吃点甜的”,系统抽取出“偏好甜食”记了下来。下次用户说“最近在控糖”,系统又记了“控糖中”。再下次用户点了杯无糖奶茶,系统可能又推断“偏好无糖”。几次下来,画像里关于“甜食偏好”的记录互相矛盾,检索时命中哪条全看运气。用户会觉得这个系统“一会儿一个样”,根本不懂自己。
漂移的根源是低置信度信息被当成了高置信度事实。用户随口一句话,可能只是当下情境的反应,不代表长期偏好。但如果系统不加区分地把它写进画像,还让它参与后续的推理,就会污染整个模型。冻结机制要解决的,就是把高置信度的核心记忆保护起来,不让它们被低置信度的噪音改写。
5.2 什么该冻结:高置信、高影响、低时效敏感
冻结不是把所有记忆都锁死,那系统就死了。冻结的对象要精挑细选。我的判断标准是三个条件同时满足:高置信度、高影响面、低时效敏感。
高置信度,指的是这条记忆有明确的来源,不是推测出来的。用户直接说“我住在某城市”,这是高置信;系统从“今天通勤花了一小时”推测“住在郊区”,这是低置信。高影响面,指的是这条记忆会影响很多后续决策。过敏源、健康状况、核心身份,这些一旦错了,后果严重。低时效敏感,指的是这条记忆不会因为时间流逝而失效。职业可能变,但血型不会变。
符合这三条的,就该冻结。冻结之后,这条记忆不能被常规的更新流程覆盖,只能通过显式更正来修改。也就是说,用户必须明确说“我之前说的不对,应该是 X”,系统才会解锁并更新。这样就避免了系统自作主张地“修正”用户信息。
5.3 冻结的粒度:整条冻结还是字段冻结
冻结的粒度也是个需要想清楚的问题。是整条记忆冻结,还是记忆里的某些字段冻结?这两种做法各有适用场景。
整条冻结适合那些不可分割的事实,比如“对某药物过敏”。这条记忆要么有效要么无效,不存在部分有效。字段冻结适合结构化的画像条目,比如一个用户档案里有“职业”“城市”“饮食偏好”几个字段,其中“职业”和“城市”可以冻结,“饮食偏好”保持流动。这样既保护了核心信息,又给软性偏好留了调整空间。
Hermes Memory 的设计里,我倾向于认为它采用的是混合粒度:事实型记忆整条冻结,偏好型记忆按字段冻结,关系型记忆按关系边冻结。这个粒度划分不是拍脑袋的,而是跟记忆的语义结构对应的。事实是原子的,偏好是维度的,关系是连接的,各自的冻结单位自然不同。
5.4 解冻与更正:给用户留一扇门
冻结机制最怕的是什么?是冻错了没法改。如果系统把一个错误的记忆冻结了,用户又没法更正,那这个错误就会永久存在,比不冻结还糟糕。所以冻结机制必须配一套解冻和更正流程。
解冻的触发条件应该是显式的用户更正。用户说“你记错了,我不是 X 而是 Y”,系统就应该定位到对应的冻结记忆,解锁、更新、重新冻结。这个过程要可追溯,记录下谁在什么时候因为什么原因修改了哪条记忆。可追溯性在记忆系统里特别重要,因为一旦画像出问题,你得能查出来是哪次更新导致的。
另外,解冻不应该太容易触发。如果用户随便说句话就能解冻核心记忆,那冻结就形同虚设。我的经验是,解冻需要明确的否定或更正意图,而不是模糊的、可能被误判的表达。这个判断可以交给模型做,但要有较高的置信度阈值,宁可漏解冻,不可错解冻。
6. 双闸协同:有界和冻结怎么配合才不打架
6.1 两个机制的职责边界
有界管“量”,冻结管“稳”,听起来各司其职,但实际运行起来,两者会互相影响。最典型的冲突场景是:有界机制要淘汰一条记忆,但这条记忆是冻结的,该不该淘汰?
答案显然是不该。冻结记忆应该豁免于常规淘汰。因为冻结的前提就是这条记忆高价值、高影响,淘汰它等于自毁长城。所以有界机制的淘汰候选集里,应该先排除掉所有冻结记忆,只在非冻结记忆里做价值排序和淘汰。这样冻结记忆就成了记忆库里的“钉子户”,只要不被显式解冻,就永远占着位置。
但这也带来一个新问题:如果冻结记忆太多,把容量占满了怎么办?这就需要冻结配额。给冻结记忆设一个比例上限,比如不超过总容量的 20%。超过上限时,要么提升容量,要么对冻结记忆做二次评估,把那些其实没那么重要的解冻降级。这个配额机制保证了冻结不会失控。
6.2 写入时的双重校验
一条新记忆要写进库,得同时过两道关。第一道是有界校验:当前容量还有没有空间?如果没有,这条新记忆的价值分够不够高,能不能挤掉一条现有的低价值记忆?第二道是冻结校验:这条新记忆会不会跟已有的冻结记忆冲突?如果冲突,是拒绝写入,还是标记为待确认?
这个双重校验的顺序很重要。我的建议是先冻结校验,再有界校验。因为如果新记忆跟冻结记忆冲突,那它根本就不该被写入,后面的容量判断就没意义了。先做冲突检测,能避免无效的容量计算,也能防止冲突信息进入库内污染检索。
冲突检测的逻辑也要分情况。如果新记忆是对冻结记忆的补充(比如冻结了“对花生过敏”,新记忆是“对坚果类也敏感”),那可以共存,甚至应该关联起来。如果是直接矛盾(冻结了“住在 A 城”,新记忆说“住在 B 城”),那就得走显式更正流程,不能自动覆盖。
6.3 检索时的优先级排序
检索环节是双闸协同的另一个关键点。当用户提问,系统从记忆库里捞相关记忆时,冻结记忆和非冻结记忆的权重应该不一样。
冻结记忆因为是高置信的,应该在排序时获得加权提升。同样相关度的两条记忆,冻结的那条排前面。这样能保证系统的回答优先基于最可靠的信息。但也不能让冻结记忆完全压制其他记忆,否则画像就僵化了。加权系数需要调,我的经验是 1.2 到 1.5 倍比较合适,太高会让系统显得固执,太低则冻结失去意义。
另外,检索时还应该做冲突检测。如果捞出来的记忆里有互相矛盾的,系统应该意识到这个冲突,要么在回答时说明“关于这点我这里有不同记录”,要么触发一次澄清询问。直接忽略冲突、随便选一条用,是很多记忆系统的通病,也是用户觉得“系统记岔了”的主要原因。
7. 落地实操:从零搭一套带双闸的记忆系统
7.1 存储选型:向量库 + 关系库 + 缓存
真要动手搭,存储层怎么选是第一个决策。我的建议是三件套:向量数据库存语义记忆,关系数据库存结构化画像,缓存存热记忆。
向量库负责语义检索,把每条记忆编码成向量,用户提问时做相似度匹配。选型上,如果数据量在百万级以内,很多轻量方案都能扛;上了千万级,就得考虑分布式方案。关系库负责存 USER 模型的结构化部分,比如用户档案的各个字段、记忆之间的关联关系。缓存负责热记忆,用内存存储,保证高频检索的延迟。
这三者之间要有同步机制。一条记忆写入时,先落关系库保证持久化,再写向量库供检索,如果判断是热记忆再进缓存。检索时优先查缓存,未命中再查向量库,最后用关系库补全结构化信息。这个链路要设计好,否则会出现“向量库里有但关系库里没有”的不一致问题。
7.2 写入链路:抽取、打分、校验、落库
写入链路的每一步都要有明确的输入输出和失败处理。
抽取:用模型从对话里识别候选记忆,输出结构化的记忆条目,带类型、内容、置信度。这一步的 prompt 设计很关键,要让模型区分“值得记的”和“随口说的”。
打分:对每条候选记忆计算价值分,综合考虑置信度、信息密度、预期影响面。打分可以用规则,也可以用模型,但规则更可控。
校验:过冻结校验和有界校验两道关。冻结校验查冲突,有界校验查容量。
落库:通过校验的写入存储层,同时更新索引和缓存。写入要幂等,防止重复写入同一条记忆。
整个链路里,抽取和打分是最容易出问题的环节。抽取太激进,会写入大量噪音;太保守,会漏掉重要信息。打分不准,会导致淘汰机制误杀。这两个环节都需要持续调优,最好有反馈机制,根据检索命中率和用户反馈来调整。
7.3 检索链路:查询改写、多路召回、重排
检索不是简单地把用户问题扔进向量库就完事。用户的问题往往很短、很模糊,直接检索效果很差。需要做查询改写,把用户问题扩展成更适合检索的形式。
然后是多路召回。一路走向量检索,捞语义相关的;一路走结构化查询,捞画像里匹配的;一路走缓存,捞热记忆。三路结果合并后做重排,综合考虑相关度、记忆类型、冻结状态、时效性,输出最终的 top-k。
重排这一步是双闸机制发挥作用的地方。冻结记忆加权、过期记忆降权、冲突记忆标记,都在这里处理。重排的规则可以先用简单的加权公式,跑起来之后再根据效果调。
7.4 更新链路:增量更新与全量重建
记忆库不是写完就不管了,需要定期维护。维护分两种:增量更新和全量重建。
增量更新是日常的,每次对话后把新记忆写进去,同时触发相关的画像聚合更新。这个要轻量、快速,不能阻塞主流程。全量重建是周期性的,比如每周或每月跑一次,重新计算所有记忆的价值分,重新做画像聚合,清理冗余和冲突。全量重建比较重,适合在低峰期跑。
全量重建的价值在于纠偏。增量更新跑久了,难免积累一些小的不一致和冗余,全量重建能把这些清理掉,让记忆库回到一个干净的状态。我的经验是,增量更新保证实时性,全量重建保证长期健康,两者缺一不可。
8. 踩过的坑:那些文档里不会写的教训
8.1 抽取过度:把闲聊当成了偏好
我最早做记忆抽取的时候,犯的最大错误就是抽取太激进。用户说“今天好累”,我记了“用户近期疲劳”;用户说“这电影还行”,我记了“用户喜欢这部电影”。结果画像里塞满了这种一次性的、情境化的信息,检索时全是噪音。
后来我调整了策略,只抽取有长期价值的信息。判断标准是:这条信息如果一周后还在用,值不值得记?如果答案是否定的,就不记。这个标准大幅降低了噪音,画像质量明显提升。代价是可能漏掉一些短期有用的信息,但相比噪音带来的危害,这个取舍是值得的。
8.2 冻结误伤:把该流动的记忆锁死了
冻结机制用不好,会误伤那些本该流动的记忆。我有一次把用户的“职业”冻结了,结果用户换了工作,系统还一直按旧职业推荐内容,用户觉得系统“完全不懂我”。问题出在,职业虽然相对稳定,但并非不可变,不该被无条件冻结。
后来我重新梳理了冻结标准,把“低时效敏感”这一条卡得更严。真正该冻结的是那些几乎不会变的信息,比如过敏源、血型、母语。职业、城市、兴趣这些,虽然相对稳定,但都有变化的可能,应该保持可更新,只是更新时要求更高的置信度。冻结的门槛宁高勿低,冻错了比不冻更麻烦。
8.3 检索冲突:两条记忆打架时怎么办
检索时捞到互相矛盾的记忆,这个场景比想象中常见。用户三个月前说喜欢 A,上个月说喜欢 B,两条记忆都在库里,检索时都命中了。早期我的处理是简单按时间排序,取最新的。但这样会丢失信息,用户可能只是“最近喜欢 B”,不代表“不喜欢 A 了”。
后来我改成保留冲突并显式处理。检索到冲突时,系统不自动选一条,而是在回答里体现这个变化,比如“你之前提到喜欢 A,最近又对 B 感兴趣,是想聊聊 B 吗?”这样既尊重了历史,又跟上了现状。用户会觉得系统“记得很清楚”,而不是“记岔了”。
8.4 容量估算:别等爆了才扩容
容量规划上,我踩的坑是低估了增长速度。一开始觉得一个用户几百条记忆够了,结果实际跑起来,活跃用户一个月就上千条。容量爆了之后,检索延迟飙升,淘汰机制频繁触发,把一些还有价值的记忆也淘汰了。
教训是,容量规划要留足余量,按预期峰值的两到三倍来设计。同时要有监控和预警,容量用到 70% 就该考虑扩容或优化淘汰策略,别等到 95% 才动手。记忆系统的容量问题,永远是预防比补救便宜。
9. 一些延伸思考:记忆系统的边界在哪
9.1 记忆的隐私边界
记忆系统天然涉及用户隐私,这是个绕不开的话题。我的原则是最小必要:只记对服务用户真正必要的信息,不记无关的。同时要给用户可见可控的能力,让用户能查看系统记了什么、能删除不想被记的内容。透明和可控是建立信任的基础,藏着掖着的记忆系统,用户一旦发现就会反感。
9.2 记忆与遗忘的平衡
好的记忆系统不只是“记得住”,还要“忘得掉”。有些信息,用户可能希望系统忘掉,比如一次尴尬的提问、一段不愉快的经历。系统应该支持主动遗忘,并且在遗忘后不再从其他记忆里推断出被遗忘的内容。遗忘不是删除那么简单,还要切断相关的推理链路,这个做起来比想象中复杂。
9.3 从记忆到理解
最后一点,记忆的终极目标不是“存下来”,而是“用起来”。存了一堆记忆但不会用,等于没存。Hermes Memory 的 USER 建模,本质上是在把零散记忆转化成对用户的理解。这个转化过程,才是记忆系统真正的价值所在。技术上的存储和检索只是手段,让 AI 真正“懂”用户,才是目的。
我在实际项目里的体会是,记忆系统的效果,最终不取决于你用了多先进的向量库、多复杂的打分公式,而取决于你对用户需求的理解深度。你越清楚用户希望被怎样记住,就越能设计出好用的记忆机制。技术是骨架,对场景的理解才是灵魂。