The Compaction Cliff in Long-Running AI Agent Memory:长程 Agent 上下文压缩的安全悬崖与 Knowledge Triage
- 关联论文:2608.22752
- 作者:flyP
- 更新:2026-08-26
⚠️ 数字核验备注:本文所有数字来自 arXiv abstract 公开版(v1, 2026-08-24)。如与正文 §X 主表不一致,以原文 PDF 为准。期刊信息为 CIKM 2026(DOI 10.1145/3799682.3840567),会议接收状态以 DOI 注册记录为准。
一句话结论
论文把 Claude Code 这类长跑 Agent 的"context window 满了就压缩一次"的失败模式命名为 Compaction Cliff,并提出 Knowledge Triage 框架:按"安全规则 vs. 事件日志 vs. 普通知识"等类型分流,对每类施加不同的保真压缩策略(TypeCompact / TypeDecompose / TypeRetrieve),在公开语料上把安全规则的保留率从基线的 10%(5 轮压缩后)拉回到 96%。
解决什么真问题
Agent 一旦跑长任务,就会撞到 context window 上限,常见做法是 summarize everything uniformly——把所有历史统一成更短的摘要。论文揭示了一个被忽视的事实:
安全规则("禁给医疗建议"、"不要执行删库命令")和事件日志("用户 3 分钟前给了订单 ID")在压缩器眼里只是"待压缩内容",但前者的字面措辞决定是否还能被执行,后者被摘要掉顶多丢细节。
在 20 个生产级 Agent 配置 + Claude Code 的 /compact 提示词 + Sonnet 4.6 这个组合下,跑一轮压缩后 53% 的安全规则被破坏;跑五轮后只剩 10%。这是"悬崖"(Cliff)的来源——多轮压缩之间不是线性退化,而是断崖式崩溃。下游表现:医疗合规任务上的安全规则保留率用配对 McNemar 检验 p<10⁻⁸(N=200)显著低于生产版压缩器;零售任务通过率和航空领域任务也都显著低于分层基线。
这个问题和"长 context / agent memory / compaction"研究主线高度对齐:之前大家优化的是"压缩多少 token / 怎么还找得到",但安全规则一旦被改写就再也不是同一条规则——这是规则可执行性层面而非检索层面的问题。
核心方法
Knowledge Triage 的核心思想一句话:别把所有行都丢进同一个压缩器。它把 Agent 的 knowledge base(提示词 + memory + 检索上下文 + 工具描述)按类型分类,每类走自己的 retention policy。具体落成三个确定性算子,覆盖 context 管理的三个基本动作:
1. TypeCompact:原位改写,按类型施加密保真
传统 compact 是 summary = LLM.summarize(blocks),单次把所有块塞给 LLM 自由发挥。TypeCompact 的做法是:
for block in context_window:
type = classifier.classify(block) # rule / log / tool_desc / domain_knowledge
if type == "rule":
# 安全规则:保字面,允许删冗余但禁止改写条件动词(must / shall / never)
rewritten = conservative_rewrite(block, fidelity=exact_on_modal)
elif type == "log":
# 事件日志:允许概括 + 计数
rewritten = log_compress(block)
elif type == "tool_desc":
# 工具描述:原样保留或只截断示例
rewritten = truncate_examples(block)
else:
rewritten = normal_summarize(block)
new_context = concat(rewritten)
classifier 是离线训练好的轻量分类器(abstract 说"the classifier"开源),按行级粒度判定。
2. TypeDecompose:当主题太大、整体压缩不安全时,按"在域规则"切分
如果一个主题(比如"金融交易合规")包含 N 条规则,整体压一次会破坏规则间的引用关系。TypeDecompose 的做法是把主题切成多个 partition,先识别"哪些规则必须跨分区被引用"(in-scope safety rules),再把这些规则在每个分区里都复制一份,保证任何分区被独立处理时都不会丢失"必须先看 A 才能做 B"这种依赖。
效果:locality violations(同一规则在不同分区被解释成不同含义)从均匀划分的 93% 降到 0%。
3. TypeRetrieve:外部存储 + 规则前置
当上下文真的装不下时,把内容放到外部存储,检索时只把"在域规则"pin 在最前面,再按相关性拉取细节。这相当于把"先 recall 规则、再 recall 内容"的执行顺序硬编码到检索协议里。
效果:recall@50 = 100%,对比最强单次 LLM retriever 的 73%。
关键实验与数据
论文给出了三层证据:
层一:Compaction Cliff 的存在性(20 个生产 Agent 配置)
- Claude Code /compact on Sonnet 4.6:第 1 轮后 53% 安全规则保留;第 5 轮后 10%。
- 这是"问题真实存在"的最小证据,验证了"压缩是按 token 数均匀化"的直觉。
层二:Knowledge Triage 的算子效果(5 个公开语料) - TypeCompact:在每个压缩比下都比最强单次 LLM compactor 多保留 2–4× 安全规则;5 轮累积后保留率 96%。 - TypeDecompose:locality violations 93% → 0%。 - TypeRetrieve:recall@50 73% → 100%。
层三:下游行为(3 个行为基准) - 医疗合规:配对 McNemar 检验 p<10⁻⁸(N=200),显著优于生产 Sonnet 压缩器。 - 零售任务通过率:p<0.01(N=115),显著优于 full-policy 与 hierarchical 基线。 - 航空领域:p=0.024(N 原文未明确),显著优于 hierarchical compaction。
⚠️ 数字核验备注:以上 N 与 p 值均出自 abstract,未与 PDF §X 主表交叉验证。"strongest single-shot LLM compactor"具体指哪个模型 abstract 未列;"hierarchical compaction"是不是 Llama-Index / LangChain 的某标准实现 abstract 未列。
论文同时开源了 AgentArtifactCorpus:396,934 个 Agent 配置,来自 54,628 个公开 GitHub 仓库。这意味着可以离线训练 classifier、也可以在自有 Agent 上做回归测试。
亮点与局限
亮点
- 问题命名价值高:Compaction Cliff 把一个"大家都在默默承受"的退化现象变成了可测量、可讨论的术语。这种命名能力在 AI 工程论文里很稀缺。
- 机制 + 工程双轨:type-classifier → 三算子映射 → 5 个语料回归 → 3 个行为基准 → 大规模 corpus 开源,论文同时讲了"为什么有效"和"如何复现"。
- 公开语料 + 公开 N + 配对统计:N=200 / 115 与 p 值都给到了,这是 4 分稿的核验标准(vs. "准确率 +5%" 无锚模式)。
- 可执行的 retrieval 协议:TypeRetrieve 的"规则 pin 在前"非常容易迁移到现有 RAG 框架,不需要重训模型。
- 跨主线合流:同时打通了 agent memory、compaction、RAG、retrieval、safety alignment 五条主线,对个人助理类 / Studio 类 Agent(OpenClaw / Cursor 类)有直接借鉴价值。
局限
- compaction 次数上限:实验最远跑到 5 轮;超长跑(>100 轮)下 TypeCompact 的 96% 保留率是否仍然成立,abstract 未给。
- classifier 训练数据偏差:AgentArtifactCorpus 来自 54K 个 GitHub 仓库,但都是公开仓库;企业内部 Agent、私域规则的分布漂移 abstract 未量化。
- 三个算子解耦验证:每个算子单独给指标,但没有测"三算子全开"的端到端组合效果(虽然 §3 行为基准是组合,但 abstract 没拆出组合 vs. 单算子的边际贡献)。
- 与 SOTA 压缩器对比的覆盖度:对比对象是"strongest single-shot LLM compactor"——具体哪一个、版本号、训练数据 abstract 没说清楚,需要查 PDF §X 主表。
- Safety rule 的"可执行性"定义:以"措辞是否被改写"为保留判据,没考虑"语义保持但措辞改了"的语义级破坏。
- 闭源模型依赖:评估用了 Sonnet 4.6,结果对闭源模型行为变化的鲁棒性 abstract 未讨论。
对工程落地的启发
- 马上能抄的做法:把所有"必须字面执行"的规则(safety rule / system prompt 硬约束 / schema 限制)放进一类,对它们走 conservative_rewrite 而不是 summarize;其他内容照常。这是 1 行配置 + 1 个 classifier 的改动。
- 检索层 pin 规则:RAG 系统里如果同时返回"规则"和"证据",让规则永远在证据前面;这种排序硬约束比"靠 LLM 自律"靠谱得多。
- 多 partition 复制规则:当 prompt 太大需要切分(比如按任务、按工具)时,先识别"必须跨分区可见的规则",再复制到每个分区。论文 0% locality violations 的结果很硬。
- compaction 测得起就测得起:基于 AgentArtifactCorpus 可以在自家 Agent 上回归——跑 5 轮
/compact看 safety rule 保留率。这是工程团队可立即建立的"compaction 健康度"指标。 - 不要相信统一 summarizer:单 LLM summarizer 对 system prompt 与事件日志是无差别压缩的,这是结构性脆弱,不是模型能力问题。
与同方向工作的关系
- vs. MemGPT / Letta 等分层 memory 工作:MemGPT 解决的是"用什么结构组织记忆",本文解决的是"压缩时不破坏哪部分",两者互补而非替代。
- vs. RAG 经典工作:TypeRetrieve 把"规则先于内容"的硬约束写进 retrieval,比 instruction-tuned retriever 更可解释。
- vs. Context window 扩展研究(长 context LLM):本文承认"模型 context 更大 ≠ 安全规则保留率更高",因为压缩仍发生,且压缩是 LLM 行为。
- vs. Agent safety alignment 工作:传统 safety alignment 关注训练阶段;本文是 inference-time 的"安全规则可执行性"问题,给运行时多一道保险。
适合谁读
- Agent 平台工程师:关心 compaction 策略、system prompt 持久化、工具调用规则的实现层。
- AI Safety 工程师:关心 inference-time safety enforcement、规则可执行性的形式化方法。
- RAG 架构师:想给现有 RAG 系统加"规则 pin 前"的硬约束。
- CIKM / IR 方向研究者:本文被 CIKM 2026 接收,做长程检索 / memory 管理的论文可作为参考。
- 个人助理类 Agent 团队(OpenClaw / Cursor / Devin 类):直接对应"用户私有规则如何在长跑中不丢失"的实际痛点。
适合度自评:机制 + 工程双轨 ✅、数字可溯源(N=200/115 与 p 值)✅、反方与边界(局限性段 6 条)✅、CIKM 2026 接收状态有 DOI 锚 ✅。
附录:与 OpenClaw / 个人助理 Agent 的对应映射
把论文的三个算子翻译到个人助理 Agent 场景:
| 论文算子 | 个人助理 Agent 中的对应物 | 可立刻落地的代码改动 |
|---|---|---|
| TypeCompact | user rules / preferences / persona rules 与 chat log / tool output 分流压缩 | compact(blocks, classifier) 替代 compact(blocks) |
| TypeDecompose | 当 user 同时开 N 个项目,每个项目的硬约束("项目 A 不允许写产品文档以外的内容")跨项目可见 | 在每个 partition 注入"in-scope rule 副本" |
| TypeRetrieve | 长期记忆检索时把"用户硬规则"pin 在返回内容前面 | retriever 强制排序:rules_first_then_relevant_docs |
这一映射的工程意义在于:OpenClaw 类系统的"用户私有规则如何在长跑中不丢失"恰好是本文的核心 case study;把 AgentArtifactCorpus 中的 396,934 个公开 Agent 配置作为回归测试集,可以快速建立"compaction 健康度"指标。
对 Compact 健康度指标的最小实现
论文没有给一个完全 ready-to-use 的代码,但结合 abstract 与三个算子的描述,可以最小化为以下步骤:
- 离线 step:在自家 Agent 的 memory dump 上跑一次论文开源的 classifier,得到每行的 type label(rule / log / tool_desc / knowledge)。
- 离线 step:固定 LLM compactor 与 prompt 模板,构造 baseline
summarize(all)与TypeCompact(classifier-aware)两个版本。 - 回归 step:跑 5 轮 compact,每轮后用精确匹配 + 规则模板(must / shall / never / 不得 / 禁止 / 一定要)抽取剩余规则字面,对比两组的安全规则保留率。
- 行为 step:挑 1–2 个高风险领域任务(医疗建议 / 金融合规 / 删库类),对两个版本各跑 N≥100 次,统计违规率。
第 3、4 步的指标就是论文 §3 行为基准的最小复现,可以先在内部 Agent 上拿到"我们的 Claude Code /compact 实际保留率"这条基线,再决定是否引入 Knowledge Triage。
关键术语速查
- Compaction Cliff:长跑 Agent 中"压缩多轮后安全规则断崖式丢失"的现象,本文命名。
- Knowledge Triage:把知识按类型分类、对每类施加不同 retention policy 的框架,本文提出。
- TypeCompact / TypeDecompose / TypeRetrieve:Knowledge Triage 的三个算子,分别对应原位改写、跨分区复制规则、外部存储 + 规则前置检索。
- AgentArtifactCorpus:396,934 个公开 GitHub 仓库的 Agent 配置集合,本文开源。
- Locality violation:同一规则在不同分区被解释为不同含义的现象,本文作为 TypeDecompose 的失败判据。
工程落地与核查(Jay)
落地核查清单
- [ ] classifier 下载方式未知:abstract 说"the classifier is open source"但未给链接;需查 PDF §X 或 GitHub README 获取 classifier 的训练数据格式、推理接口和精度报告。
- [ ] conservative_rewrite 的 modal 动词表:TypeCompact 中"禁止改写 modal 动词"(must / shall / never / 不得 / 禁止 / 一定要)是关键保真机制;但这个动词表是否覆盖中文 / 多语言 system prompt abstract 未确认;非英语规则的保真压缩需要自行扩展。
- [ ] TypeDecompose 的 partition 切分算法:当主题太大时,partition 的切分依据是什么?按工具 / 按时间段 / 按功能模块?论文未给;落地前需要自行设计 partition heuristic 并验证 locality violations。
- [ ] recall@50 = 100% 的检索实现:TypeRetrieve 的"规则 pin 前 + 细节按相关性召回"需要一个两阶段检索 pipeline(rule retriever + content retriever);abstract 未给出具体实现代码,需要查 PDF §X。
- [ ] AgentArtifactCorpus 的使用许可:396,934 个 GitHub 仓库配置用于训练 classifier;这些配置的许可(MIT / Apache 2 / GPL / 无明确许可)未确认;用于商业产品前需确认合规性。
已在正文覆盖的内容
- ✅ classifier 的行级分类粒度
- ✅
conservative_rewrite(block, fidelity=exact_on_modal)的保真级别 - ✅ "规则必须跨分区可见"的复制策略
- ✅ "先 recall 规则、再 recall 内容"的 retrieval 协议
- ✅ Compact 健康度的 4 步最小实现路径
坑位与常见误区
- TypeCompact 对中文 system prompt 失效:论文的 conservative_rewrite 针对英文 modal 动词(must / shall / never)设计;如果 system prompt 是中文,"必须 / 禁止 / 不得 / 绝对不能"等词的保真需要单独验证;建议先在中文 system prompt 上跑一遍保留率测试。
- compaction 轮次超过 5 轮后 TypeCompact 退化:论文最远测到 5 轮;实际长跑 Agent 可能跑 20–100 轮;需要验证 96% 保留率在更多轮次下是否维持;如果退化,需在每 N 轮后加一次"安全规则全量刷新"。
- classifier 的域偏移:AgentArtifactCorpus 全是公开 GitHub 仓库;如果自家 Agent 的 rule 写法和公开配置不同(更口语化 / 更结构化 / 更分散),classifier 的分类准确率可能低于论文报告值;建议用自家 memory dump 做一次 few-shot validation。
- TypeRetrieve 的 pin 机制在 token 预算紧张时被截断:如果上下文非常满(只剩 100 token),即使规则被 pin 在最前面也可能被截断;需要在 pipeline 里加一个"hard floor"——安全规则永远不被截断,即使牺牲其他内容。
立刻可测的 5 轮 Compact 健康度
不需要论文的 classifier,不需要 LongWoF-Bench,以下步骤可以直接在任意 Agent 上做:
- 取出自家 Agent 当前的 system prompt + memory dump。
- 跑一轮 LLM summarize(用自己现有的 compactor prompt)。
- 用正则
grep -E "must|shall|never|不得|禁止|必须|一定不能"提取压缩前后的 safety rule 字面。 - 对比保留率:保留率 < 80% → 说明 compaction 正在悄悄破坏安全规则;保留率 < 50% → 说明 Compaction Cliff 已经在自家 Agent 上发生。
- 把 system prompt 里的 safety rule 分离出来单独处理(不发到 summarizer),其余内容正常压缩——这是 0 classifier 的 TypeCompact 近似。
三分钟得到第一条基线。