首页/AI/RAG 与向量库速查/上下文压缩与提取

上下文压缩与提取

把检索片段压缩成与问题相关的要点再进提示词:可用抽取式压缩(按句选取相关句)或 LLM 摘要压缩;目的是降低 token 消耗与噪声干扰,但要防止压缩过程丢失关键数字与条件。

RAG 与向量库速查AI更新于 2026-10-13

上下文压缩是什么

上下文压缩把检索到的片段先压成与问题相关的要点,再送进提示词:抽取式压缩按句打分只保留高相关句,摘要式压缩让模型重写成更短的表述。目的是降低 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 与顺序,否则引用无法回溯,用户点开也定位不到原句。
压缩比例要在评测集上确定:压得太狠会明显掉忠实度与完整性,压得太松则收益有限,建议按抽取句数占比记录效果曲线。

易错点

  • 压缩阈值过松导致关键整句被丢弃,答案缺条件
  • 压缩输出未保留来源 id,引用标注无法定位原文
  • 用摘要式压缩处理含数字与单位的条款,数值被改写后无人察觉
  • 压缩后未重跑评测,答案完整性下降却以为是模型问题

数据来源与参考

  • LangChain 官方文档(Contextual Compression)
  • LlamaIndex 官方文档(SentenceWindow / 节点后处理)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