长期运行 Agent 存在四类上下文腐坏:压缩丢失、漂移偏移、优先级模糊、噪声积累;文章给出了每类的具体表现和反制对策。
Agent 不会遗忘,是因为模型差。是因为我们从设计上就让它遗忘了。六个多小时、四十条消息之后,Agent 真正需要的东西没了——或者还在,但已经错了,被噪声淹没了。
过去一个月,我沉浸在一个始终在线的 AI Agent 团队中,它们持续运行数周。不同的任务,同一个代码库,同一个共享的经验库。它们互相 review PR、发布内容、制定计划。它们会腐坏。我见证了每一种腐坏的形式,然后建立了应对措施。
压缩丢失。 当一个会话的窗口用尽时,一份摘要会取代原始历史。听起来没问题,直到 Agent 需要那些被摘要掉的细节。我曾看到一个 Agent 重复一个与两屏之前的决定相矛盾的计划。没人注意到,因为矛盾存在于一个已经被抹除的深度。
漂移。 每一轮都会把 Agent 推向最近的和最响亮的信息。给十个上下文,它会权重最后五个。经过数百轮,它悄悄地在解决一个和你分配给它的问题不同的问题。
优先级模糊。 "我们决定了 X"和"我们看过 X"在 token 里感觉是一样的。决定不再是约束性的,变成了建议。
噪声积累。 过时的输出和死胡同堆叠起来。信噪比下降,而退化的比值看起来像是模型变笨了。
便宜的解决方案是"扩大窗口"。我把这个反射从自己身上建出来了。更长的窗口不会修复腐坏,只会让它延期——出现在时间线的更后面,每轮成本更高,而且过了某个临界点模型的表现确实比用精简窗口时更差。记住一切是一种形式的遗忘:重要的事情被淹没了。
而且腐坏是按 profile 而非按 agent 算的。在一个共享代码库的团队中,Agent A 已经腐坏掉的东西对 Agent B 仍然重要。所以解决方案必须存在于任何单一会话之外。记忆在一个 agent 脑子里,随着那个会话一起死去。
这些都不新奇。
把摘要写成可执行的事实,而非散文。把决定和约束作为明确的、固定 schema 的条目发出,让 agent 可以执行。一个好的摘要先回答"什么是仍然有约束力的",再回答"发生了什么"。
把记忆移出会话,存入语义索引。我们最大的收获。把经验和决定保存在普通的 markdown 库中,用 embedding 索引,搜索返回的是语义而非精确字符串。"Offer-notification"和"pet-booking"是不相关的字符串,却是非常相似的问题;字符串搜索永远无法把它们连接起来,图可以——毫秒级,在一个小型的本地 embedding 模型和一个 SQLite 文件上。没有向量数据库,没有集群,没有账单。不要让一个长寿的脑子干所有的检索工作。
把知识变成技能,而不是笔记。只读一次永远不引用的经验是会腐坏的经验。持久的形式是技能:一种按需加载的流程,挂在触发器后面,在适用的时候精确拉入上下文,其余时间则不出现。这就是"该做什么的记忆"和"何时使用的记忆"之间的区别。触发器是那个需要做对的部分。
按半衰期分层记忆。瞬时偏好放在紧凑的始终在线存储中;实体事实放在可查询的结构化存储中;长寿的约定放在有意加载的库中。每一层有自己的审计节奏,这样始终在线层永远不会膨胀,深层也不会悄无声息地过时。按计划对始终在线存储进行上限和修剪:一个永远增长的始终在线记忆是一种缓慢进行的上下文腐坏。
不管你选什么,这些都适用。
让遗忘可见。如果一个会话丢弃了什么,要大声丢弃:什么进入了上下文,什么离开了,为什么。你无法管理你看不到的衰减。
比事实更难绑定决定。一个决定需要来源、状态、负责人。一个退化的决定是一次事故,不是一个麻烦。
检索,不要携带。按需拉取相关的切片,而不是带着一个臃肿的上下文到处跑。工作集越精简,腐坏越慢。
共享规则的一个真实来源。当 agent 协作时,约定属于一个任何人都能读的地方,不要复制到私有记忆中,在那里它们会不同步地腐坏,最后你同时在与同一规则的三种版本斗争。
把记忆当代码来对待。Schema 变更、评估、测试。库是源代码,索引是产出的 artifact:按 cron 重建它,永远不要手动编辑它。一个无法从源码重建的知识图谱是一种负担。
你永远无法战胜上下文腐坏。你只能管理它。设计时要让腐坏成本被限制和可观察,让真实来源存活于会话之外,因为它存在于会话之外。
我们的 agent 现在运行数周的周期,比第一版在第三小时时的衰减要少得多。差异从来不是更好的模型。而是承认:一个 agent 的上下文是一块易腐的工作面,不是一个脑子,然后按这个思路来工程化。
我一直被问哪个框架能解决这个问题。答案一直很无聊:写好压缩、按语义索引、把经验编码为触发的技能、对始终在线记忆设上限、把长寿的真相放在 agent 可以查询和重建而不是携带的地方。Agent 带着一切走看起来更酷。但它也会腐坏得更快。
那么:你如何决定一个 agent 被允许遗忘什么,你如何确保它在遗忘的时候告诉你?