跳到主要内容

智能体记忆漂移:为什么一致性对齐是你缺失的关键环

· 阅读需 12 分钟
Tian Pan
Software Engineer

你长期运行的智能体(agent)所做的最危险的事情,也是它做得最自信的事情:根据记忆回答。客户的地址在上周二更改了。智能体认为“开启”的工单在昨天被人工关闭了。智能体拥有整洁解释笔记的产品功能,其实际交付的形式与智能体三周前阅读的规范不同。在教科书定义上,这些都不属于幻觉——模型准确地召回了它存储的内容。只是在智能体看向别处时,世界已经发生了变化。

大多数团队将记忆视为一个写入问题:智能体应该记住什么、我们如何总结、嵌入(embedding)策略是什么、如何防止存储爆炸。这种思维方式产生的架构会随着错误程度的增加而变得更加自信。更难的问题——那个决定你的智能体在第三周后是否仍然有用的问题——是对账(reconciliation):这是一个明确的、持续的闭环,用于比较智能体认为真实的情况与底层系统当前显示的真实情况。

如果你曾经交付过基于数据库的缓存,你已经知道这种模式。没有失效机制(invalidation)的缓存就是地雷。没有对账的记忆也是同样的地雷,只不过你的智能体还会用流畅的散文来描述这场爆炸。

你无法防止、只能检测的漂移

漂移不是一个 bug。它是任何运行窗口超过其所知实体平均变更时间的智能体的一种热力学属性。从智能体写下一个事实的那一刻起——“用户偏好异步站会”、“该账户处于专业版计划”、“部署管道在合并前运行测试”——那个事实是正确的。从那一刻起,每过一分钟而不重新检查,它变错的可能性就会累积一分钟。

这就是为什么“让智能体记住更多”很少是长期系统的正确下一步投资。更多的记忆意味着更多的漂移暴露面。Tuesday Towards Data Science 对构建生产级记忆系统的从业者进行的一项调查发现,反复出现的教训是:今天有用的记忆明天就会过时,唯一的持久策略是针对重新验证(re-validation)而非保留(retention)进行设计。

正确的思想模型不是充斥在智能体文献中的人类记忆比喻。它是一个落后于主库的数据库副本。副本不会对其存储的内容撒谎;它们会准确地告诉你它们上次复制的内容。纪律并不在于让副本变得更聪明,而在于精确地知道它有多陈旧、它追赶到了哪个水位线(watermark),以及如何处理那些需要比现有数据更清新的读取请求。

借鉴自数据库的对账模式

好消息是,分布式系统工程师已经解决了其中的大部分问题。智能体的记忆系统正在悄无声息地趋同于那些保持大型数据库缓存一致性的相同原语。

带有水位线的版本化读取。 每个记忆条目都带有它所衍生的真理源的版本。当智能体读取记忆时,它可以将该水位线与底层实体的当前版本进行比较。如果实体已经超过了水位线,读取操作要么触发刷新,要么被标记为“可能已过时;上次对账版本为 N”。这是副本系统用来暴露延迟的相同技巧,在迁移到 LLM 智能体时几乎保持不变。

变更馈送订阅。 与其让智能体在每次读取时轮询现实,不如让记忆所引用的实体发布变更馈送——类似于 Debezium 风格的 CDC、事件总线或仅仅是一个 webhook。当 CRM 中的客户地址发生变化时,一个事件会进入记忆层订阅的主题。受影响的记忆条目被标记为脏数据。下一次读取时要么刷新,要么返回带有新鲜度标志的结果。这正是 Hazelcast 和其他缓存供应商多年前为针对操作型数据库的常青缓存所记录的模式——它成熟、乏味,但在应用于智能体记忆时极其有效。

读取时的延迟重新验证。 主动失效(Eager invalidation)在智能体规模上有一个致命缺陷:大多数存储的事实在变得无关紧要之前永远不会被再次读取,因此主动刷新它们是浪费的。延迟重新验证反其道而行之。当智能体获取记忆条目时,记忆层会根据源检查水位线。如果条目早于其信任预算,它会在返回之前触发同步或后台刷新。你只需为实际使用的记忆支付新鲜度税,这与你几乎肯定拥有的访问偏斜(access skew)相匹配。

随可变性衰减的 TTL。 一个带有时间戳的不可变事实(“客户于 2026 年 3 月 4 日注册”)理应拥有无限的 TTL。一个易变的事实(“客户上一个工单的优先级为高”)则理应只存活几分钟。许多团队通过惨痛教训发现了一个供应商的陷阱:统一的 TTL 会保证你在过度刷新稳定数据的同时,欠刷新易变数据。解决方法是根据记忆所引用的实体的可变性概况对记忆进行分类——类别型的、缓慢变化的、快速变化的、瞬时的——并为每类应用不同的衰减率。分类可以是启发式的;大致正确比追求完美更重要。

作为系统工作,这些都不是什么新鲜事。它之所以让人感到新奇,是因为大多数智能体代码库从未实现从“记忆是内容的向量索引”到“记忆是操作状态的派生视图,而视图需要失效机制”的转变。

状态 Embedding 的陷阱

我在生产级 Agent 系统中看到的最常见的架构错误,就是坚持将 Embedding 作为易变事物的首要表示形式。Embedding 非常适合文本的语义检索。但作为对账(reconciliation)的基础,它们简直是灾难,因为它们抹去了你进行选择性失效所需的结构。

