跳到主要内容
SecondHome

上下文压缩:留下什么,扔掉什么

9 分钟进阶2aL3 p.46-51 ↗录像 ↗支撑材料 4 篇

压缩听起来是 agent 工程里最没技术含量的一环——「总结一下再继续」,一句提示词就能跑。真正难的从来不是写摘要,而是三个更硬的问题:什么信息绝不能进摘要、什么扔了之后还找得回来、连续压缩几十次之后状态还会不会走样。本篇用三性质、五分法、四步策略把这三个问题拆成可执行的设计,再接上 LLMLingua 的学术线与 Claude Code 的工业线,看清一次好的压缩到底在设计什么。

翻完 24K 行日志,定位到报错 "address already in use",这是课程里一个编码 agent 排查 CI 超时的案例(L3 p.46)。根因是测试并发抢端口,本地用 --workers=1 验证通过,下一步开 PR。

此刻上下文里躺着 24K 行日志原文、若干被推翻的猜测、几条成功的复现命令。全塞给下一轮,注意力被日志淹没;随手总结成一段自然语言,关键事实又开始漏。

长程任务里最先出事的偏偏是压缩。「压缩是设计问题,不是摘要问题」。开篇摘要问过的三个更硬的问题,本篇一一作答,先立三条性质,再用五分法处置历史,最后对付漂移。

「朴素摘要」缺什么:一个案例与三条性质

slides 把这件事形式化(L3 p.47):完整历史 H_t 经压缩器 C(·; B) 变成工作状态 ŝ_t,一次合格的压缩要同时满足三条性质:

  1. 行为保真(behavioral fidelity):p(A_future | H_t) ≈ p(A_future | ŝ_t)。拿摘要的 agent 与拿全史的 agent,接下来的动作分布应当几乎一样;
  2. 有界表示(bounded representation):|ŝ_t| ≤ B。历史涨到多大,工作状态都被钉死在预算内;
  3. 可恢复性(recoverability):保留精确锚点,也就是文件名、ID、路径这类内容,以及指向源证据的指针。细节被扔掉,但扔掉的知道去哪找回来。

朴素摘要通常只满足有界这一条。对照同一案例的两种压法:

「我们调试 CI 超时很久,翻了很多日志,发现好像是并发的问题,后来用单进程跑通了,准备提交。」目标模糊,根因停留在猜测,证据没有指针;再压缩一次,那个「好像」就会被固化成定论。

GOAL: 修复 CI 超时(方案已验证:—workers=1) CAUSE: 测试并发抢端口,日志报 “address already in use” VERIFIED: —workers=1 本地跑通 EVIDENCE: 3 个失败构建的日志工件路径 + 定位命令 NEXT: 开 PR 提交修复

行为保真还给了一个自检口径:别问摘要像不像原文,问拿着摘要做下一步的人会不会做出同样的决定。

结构化检查点胜出的原因也在这里。它保住的是决策依赖,文笔无关紧要。

五分法:给每一段历史一个处置决定

压缩不是在留和扔之间二选一。slides 把历史切成五层,各配一种处置(L3 p.48):

两层逐字保留,位置和理由各不相同。锚点保护的是任务不变量,也就是目标和约束:它们短,在开头附近,一个字都不能改。近期尾部保护的是模型正在进行的思路,当前尝试与新鲜结果被腰斩,agent 会原地重做刚做完的事。

ENCODE 是唯一有损但结构化的层,把决策、进展、ID 摘成检查点。

EXTERNALIZE 这一层不删信息,把证据搬出上下文:24K 行日志压成 3 个失败、命令与工件路径的清单,正文留在磁盘,上下文里只放指针。DISCARD 才是真正的丢弃,重复输出、被取代的尝试都归这里,它们对未来动作分布几乎没有贡献。

这五层的列举顺序就是实现顺序:先圈出绝不能动的,再决定什么进检查点,最后才轮到扔。多数坏压缩坏在把顺序做反了,先定删多少,再想留下了什么。

压缩是策略不是动作:四步与漂移

一次性压缩之上还有一层策略。slides 对照了 Codex、OpenCode、Pi、Hermes、OpenHands 五个实现的做法,整理成四步(L3 p.49):

步骤回答的问题要点
Trigger 触发什么时候压token 阈值、provider 溢出报错、手动触发、为下一轮输出留余量
Select 选择压哪一段保护开头、压旧区、留尾部;只在合法的轮次 / 工具调用边界下刀
Replace 替换换成什么可读摘要、结构化检查点、provider 不透明压缩项、或全新上下文
Recover 恢复压坏了怎么办保留可搜索的原始历史、重试或重置、预先定义失败行为

两个细节最容易被跳过。Select 讲边界:切在一条消息中间,模型看到的是残缺的工具调用与观测;切在轮次边界,每段历史至少是完整的叙事单元。

Recover 则是承认压缩必然丢信息。证据找不回时该重试、重置还是降级提问,要事先定义,不能等出了错现场发挥。

更难的在时间维度。agent 一跑几小时,压缩会连续发生几十次,而每次压缩的输入里都包含上一次压缩的产物:ŝ_{k+1} = C(ŝ_k ⊕ R_k),检查点被反复再摘要。

