Ch13 RAG修订于 二〇二六年七月六日
上下文压缩 (Context Compression)
概述
上下文压缩(Context Compression)是解决 LLM 上下文窗口限制和推理成本问题的关键技术。当需要处理大量文档、长对话历史或长代码文件时,直接输入全部内容可能超出模型的上下文窗口限制,或导致推理延迟过高、成本过高。上下文压缩通过智能地缩减输入内容,保留最相关信息,在尽量不损害回答质量的前提下减少输入 token 数量。
为什么需要上下文压缩
| 场景 | 输入长度 | 问题 | 压缩的必要性 |
|---|---|---|---|
| 多文档 RAG | 10+ 篇文档,每篇数千字 | 超出上下文窗口或成本过高 | 压缩到关键段落 |
| 长对话历史 | 数百轮对话 | 超出上下文窗口 | 保留关键对话节点 |
| 代码库理解 | 数十万行代码 | 远超上下文窗口 | 压缩到相关代码片段 |
| Agent 任务 | 多步推理的中间结果 | 累积上下文过长 | 压缩历史步骤 |
| 长文档摘要 | 数百页文档 | 超出上下文窗口 | 分段压缩再汇总 |
上下文压缩的方法分类
1. 基于摘要的压缩 (Summarization-based)
使用模型本身或小模型对内容进行摘要,保留关键信息:
| 方法 | 原理 | 压缩比 | 信息保真度 | 延迟 |
|---|---|---|---|---|
| Extractive Summarization | 从中提取关键句 | 3-10x | 高(原文保留) | 低 |
| Abstractive Summarization | 模型生成摘要 | 10-100x | 中(可能丢失细节) | 中 |
| Hierarchical Summarization | 分段摘要 -> 汇总 | 100-1000x | 中低 | 中 |
| Recursive Summarization | 递归摘要,适合超长文档 | 1000x+ | 低 | 高 |
2. 基于检索的压缩 (Retrieval-based)
只保留与当前查询最相关的部分:
| 方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 向量相似度过滤 | 计算每个 chunk 与 query 的相似度 | 快速,语义相关 | 可能遗漏上下文 |
| 关键词过滤 (BM25) | 基于关键词匹配 | 精确匹配好 | 无语义理解 |
| 混合过滤 | 向量 + 关键词 | 兼顾两者 | 实现复杂 |
| 上下文窗口滑动 | 保留最近 N 个 token | 简单 | 可能丢失重要早期信息 |
3. 基于提示压缩的压缩 (Prompt Compression)
对 prompt 本身进行压缩,去掉冗余信息:
| 方法 | 原理 | 代表工作 |
|---|---|---|
| Token 级剪枝 | 移除不重要的 token | LLMLingua, Selective Context |
| 句子级剪枝 | 移除不重要的句子 | LLMLingua-2 |
| 信息密度排序 | 按信息密度排序,保留高密度内容 | LongLLMLingua |
| 实体级压缩 | 保留关键实体及其关系 | RECOMP |
4. 基于缓存的压缩 (Cache-based)
利用 KV Cache 的压缩来减少内存占用:
| 方法 | 原理 | 代表工作 |
|---|---|---|
| KV Cache 淘汰 | 丢弃不重要的 token 的 KV | H2O, StreamingLLM |
| KV Cache 合并 | 合并相似 token 的 KV | CaM, PyramidKV |
| 跨层共享 | 相邻层共享 KV Cache | YOCO, CLA |
代表性方法对比
| 方法 | 类型 | 压缩粒度 | 压缩比 | 信息保真度 | 是否需要训练 | 开源 |
|---|---|---|---|---|---|---|
| LLMLingua | Token 剪枝 | Token 级 | 2-5x | 高 | 否 | 是 |
| LLMLingua-2 | Token 剪枝 | Token 级 | 2-5x | 高 | 是(小分类器) | 是 |
| LongLLMLingua | 句子 + Token | 句子级 + Token 级 | 5-20x | 中高 | 否 | 是 |
| Selective Context | 信息熵剪枝 | Token 级 | 2-3x | 中高 | 否 | 是 |
| RECOMP | 摘要 + 检索 | 文档级 | 5-50x | 中 | 是(压缩模型) | 是 |
| AutoCompressor | 摘要向量 | 段落级 | 10-100x | 中 | 是 | 是 |
| ICA (In-Context Autoencoder) | 摘要向量 | 段落级 | 10-100x | 中 | 是 | 是 |
| gzip / 传统压缩 | 无损压缩 | 字节级 | 2-4x | 100%(无损) | 否 | 是 |
LLMLingua 详解
LLMLingua 是 2023 年由微软提出的轻量级上下文压缩方法,无需训练:
核心思想
- 困惑度 (Perplexity):高困惑度的 token 信息量大,保留;低困惑度的 token 冗余,可丢弃
- 对比剪枝:计算 token 在”有上下文”和”无上下文”下的困惑度差异,差异大的 token 更重要
- 动态压缩比:根据输入长度和预算动态调整压缩比
工作流程
原始 Prompt
|
v
[1] 小模型计算每个 token 的困惑度
|
v
[2] 按困惑度排序,保留高困惑度 token
|
v
[3] 按压缩比截断,维持句子完整性
|
v
压缩后的 Prompt -> 送入 LLM
选择指南
| 场景 | 推荐方法 | 压缩比 | 原因 |
|---|---|---|---|
| RAG 多文档合并 | LongLLMLingua / 句子级剪枝 | 5-10x | 保留完整语义,去掉冗余段落 |
| 长对话历史 | 滑动窗口 + 摘要 | 3-5x | 保留最近对话 + 早期摘要 |
| 代码上下文 | 检索式压缩 | 10-100x | 只保留相关代码片段 |
| 超长文档 | 层次化摘要 | 100-1000x | 分段摘要再汇总 |
| 实时 Agent | LLMLingua | 2-3x | 低延迟,不改变语义 |
2026 年趋势
- LLM 原生压缩:利用 LLM 自身能力进行上下文压缩,质量更高
- 压缩-检索混合:压缩后建立索引,按需检索解压
- 自适应压缩:根据查询类型和上下文难度动态选择压缩策略
- 多模态上下文压缩:图像、视频、音频的上下文压缩技术
- 压缩与 KV Cache 的融合:上下文压缩直接作用于 KV Cache,减少内存和计算
相关笔记
- 长上下文 (Long Context) — 深度解析 - 长上下文的技术挑战与压缩的互补
- KV Cache (Key-Value 缓存) - KV Cache 压缩与上下文压缩的关系
- RAG (Retrieval-Augmented Generation) - RAG 中上下文压缩的应用
- Cross-Encoder (交叉编码器) - 重排序也是一种选择性压缩
来源
- Jiang et al. (2023) - “LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models”: https://arxiv.org/abs/2310.05736
- Pan et al. (2024) - “LLMLingua-2: Data Distillation for Efficient and Faithful Task-Agnostic Prompt Compression”: https://arxiv.org/abs/2403.12968
- Li et al. (2023) - “Selective Context: compressing the input of LLMs”: https://arxiv.org/abs/2310.06201
- Xu et al. (2023) - “RECOMP: Improving Retrieval-Augmented LMs with Compression and Selective Augmentation”: https://arxiv.org/abs/2310.04408
- Ge et al. (2023) - “In-context Autoencoder for Context Compression”: https://arxiv.org/abs/2307.06945