跳到主要内容

遗忘问题:无限膨胀的 Agent 记忆如何拖垮性能

· 阅读需 10 分钟
Tian Pan
Software Engineer

一个记住所有事情的 agent,最终什么有用的都记不住。这听起来像是悖论,却是每个在没有遗忘策略的情况下上线长期运行 AI agent 的团队的亲身体会。记忆存储不断膨胀,检索质量持续下降,某一天你的 agent 开始自信地引用用户的前雇主、一个已废弃的 API 端点,或者一个六个月前就已放弃的项目需求。

行业在赋予 agent 记忆能力上投入了大量精力,却很少关注那个更难的问题:教会 agent 如何遗忘。

积累陷阱

大多数 agent 记忆系统遵循一条简单的流水线:检测重要信息,生成 embedding,存入向量数据库,之后通过相似度搜索检索。这在前一百次交互中运转良好,到了第一千次,便开始出现问题。

失败模式很隐蔽。没有任何崩溃,agent 依然在检索记忆并生成流畅的回复。但检索到的上下文中越来越充斥着过时的偏好、过时的事实,以及来自毫不相关的对话、却碰巧与当前查询在语义上相似的片段。agent 以同等的置信度处理所有这些注入的上下文——它没有任何机制来区分上周的记忆和去年的记忆。

关于 LLM agent 中经验跟随行为的研究精确地量化了这个问题。在一项研究中,使用"全量存储"记忆策略的 agent 积累了超过 2,400 条记录,而其在医疗推理任务上的准确率却跌至 13%。同样的 agent 在采用选择性记忆管理——只添加高质量的经验并主动删除过时条目——之后,仅维护了 248 条记录,准确率却达到了 39%。存储更少,性能提升了 3 倍。

这一规律在不同领域中保持一致。在一个自动驾驶 agent 测试中,选择性记忆的得分为 51%,而无限积累则只有 32%。其背后的机制是经验跟随特性:agent 会复制它所检索到的记忆的风格和质量。当你的记忆存储被缺陷或过时的条目污染时,agent 会忠实地复现这些缺陷。

记忆系统悄然失效的四种方式

记忆退化的危险之处在于,从外部看起来一切运转正常。有四种标准监控无法捕捉到的独特失效模式。

去上下文化存储是最根本的问题。向量数据库存储文本片段时不保留关系结构。当用户在一次对话中说"我的大女儿9岁了",在另一次对话中说"我们在为孩子们计划一次旅行"时,记忆系统无法可靠地关联这些事实。它存储的是孤立的片段,脱离了彼此之间的关系后便失去了意义。

过时信息的持续存在会制造出自信却错误的回答。如果用户六个月前提到在 A 公司工作,如今已经换了工作,记忆系统会高兴地检索出那条信息并将其注入提示词中。agent 无从得知这条信息已经过时——它处理记忆检索结果的方式与处理其他任何提示词内容完全相同,没有任何不确定性信号。

跨上下文污染对重度用户打击最大。使用 agent 处理多个项目的人会发现,每当不同项目的话题共享相似词汇时,项目 A 的记忆便会渗入项目 B。检索系统匹配的是语义相似度,而非对话相关性,因此调试一个 Python 服务时,可能会把完全无关的 Python 数据流水线的记忆一并浮现出来。

错误传播是最隐蔽的问题。当 agent 犯了一个错误,而这个错误被存储为记忆时,它就成为了未来错误的模板。研究表明,有缺陷的记忆条目会随时间复合累积——每一条进入记忆存储的错误决策,都会增加下游发生类似错误决策的概率。这是 agent 版本的"用自己的输出训练自己":一场质量螺旋式下滑。

真正有效的遗忘策略

人类记忆不会以相同权重保留所有事情,agent 记忆也不应该如此。最有效的生产系统通过几种互补策略实施刻意遗忘。

基于时间的衰减与语义分类根据存储信息的类型分配不同的生存时间(TTL)。不可变的事实,如用户姓名或关键系统约束,获得无限 TTL。瞬态上下文,如"用户目前正在调试性能问题",获得数小时或数天的短 TTL。偏好信息则介于两者之间。这与艾宾浩斯遗忘曲线相呼应——记忆的保留呈指数级衰减:大部分信息迅速消失,余下的缓慢淡出。

访问频率强化在 agent 每次成功检索并使用某条记忆时提升其相关性评分。这创造了一种自然的选择压力:在实践中被证明有用的记忆得以留存,而从未被检索的记忆则逐渐衰减至检索阈值以下。这是 agent 版本的间隔重复——你真正需要的记忆会不断地自我刷新。

