Sonnet 压一轮上下文,安全规则只剩 53%,五轮跌到 10%

The Compaction Cliff in Long-Running AI Agent Memory

Saber Zerhoudi, Jelena Mitrovic, Michael Granitzer

cs.AI, cs.IR

2026-08-24

生产级压缩把安全规则和日志同等摘要。Sonnet 的 /compact 一轮保住 53%、五轮剩 10%。按类型分流后,五轮约束召回稳定在 96%。

这篇在解决什么

长会话 agent 的上下文会满。运行时靠三件事续命:原地压缩、把过大主题切开、把知识外置再按需取回。生产方案对所有条目一视同仁,安全规则和调试日志按同一比例摘要。

规则需要原句才能执行。「患者对青霉素过敏」被改写成「注意过敏史」,下一轮就可能开出阿莫西林。Passau 大学测了 Claude Code 的 /compact(Sonnet 4.6),在 20 套生产配置上,一轮保住 53% 安全规则,五轮只剩 10%。他们把这条衰减曲线叫做 Compaction Cliff。

同样的悬崖出现在四种 LLM 压缩器和最强非 LLM 压缩器 LLMLingua-2 上。提示词已经写了「安全规则和流程命令请原文保留」,规则照样按摘要比例蒸发。这不是某一个 prompt 没写好。

方法

Knowledge Triage 先给知识库每条打五类标签,再按类型走不同保真度。五类覆盖他们从 54,628 个 GitHub 仓库刮来的 396,934 条 agent 配置里 97% 的内容:

分类器默认是 SafetyMargin:问「删掉这条会不会让某个动作变不安全」,用 gpt-5.4-mini 打 0 到 1 分,超过 0.5 标成约束。它能抓住「患者对青霉素过敏」这种陈述句。正则只能抓 never、must not,陈述句全漏。

三条确定性算子覆盖三种上下文操作:

预算压到连硬规则都放不下时,压缩退给拆分,再把一部分外置给检索。分类只在建索引时跑一次,后续轮次不再调模型。

结果

压缩在 20 套配置上预算匹配,约束召回如下:

方法压到 50%25%10%五轮后
TypeCompact1.000.950.800.96
Sonnet 4.6 /compact0.530.390.240.10
LLMLingua-20.210.080.01未测

TypeCompact 用信念和偏好保真度(0.50 / 0.51)换约束和流程全留。去掉分类、校验、Unsafe 升级里任意一块,样本上的召回都会掉到 0.50 以下。50% 压缩时校验器平均每次回填 0.46 条规则,没有一次升级到 Unsafe。

拆分测了 200 套配置、每块预算 25% token。TypeDecompose 局部性违规 0%。按 token 均匀切开时,93% 的配置至少违规一次。平均复制开销 14.5%,中位数 0%(74% 的配置没有全局约束),最坏 219%。

检索在 1,033 条混合语料、50 条查询上,TypeRetrieve 的 recall@50 是 100%,最强单次 LLM 检索 Sonnet 是 73%。钉规则是数据库查找,每查询 0 个 LLM token,对照要 5,776 到 6,741。

下游行为把「规则还在不在」换成「agent 会不会做错」:

人工复核比自动 key-token 更严。TypeCompact 的保留率从 91% 掉到 86%,层级截断从 64% 掉到 41%。差距在更严的尺子下变大。

为什么重要

生产 agent 已经在写病历、改客户账户。压缩还把「尽量保留安全规则」交给前沿模型,规则会按摘要比例蒸发。这篇给的是工程补丁:分类一次,硬规则钉死,校验失败就拒压。

对写 AGENTS.md、CLAUDE.md 的人,类型组成本身是质量信号。偏好和近期日志占主导的配置,安全性弱于明确约束加流程的配置。多 agent 在委派前先摘要,也会继承这座悬崖。

这是渐进、可落地的改法。分类器召回 0.93 时,漏掉的那 7% 约束仍然会丢。保证停在存储层,管不了对齐训练和思维链。

局限与存疑

保证完全绑在分类器召回上。SafetyMed 上 4.5 点的保留缺口,就是 SafetyMargin 漏掉的 9 条陈述句。

AgentArtifactCorpus 来自公开 GitHub,企业内部分布可能不同,上线前要重拟合。五类标注一致性只有 κ=0.45,约束对其他才到 0.79。拆分复制开销极端值到 219%。多轮衰减只在四个 LLM 家族里测了两个。MaRS 没有公开实现,对照是他们按「单一子模效用、不按类型钉死」自行重写的。

零售对照不是等 token:TypeCompact 留 1,136 token,层级截断只留 669。航空上 TypeCompact 更短(647 对 718)仍然领先,但等 token 的行为对照还没做。会话中途才变成约束的条目,需要在线分类,这篇没做。

术语

原文与代码

社区讨论

相关论文

全部论文解读