上下文压缩:摘要、滚动与层级

进阶03-上下文组织与窗口管理⏱ 30 分钟已审校
学习进度:

一句话定义

上下文压缩是在预算逼近上限时,用摘要、滚动淘汰和层级化存储把上下文的"信息密度"提上来——丢长度不丢决策所需的信息。

为什么重要

长对话、长会话 Agent、持续运行的服务都会撞上 上下文窗口与注意力预算 的预算墙。不压缩的后果是截断(早期关键约定丢失)或成本失控;乱压缩的后果是"压缩性失忆"(关键细节被摘要抹掉后反复犯错)。压缩是把会话从"能聊"变成"能长期运行"的必需工程,也是 记忆与状态:会话内记忆、外部记忆与状态注入 记忆系统的执行层。

前置知识

直观类比

像会议纪要的三级归档:最近一次会议有完整录音(原文),上季度只有纪要(摘要),更早的只剩决议台账(状态区)。需要时按层取用——公司不会因为归档了录音就"忘记"决议。

图示

时间 →
原文轮次: [1][2][3][4][5][6][7][8]...
层级视图:
  远期(极简状态):用户目标=退款;单号A10293;已承诺补偿券
  中期(摘要):    第3~6轮:确认签收时间,争议运费,达成部分退款共识
  近期(原文):    第7~8轮原文
  ← 水位超 70% 触发:最旧原文 → 摘要上移

核心概念

  • 滚动窗口(Sliding Window):只保留最近 N 轮,更早的直接丢弃。最简单,但会失忆。
  • 摘要压缩(Summarization):用模型把旧轮次压缩成结构化摘要替换原文。
  • 分层压缩(Hierarchical):保留"近期原文 + 中期摘要 + 远期极简状态"三层,随时间推移内容逐层上移压缩。
  • 压缩判据:决定"什么必须保留"的显式清单——用户目标、关键决定、未完成任务、重要实体(人名/单号/承诺)、约束规则。
  • 失忆检测:压缩后用探针问题验证关键信息是否仍可召回。

原理与机制

压缩的信息论视角:原文 token 里混合了"决策相关"与"可再生成/可丢弃"内容,压缩 = 提高单位 token 的决策相关信息占比。工程机制:

  1. 压缩提示必须带保留判据:让模型"按以下清单保留……"而不是"总结一下"——后者必然丢失结构化细节(数字、单号);
  2. 关键实体外置:单号、金额、日期这类不可损耗信息不要依赖摘要,直接以结构化字段存在"状态区",摘要只负责叙事(与 记忆与状态:会话内记忆、外部记忆与状态注入 的状态注入同构);
  3. 压缩本身要被测试:用评估集测"压缩后关键事实保留率",摘要模型也会出错(用 自动评估与 LLM-as-Judge 的思路抽验);
  4. 触发与节流:按预算水位(如 >70%)触发,避免每轮都压缩造成延迟与成本波动。

公式或模型

压缩预算模型:设当前占用 C,上限 W,触发水位 α(如 0.7)。当 C > αW 时,把最旧的 k 轮原文(合计 t<sub>old</sub> token)替换为摘要(目标 ≈ t<sub>old</sub> × r,压缩比 r 常取 0.1~0.3),使压缩后 C′ ≤ βW(β 如 0.5),留出增长空间。核心约束:保留判据清单的命中项目不计入可压缩范围。

实例或案例

案例:客服长会话的滚动压缩。 症状:30 轮后成本翻倍且模型忘记第 3 轮承诺的补偿。操作步骤:① 状态区固定保留:{用户目标, 订单号, 已承诺事项, 待办}(程序维护,不进摘要);② 第 2~24 轮压缩为一段摘要,提示明确列出保留判据;③ 最近 5 轮保留原文;④ 压缩后跑 3 个探针问题("用户订单号?""答应过什么?")验证保留率。压缩提示模板:

将以下对话压缩为一段摘要(≤300 字),必须保留:
① 用户的核心目标与最终诉求;② 出现的所有单号/金额/日期;
③ 已做出的承诺与决定;④ 未解决的问题。
不要保留:寒暄、重复表述、与目标无关的闲聊。
对话:{旧轮次}

排错清单:

  • 症状:压缩后反复询问用户已给过的信息 → 关键实体没进状态区,被摘要抹掉;把实体抽取外置;
  • 症状:摘要越压越长 → 压缩在摘要之上再压,改为"摘要重建"(用状态区+最近轮重建摘要)而不是链式压缩;
  • 症状:压缩时机太晚已截断 → 降低触发水位,压缩成本远低于失忆代价。

常见误区

  • 摘要 = 万能压缩:默认摘要会丢失数字与专有名词,凡不可丢的信息必须结构化外置;
  • 链式摘要(摘要的摘要的摘要):误差逐层放大;正确做法是保留状态区 + 用原文重建摘要;
  • 压缩后不验证:失忆是静默故障,必须用探针问题定期体检。

自测题

  1. 为什么单号、金额不能依赖摘要保留?

答:摘要是叙事性重写,数字与专名最易失真;不可丢信息应结构化存状态区,摘要只管叙事。

  1. 链式摘要的风险与替代方案?

答:逐层误差放大、内容漂移;替代是保留状态区 + 必要时用近原文重建摘要。

  1. 如何验证一次压缩没有造成失忆?

答:压缩前预设探针问题(关键事实清单),压缩后逐项提问验证保留率。

与其他知识点的关系

记忆与状态:会话内记忆、外部记忆与状态注入 的记忆系统以压缩为执行层;任务分解与规划提示 的 Map-Reduce 是一次性任务的"离线压缩"变体;压缩质量评估可复用 自动评估与 LLM-as-Judge 的 LLM-as-Judge。

延伸阅读

  • 综述:The Prompt Report(Schulhoff et al., 2024)——长上下文管理技法的归类。

来源

  • The Prompt Report: A Systematic Survey of Prompting Techniques (Schulhoff et al.
  • 2024)