上下文压缩是什么
上下文压缩把检索到的片段先压成与问题相关的要点,再送进提示词:抽取式压缩按句打分只保留高相关句,摘要式压缩让模型重写成更短的表述。目的是降低 token 消耗、减少无关内容对生成的干扰,同时给关键片段腾出上下文预算。代价是压缩过程可能丢掉数字、单位与限定条件,所以压缩后必须保留片段标识与顺序。
基本信息
| 两类做法 | 抽取式(选句保留原文)、摘要式(模型重写) |
|---|---|
| 常用组件 | 交叉编码器给句子打分;LangChain 的上下文压缩模块 |
| 收益 | token 下降、噪声减少、生成更聚焦 |
| 主要风险 | 关键数字与限定条件在压缩中丢失 |
典型使用场景
- 上下文预算吃紧:候选片段多、模型窗口有限,压缩比丢片段更划算
- 噪声多的语料:页面导航、页脚、免责声明混在正文里,抽取后噪声明显减少
- 延迟敏感:输入 token 变短,首 token 时间与总耗时同步下降
- 成本控制:按 token 计费时压缩直接反映在账单上
- 引用场景:压缩后仍保留片段编号,回答里的引用依然可回溯
抽取式压缩示意
抽取式压缩示意
from sentence_transformers import CrossEncoder
scorer = CrossEncoder("BAAI/bge-reranker-base") # 用重排模型给句子打分
sentences = split_sentences(chunk.text) # 先按句切开
pairs = [(query, s) for s in sentences]
scores = scorer.predict(pairs) # 每句一个相关分
keep = [s for s, sc in zip(sentences, scores) if sc >= THRESHOLD]
compressed = " ".join(keep) # 保持原句顺序再拼接
压缩方式对比
| 方式 | 做法 | 风险 |
|---|---|---|
| 抽取式按句打分 | 用重排模型给每句打分,保留高分句 | 阈值过松会整句丢弃关键条件 |
| 摘要式重写 | 让模型压缩成要点 | 可能改写数字、单位与否定词 |
| 按片段截断 | 只保留片段开头若干 token | 后半部分信息直接丢失 |
| 不做压缩改重排 | 提升候选质量而不是压缩 | token 消耗不降,只减少噪声 |
压缩后仍要让生成模型引用原文页码或段落时,必须保留片段 id 与顺序,否则引用无法回溯,用户点开也定位不到原句。
压缩比例要在评测集上确定:压得太狠会明显掉忠实度与完整性,压得太松则收益有限,建议按抽取句数占比记录效果曲线。