想象一下,Agent 为客户附加了一个向量摘要:一个 1024 维的“数据块”,将六个月的对话压缩为“想要异步支持,不喜欢电话,主要咨询计费 API,目前是 Growth 方案”。现在客户升级到了 Enterprise。Embedding 的哪些维度编码了该方案?你不知道。你也无法知道。方案信息与向量中的所有其他内容混合在一起。你唯一的选择是重新生成整个摘要(成本昂贵,且你刚刚丢弃了正确的部分),或者让它过时(Agent 现在会在无意中充满自信地断言客户使用的是 Growth 方案)。

结构化记录——{ plan: "Growth", communication_pref: "async", recent_topics: ["billing API"] }——具有明显的优势,即你可以独立更新 plan 字段。水印按字段附加。变更反馈(Change feeds)按字段失效。Embedding 陷阱在于:正是那些让向量记忆显得强大的特性(将大量文本压缩成一个可进行相似度搜索的人造产物),导致了它无法保持实时性。

务实的架构将向量视为结构化事实来源(ground truth)之上的检索层,而不是事实来源本身。Embedding 让 Agent 找到正确的记录。而记录才是被读取、对账和引用的对象。如果出于上下文窗口限制必须进行总结,请在读取时对结构化记录进行总结——并在会话结束时丢弃该总结,以免它僵化成过时的产物。

当记忆与现实冲突时,信任就会崩塌

一个值得深思的失效模式:Agent 充满自信地断言了一些与用户当前所知的实情相矛盾的事情。比如,客服 Agent 用你的旧称呼称呼你。编程 Agent 根据上周重构前的代码版本解释一个函数。销售 Agent 向正盯着另一个标签页中正确数字的代表背诵错误的账户规模。

这些时刻造成的损害是不对称的。Agent 可能连续几百次都是正确的,但只要对一个明显可知的实情给出一个自信的错误答案,信任账本就会归零。实践者报告称,在真实世界的测试中,超过三分之一的存储用户状态事实在三个月内就变错了——而 Agent 在检索这些事实数百次时,从未标记过不确定性。模型并没有撒谎。它只是在告诉你它记得的内容,而它记得的是一个早已发生变化的过往世界的快照。

缓解措施不是缩小记忆规模或采用更好的总结方式。而是让 Agent 与其记忆的关系变得诚实。当读取一条记忆条目时,Agent 应该知道其新鲜度——至少是“X 分钟前检查过”或“最后一次与版本 N 的来源对账”。对于关键性的主张,Agent 应该能够(且被提示去)重新读取来源,而不是依赖记忆。这就像资深工程师在根据两周前会议的陈旧笔记发布修复程序前所遵循的纪律:相信你的笔记,但要验证系统。

改变状态的评估(Evals)

针对记忆的评估套件大多测试了错误的东西。它们检查 Agent 是否能回忆起被告知过的事情。更难的问题——也是决定生产安全的问题——是 Agent 是否能察觉到它被告知的事情已不再属实。

这种评估模式描述起来很简单,但实际落地却很罕见。运行一个 Agent 学习并存储某个实体事实的会话。在会话之间更改事实来源(source-of-truth)中的实体。运行一个新的需要该事实的会话。根据 Agent 是检索了现在已过时的记忆并自信地使用它、检索了它但标记了新鲜度、拒绝使用它,还是正确地重新读取了来源来进行评分。大多数生产级 Agent 在前三个阶段就失败了,永远无法达到第四个阶段。

ICLR 2026 关于记忆基准的工作将“冲突解决”列为一级能力,正是因为业界认识到,仅凭检索准确率这一个指标是错误的。一个从 30% 已过时的记忆中以 99% 准确率进行检索的 Agent,远不如一个检索准确率为 80% 但知道何时说“我不确定,让我查一下”的 Agent。“世界状态扰动评估”正是将这种区分引入你的 CI 流水线的手段。

一个实用的版本:维护一小组“对账追踪”(reconciliation traces)——即在不同回合之间以编程方式扰动底层记录的会话记录。在每次记忆系统变更时重新运行它们。对账追踪的通过率是少数几个能反映你的 Agent 能否在生产环境中撑过第一个月的指标之一。

记忆与知识状态是两回事

这种能将一切整合起来的组织级模式,源于大多数团队并未察觉的词汇区别:记忆是智能体形成的信念的只写日志(write-only log);知识状态则是对世界的一个通读缓存(read-through cache),它知道何时该失效。它们承担着不同的职责,不应共享同一个层级。

在这个框架下,记忆是只增(append-only)的。智能体观察,然后写入一条信念。信念包含其出处、时间戳和水印。它们永远不会在原处更新——修正项是取代先前项的新条目,并带有指向被替换内容的明确指针。这使得记忆可审计、可回放,且可以安全地进行自省。

知识状态是智能体在交互回合中实际查询的层。它由记忆加上对真相源(source of truth)的实时读取构建而成,并针对每个实体类应用协调策略。它被允许失败,允许标记新鲜度,也允许在关键事实过于陈旧时拒绝回答。最重要的是,它被允许比记忆更小——它可以丢弃已经变得无法调和的信念,而不是将其当作真理展示。

不将两者分开的团队最终会得到一个巨大的记忆块(memory blob),既不可审计也不可信。而将它们分开的团队则会获得更有价值的东西:一个知道自己知道什么、知道自己曾经知道什么、并且明白两者之间区别的智能体。

你在长程智能体(long-horizon agent)上要做的最难的工程,不是提示词、工具衔接或编排。而是那些枯燥的、数据库式的琐碎工作——在世界变幻莫测时,确保智能体对世界的看法依然保持诚实。

References:Let's stay in touch and Follow me for more thoughts and updates