Skip to content

8.1.3 为什么上下文里要去重、排序和压缩? ​

先给结论:因为模型真正能稳定利用的,不是“尽可能多的材料”,而是“顺序合理、信息不重复、噪声受控的证据组合”。去重、排序和压缩,正是在把粗糙候选变成高质量上下文。

很多人把这三个动作看成可选优化,但真实系统里,它们更接近:

  • 上下文构造的基本工序

如果少了这些工序,系统即使检索没问题,也容易在生成阶段失稳。

一、为什么要去重 ​

去重解决的核心问题是:

  • 不要让重复材料占掉上下文预算

检索结果里的重复非常常见,比如:

  • 相邻块有大量重叠
  • 同一条规则在 FAQ 和文档里都出现
  • 模板说明在多个页面重复出现

如果不去重,模型看到的上下文就会出现两个问题:

  • 真正新增的信息量不足
  • 某些内容因为重复出现,被模型误判为更重要

所以去重不是为了页面好看,而是为了:

  • 提高每一段上下文的有效信息密度

二、为什么要排序 ​

排序解决的核心问题是:

  • 让模型先看到最值得信、最值得用的证据

即使候选都很相关,它们之间仍然存在差别:

  • 有些是直接答案
  • 有些是背景解释
  • 有些是一般规则
  • 有些是例外条款
  • 有些是新版本
  • 有些是旧版本

如果排序不好,模型就可能先被背景带偏、先被旧版本影响、先抓住表面相似块。

所以排序不是展示层问题,而是:

  • 证据优先级控制问题

三、为什么要压缩 ​

压缩解决的核心问题是:

  • 在有限预算里保留高价值信息,减少无效负担

压缩不一定指“做摘要”,更广义地说,它包括:

  • 删除冗余句
  • 缩短背景说明
  • 只保留和当前问题强相关的片段
  • 把多个长块提炼成更短的证据组

它的作用不是为了让上下文看起来短,而是为了:

  • 在预算有限时,把最关键的信息留下来

这三者之间是什么关系 ​

可以把它们理解成三个连续动作:

  1. 去重:先去掉重复占位
  2. 排序:再决定谁更该靠前
  3. 压缩:最后把有限预算留给最值钱的信息

当然在具体系统里,这三步可能交错发生,但它们解决的问题是不同的:

  • 去重解决“别重复”
  • 排序解决“谁优先”
  • 压缩解决“怎么在有限预算里保留价值”

一个最小示意 ​

python
candidates = retrieve(query, top_k=20)
candidates = deduplicate(candidates)
candidates = rerank(query, candidates)
context = compress_for_prompt(candidates, max_tokens=2500)

这段代码想说明的是:

  • 最终上下文不是直接截取候选
  • 而是经过连续整理后的结果

如果这三步做不好,会出现什么现象 ​

去重做不好 ​

  • 上下文里同一意思反复出现
  • 回答啰嗦
  • 预算被浪费

排序做不好 ​

  • 模型抓错重点
  • 正确证据在里面,但回答还是偏
  • 新旧规则混用

压缩做不好 ​

  • 上下文过长,模型阅读负担变大
  • 关键证据被埋在大量背景中
  • 最终 Prompt 看起来信息很多,但真正有效信息密度很低

一个常见误区 ​

很多人会觉得:

  • 模型足够强,这些事情它自己会处理

这经常高估了模型在“噪声环境中的证据选择能力”。

模型当然能做一定程度的综合,但如果输入里本来就:

  • 重复很多
  • 顺序混乱
  • 背景压过证据

那它的工作难度会被明显放大。

更稳的做法不是把一堆乱材料交给模型“自行发挥”,而是先把材料整理成更合理的证据结构。

一句话总结 ​

上下文里要去重、排序和压缩,因为生成质量依赖的不只是材料数量,更依赖材料质量和组织方式。去重是在提高信息密度,排序是在控制证据优先级,压缩是在有限预算里保留高价值信息,这三步共同决定模型最终能不能稳地用好上下文。