Skip to content

10.3.4 上下文太长时,有哪些常见压缩方法? ​

先给结论:上下文太长时,不是把模型上下文窗口开大就万事大吉。更稳的做法通常是先减少重复、保留关键证据、压缩冗余说明,再决定到底要不要继续扩上下文。

很多人一看到答案不完整,就会自然想到:

  • 那就多塞一点上下文

这个方向有时有效,但一旦过头,就很容易带来:

  • 成本上升
  • 延迟增加
  • 长上下文排序问题更明显
  • 模型对关键证据的利用反而变差

所以“上下文压缩”的目标不是为了省几个 token,而是为了让:

  • 真正关键的证据更容易被模型稳定使用

为什么上下文过长会伤害效果 ​

最常见的原因有三个:

  • 重复内容太多,稀释了关键信息
  • 无关或边缘相关材料占位,挤掉真正重要的证据
  • 关键信息虽然在上下文里,但位置和组织方式不利于模型使用

这说明问题很多时候不是:

  • 信息不够

而是:

  • 信息太杂

第一类常见压缩方法:去重和去相似 ​

这是最基础、也最常见的一类。

常见适用场景:

  • 相邻块 overlap 较大
  • 多路召回后结果高度重复
  • 不同文档里存在大量模板化相似说明

核心作用是:

  • 先把重复证据清掉

这样能让有限上下文预算留给真正新增的信息。

第二类常见压缩方法:块级筛选和保留关键句 ​

有些块本身很长,但真正有价值的可能只有几句。

常见适用场景:

  • 召回块偏大
  • 规则文档中关键条件集中在少数句子
  • 表格说明文档中只有部分字段和当前问题强相关

这类方法的核心是:

  • 不一定保留整块
  • 而是保留最关键的子内容

但这里要注意,压缩过度也可能把上下文关系切坏。

第三类常见压缩方法:文档级聚合和摘要 ​

当候选结果来自多个相似块时,有时更合适的做法是:

  • 先按文档或主题聚合
  • 再提炼出最 relevant 的部分

常见适用场景:

  • 多个 chunk 来自同一文档
  • 多文档答案需要归纳,但不能把所有段落原样塞进去

这类方法适合:

  • 先做结构整理
  • 再进入最终生成

第四类常见压缩方法:按任务类型做上下文模板化 ​

不同任务未必需要同一种上下文组织方式。

例如:

  • FAQ 问答可以更直接
  • 规则问答要优先保留条件和例外
  • 多文档综合题要保留来源边界

这意味着压缩有时候不只是“删减”,而是:

  • 重新组织

这种方式常常比单纯截短更有效。

第五类常见压缩方法:分阶段生成 ​

对于特别长、特别复杂的问题,有时不要试图一步把所有证据都直接喂给模型。更稳的方式可能是:

  • 先局部归纳
  • 再整体合成

这类方式更适合:

  • 长文档
  • 多文档综合
  • 跨文档比对

它本质上不是简单压缩,而是:

  • 把一次超长生成拆成多次较短处理

什么时候应该优先做压缩,而不是继续扩上下文 ​

如果你发现:

  • 上下文已经很长
  • 延迟和成本持续上升
  • 生成层开始漏关键条件
  • 候选中重复和噪声明显很多

这时通常更应该先做压缩,而不是继续塞更多内容。

什么时候压缩反而可能伤害效果 ​

也要注意一个边界:不是所有情况下都该 aggressively 压缩。

如果当前问题更像:

  • 关键证据本来就不完整
  • 检索层仍在漏召回
  • 多文档关系需要完整保留

这时压缩过头,可能会进一步损伤证据完整性。

一个最小压缩思路示意 ​

python
compression_plan = {
    "remove_duplicates_first": True,
    "keep_key_constraints": True,
    "group_by_document_or_topic": True,
    "avoid_over_compressing_evidence": True
}

这个示意想强调的是:

  • 压缩的第一目标是提纯
  • 不是机械删字

一句话总结 ​

上下文太长时,常见压缩方法包括去重、筛选关键句、文档级聚合、任务化重组和分阶段生成。压缩的核心不是让上下文更短,而是让关键证据更集中、更可用。