slides 在 L3 p.50 给了漂移(drift)的例子:某轮上下文写着 Use CUDA 12.4;一次压缩后,版本号缩成 12.x;再一次,只剩「用较新的 CUDA」;几轮之后版本约束彻底丢失,agent 按模糊建议装了不匹配的环境。每一步压缩单看都算合理,串起来却把硬约束磨成了软建议。

对策就是五分法:

  • 锚点层:约束逐字复制,绝不进摘要。
  • 近期尾部:保留,给回看上一轮原话留余地。
  • 回源取证:关键事实到磁盘上的原始历史里找回原文,不信任第 k 手摘要。ReSum 把周期性摘要做成了显式机制:定期调摘要工具把历史压成 summary,再从压缩态续跑。
漂移的隐蔽性:单步无错,序列成灾

每一次压缩单独看都大体满足三性质,确实有界,也大体保真。漂移只在序列上显形:误差随压缩次数复利累积。所以评测压缩不能只测一次,L3 p.51 的四维评测专门包含这一条:状态召回、任务成功、效率、稳定性,其中稳定性指的就是多次压缩后的表现。

压缩的信息选择面:token 粒度与工程粒度

学术线把留什么做到了 token 粒度。LLMLingua(EMNLP 2023)用小语言模型给 token 打困惑度(perplexity)分,在预算内丢掉低信息 token,最高 20 倍压缩、多项任务损失很小。

LongLLMLingua(ACL 2024)面向长上下文问答,NQ 最高提升 21.4%,LooGLE 基准成本降 94%。LLMLingua-2 改成 token 分类、用小模型蒸馏,比上一代快 3-6 倍。

三代丢的都是可预测的低信息 token。

工业线的 Claude Code 给出了一份 what-survives 清单:系统提示、CLAUDE.md、从磁盘重注入的 auto memory 与 plan、最近访问的文件。对照五分法,保住的是锚点和近期尾部两层。

/compact 支持 focus on … 指定主题,等于手动改 Select。auto-compact 阈值可配置,原生 1M 窗口默认约 967K 触发,留出的余量就是 Trigger 里为下一轮输出留余量那条。

Anthropic 工程博客另给三个可抄的手法:

  • 摘要附文件:压缩摘要附上最近 5 个文件。
  • NOTES.md:用结构化 NOTES.md 承载跨轮状态。
  • 子代理摘要:子代理把数万 token 的工作压成 1-2k 摘要返回主上下文。

压缩还会毁前缀缓存。清空历史意味着前缀变化,下一轮全价重算,所以 Trigger 的时机同时是成本决策。缓存安全的 fork 方案,在同讲谈前缀缓存的那篇详解里另有拆解。

与本讲的连接

伴读把上下文管理分成三条路,本篇下钻的是压缩这一路的内部结构。伴读给过时机权衡:压得太勤丢信息,压得太懒成本先爆;本篇补上的是压缩本身的设计面。

  • 三性质定义什么叫压得好;
  • 五分法定义具体怎么压;
  • 四步与漂移定义怎么长期压不坏。

下次你的 agent 连跑几小时后开始 “自信地记错”,先别怪模型,翻出它的检查点看看,版本约束是不是还待在锚点层。

本节论文与规范

本节资料

  • 「上下文工程」的定义性文本:在推理期间为模型策划最优的 token 数据集。点名 context rot——问题往往不是窗口不够,而是塞得越满注意力稀释越强(近似 n² 稀释)。药方是及时压缩、把结构化笔记落盘(1,234 步的宝可梦实验全靠笔记找回目标)、用子代理把数万 token 上下文蒸馏成 1-2k 摘要。本讲的世界观来源。

  • Claude Code 官方对上下文窗口与压缩的权威说明:/compact 之后会保留什么——系统提示重新注入、CLAUDE.md 重读、活动 plan 重注入、最近浏览过的文件拉回上下文;/compact 后可以跟自然语言指定压缩重点;自动压缩的触发阈值也可配置。想理解「压缩到底丢了什么、留下什么」,这是最直接的一手资料。

  • Anthropic 工程师复盘 compaction 的缓存安全实现:压缩天然破坏 prompt cache,他们的做法是尽量复用父对话前缀、只在末尾追加压缩指令,并给约 20k token 的摘要预留 buffer,让压缩后仍能命中缓存;再把缓存命中率当 uptime 级别的监控指标。压缩与缓存必须一起设计,这是最好的工程案例。

  • 提示压缩的代表家族:LLMLingua(2310.05736)用小模型做预算控制器加 token 级迭代压缩,最高压到 1/20;LongLLMLingua(2310.06839)面向长上下文,NaturalQuestions 提升 21.4% 的同时成本降 94%;LLMLingua-2(2403.12968)改用蒸馏数据训练压缩器,快 3-6 倍。本讲「有损压缩」路线的技术底座。

AI 生成 · 仅供参考,与课程方无关。选中正文里的任何一段也能直接问我(解释一下 / 举个例子)。

本详解以 CMU 11-768 AI Agents (Fall 2026) 课程大纲为参考框架独立撰写,AI 辅助起草、人工抽审。 涉及的官方课件、论文与课程材料版权归原所有方,讲义为站内镜像、其余外链原文出处; 观点与文字(除标注引用外)为作者原创。