带质量门控的选择性添加从源头上预防问题。系统不再存储每次交互,而是评估一条新记忆是否添加了尚未被已有记忆覆盖的信息、是否与现有记忆相矛盾(此时应更新旧记忆,而非补充新记忆),以及是否达到最低质量门槛。研究表明,仅靠严格的选择性添加,即使没有任何删除机制,也能比朴素的记忆增长带来 10% 的绝对性能提升。

主动整合定期将相关记忆合并为压缩摘要。系统不再维护关于用户基础设施配置的十五条独立记忆,而是将它们综合为单一的结构化表示。这减少了存储量,提升了检索精度,并且——至关重要的是——解决了信息随时间变化而积累的矛盾。一些系统会在整合期间部署专门的仲裁 agent 来审查冲突条目,对保留哪个版本的事实做出明确决策。

衡量记忆是否有益

遗忘问题中最难的部分不是实现衰减——而是知道你的记忆系统是否整体上产生正面效益。大多数团队从未度量这一点,而那些度量过的团队往往会发现令人不安的事实。

基准测试很简单:在相同的任务集上分别运行启用记忆和禁用记忆的 agent。如果禁用记忆的版本表现相当,说明你的记忆系统只是在增加复杂度而不产生价值。这种情况比团队预期的更常见。一项基准测试发现,使用基础文件系统作为记忆存储的 agent 优于使用专门记忆工具的 agent——准确率分别为 74% 对 69%——因为文件系统的方式更符合模型实际处理信息的方式。

除了开关对比测试之外,还有三个指标对持续的记忆健康状况至关重要。

检索精度衡量检索到的记忆中有多大比例与当前查询实际相关。如果你的 agent 检索了十条记忆,其中只有两条有用,那么另外八条就是噪声,在争夺模型的注意力。随时间追踪这个指标——检索精度曲线的下降是记忆膨胀的领先指标。

过时率衡量检索到的记忆中包含过时信息的频率。每周对检索结果进行采样,让人工审阅者标记过时条目并计算比率。过时率超过 15-20% 意味着你的衰减机制不够激进。

任务性能与会话数的关系是最终衡量标准。将 agent 的准确率(或任何相关的任务指标)与其完成的会话数绘制成图。健康的记忆系统会显示性能随时间改善或稳定。不健康的系统则会显示初期改善之后出现平台期或下降。那个拐点会精确地告诉你,积累的记忆从何时开始弊大于利。

对于处理数千个会话的生产系统,自动化评测方法至关重要。LOCOMO 基准测试用于测试多会话记忆保留,MemoryAgentBench 等工具用于评估增量多轮交互。构建你自己的按计划运行的特定任务评测——真实流量的分布比任何通用基准都更重要。

架构转变:从全量存储到刻意精选

新兴的最佳实践将 agent 记忆视为需要持续维护的精心管理的知识库,而非一个不断填充的数据库。这需要团队从根本上转变对这个问题的思考方式。

**为记忆存储设定预算。**设置 agent 每个用户或每个上下文可以持有的记忆数量的明确上限。当预算达到上限时,系统必须做出权衡取舍——就像上下文窗口预算一样,但时间跨度更长。这迫使你实施基于质量的驱逐机制,而非任由存储无限增长。

**分离记忆层级。**并非所有记忆都需要相同的处理方式。短期工作记忆(当前对话上下文)应存在于提示词中。中期记忆(近期交互、活跃项目)应使用具有激进衰减的快速检索。长期记忆(稳定事实、经过验证的偏好)应使用较慢、更持久的存储,并进行低频整合。每个层级都有不同的写入标准、衰减速率和检索策略。

**在记忆层构建可观测性。**记录每一次记忆写入、检索和驱逐。当 agent 产生错误响应时,你需要追溯哪些记忆被检索到,以及它们是否导致了这次失败。没有记忆可观测性,调试长期运行的 agent 就如同在没有请求日志的情况下调试微服务。

**运行记忆专项评测。**标准的 agent 评测不会测试记忆质量。你需要专门探查以下方面的评测:过时性(agent 是否使用了过时信息?)、矛盾解决(当事实发生变化时,它是否能够适应?)以及跨上下文隔离(它是否能将不同项目区分开来?)。在 100、500 和 1,000 个会话时运行这些评测,以便及早捕捉退化曲线。

展望未来

遗忘问题从根本上是一个精选问题。问题不在于你的 agent 能不能记住——那是容易的部分。问题在于它能否维护一个随时间改善而非退化其性能的记忆存储。

做得好的团队将记忆视为一个需要持续维护的活系统,而非一个只写入不读出的档案库。他们以与衡量模型性能同样严格的标准衡量记忆健康状况。他们也已内化了这个反直觉的教训:通往更好 agent 记忆的道路,往往要经过刻意地丢弃信息。

一个有策略地遗忘的 agent,始终会优于一个不加选择地记忆一切的 agent。工程挑战在于构建出识别两者差异的判断力。

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