输入上下文压缩
送进模型前如何削减 token 数又不丢关键信息
核心要点:
- 在前向传播之前删输入 token,直接降 prefill 的 $O(n^2)$ 成本
- 硬压缩:按困惑度/自信息删原文 token(LLMLingua 系列)
- 软压缩:把上下文编码成少量向量(Gist / ICAE / xRAG)
- 与 KV 压缩正交:一个压输入长度,一个压已存 KV
- 最受益场景:RAG 长文档、few-shot、长 system prompt
本文讲输入侧的 token 削减——在 prompt 进入模型前就把它变短。这区别于本章其他三种"压缩",边界见下表。
与其他"压缩"的区分:
- 注意力变体(稀疏/线性/SSM)改的是 attention 的计算复杂度 → 04-注意力机制变体
- 架构层 KV 压缩(GQA/MQA/MLA)改的是每 token 的 KV 体积 → 05-KVCache 架构压缩
- 推理层 KV 管理(量化/驱逐/offload)压的是已生成的 KV → 07-推理 - KV 管理
- 本文:压的是输入 token 数本身,模型结构和 KV 机制都不动
为什么在输入侧压缩?
输入 token 数是 prefill 成本的直接自变量,砍输入比优化算/存更先一步。 attention 的 prefill 计算量随序列长度 $n$ 呈 $O(n^2)$,KV 显存随 $n$ 线性增长(详见 02-第一性挑战)。把 $n$ 压到 $n'$,prefill 计算、KV 显存、API 按 token 计费三项同时下降,且对模型完全透明——不需要改权重、不需要换 attention 实现。
代价是多一道压缩开销 + 信息损失风险:压缩本身要花算力(用代理模型或编码器),删错 token 会丢关键信息。所以这类方法的核心权衡是压缩比 vs 信息保留 vs 压缩开销三者的平衡。
输入压缩分两条路线:保留原文 token 子集的硬压缩,和编码成连续向量的软压缩。
硬压缩:删 token,留下的还是原文
硬压缩(hard / extractive)给每个输入单元打信息量分,删低分单元,产物仍是可读的 token 子序列,任何 LLM 直接接收。 打分依据是自信息(self-information,$-\log P(x)$)或困惑度(perplexity)——自信息低(即可预测)的 token 删掉对语义影响小。
| 方法 | 打分机制 | 压缩比 | 性能(压缩比/损失) | 速度 |
|---|---|---|---|---|
| Selective Context[1] | 自信息,phrase 粒度,LLaMA-7B/GPT-3 Curie 打分 | ~2× | BERTScore -0.023 | 46 ms/段 |
| LLMLingua[2] | 困惑度,粗-细两级迭代 + budget controller | 最高 20× | GSM8K 20× 损 1.5pp;BBH 7× 损 13pp | 端到端 1.7-5.7× 加速 |
| LongLLMLingua[3] | question-aware 双阶段困惑度 $P(\text{doc}\mid\text{question})$ + 文档重排 | 4×(RAG) | NaturalQuestions +21.4%;LooGLE cost -94% | 计算量约 LLMLingua 的 2× |
| LLMLingua-2[4] | 判别式 encoder(XLM-RoBERTa)token 二分类,GPT-4 蒸馏标签 | ~14× | GSM8K 13× 损 1.1pp | 压缩快 3-6×,端到端 1.6-2.9× |
@tbl-longctx-compress-hard 硬压缩方法对比:打分机制、压缩比、性能、速度
三个演进要点:
- LLMLingua 是这族的奠基工作[2]:困惑度驱动的迭代压缩,配 budget controller 分配压缩预算。高压缩比下优于纯自信息的 Selective Context,但 CoT 类任务(GSM8K)比 BBH 类更耐压缩。
- LongLLMLingua 是 RAG 专项增强[3]:用 $P(\text{doc}\mid\text{question})$ 的 question-aware 困惑度替代无条件困惑度。NaturalQuestions 4× 压缩下性能不降反升 21.4%——因为删掉无关文档反而减少了干扰。
- LLMLingua-2 换了打分架构[4]:抛弃生成式困惑度,改用双向 encoder 做 token 二分类(标签由 GPT-4 蒸馏)。encoder 远快于 LLaMA-7B,压缩速度提升 3-6×,代价是最高压缩比受限(~14×)。适合对延迟敏感的生产 pipeline。
抽取式片段筛选是更粗的硬压缩。RECOMP[5] 分 extractive(选相关句子)和 abstractive(生成式摘要)两类,可把文档压到 6-28% token 保留而性能与全文相当,常作 token 级压缩前的粗筛。其中 abstractive(以 RECOMP-abstractive 为代表)用小模型生成摘要替代原文片段,压缩更激进,代价是摘要可能偏离原文(faithfulness 风险)。
软压缩:把上下文编码成少量向量
软压缩(soft / latent)训练一个编码器把上下文映射成少量连续向量,后续推理只条件化这些向量,不再重读原文。 压缩比远高于硬压缩,但产物是与压缩模型绑定的稠密向量,不可读、跨模型迁移成本高,且都需要训练。
| 方法 | 机制 | 压缩比 | 需训练 | 性能 |
|---|---|---|---|---|
| Gist Tokens[6] | 改 attention mask,把 prompt 压进 1-10 个 gist token 的 KV | 最高 26× | 是(instruction FT) | FLOPs -40%;1-token 版 win rate ~46-52% |
| AutoCompressor[7] | 分段,每段输出 50 个 summary vector,累积拼接 | 40:1/段 | 是(无监督 LM) | 长序列下 perplexity 持续下降 |
| ICAE[8] | LoRA encoder 压 ≤512 token 到 32-256 memory slot,冻结解码 | 4-16× | 是(LoRA) | 4× 时 PPL +0.49;win+tie 79.2%;2.2-3.6× 加速 |
| xRAG[9] | 复用检索的 document embedding,MLP bridge 映射成 1 个 token | ~175:1 | 是(bridge,<0.5% 参数) | Mixtral 6 任务均分 +9.7%(全文 RAG +8.0%);GFLOPs -3.53× |
@tbl-longctx-compress-soft 软压缩方法对比:机制、压缩比、是否需训练、性能
关键差异在压缩粒度和绑定程度:
- Gist Tokens[6] 在 instruction 微调时改 attention mask,强迫模型把固定 prompt 压进少数 gist token 的 KV 激活。适合重复使用的固定 prompt,但每 token KV 激活约 1 MB,不适合大语料库存储。
- AutoCompressor[7] 把长文档分段,每段产出固定数量 summary vector 并累积传递,用无监督 LM 目标训练,长上下文 perplexity 持续下降。
- ICAE[8] 用轻量 LoRA encoder 压缩、冻结的 LLM 解码,4× 压缩下 perplexity 仅退化 0.49。
- xRAG[9] 走极端:直接复用稠密检索已有的 document embedding,只训一个 <0.5% 参数的 MLP bridge 把它映射成单个 token,实现约 175:1 压缩,弱项是多步推理任务。
硬压缩、软压缩怎么选?和 KV 压缩是一回事吗?
输入压缩沿三个正交维度分类,且与 KV 压缩作用在不同阶段、可叠加。
分类维度:
- 产物形态:硬压缩(离散 token,任意模型可接收)vs 软压缩(连续向量,与压缩模型绑定)。
- 任务条件:task-aware(以 query 为条件打分,如 LongLLMLingua/RECOMP)vs task-agnostic(纯信息熵或通用蒸馏,如 LLMLingua-2/Selective Context)。task-aware 压缩比更高但需按任务调整。
- 粒度:token 级(LLMLingua 系列)/ 句子级 extractive(RECOMP)/ 生成式 abstractive。
与 KV 压缩的边界是常见混淆点,二者作用阶段不同:
| 维度 | 输入上下文压缩(本文) | KV cache 压缩(05/07) |
|---|---|---|
| 作用阶段 | 前向传播之前 | 前向传播之中/之后 |
| 压什么 | 输入 token 数 $n \to n'$ | 已生成的 K/V 张量 |
| 降什么 | prefill 的 $O(n^2)$ 计算 + 输入计费 | decode 的显存与带宽 |
| 对模型 | 完全透明(硬压缩) | 改架构(GQA/MLA)或改管理(量化/驱逐) |
@tbl-longctx-compress-vs-kv 输入压缩与 KV 压缩的边界对比
两者正交,可叠加:先用输入压缩把 prompt 砍短,再对剩余 token 的 KV 做量化或驱逐。
什么场景用、代价是什么?
最受益的是输入里有大量低信息量内容的场景——RAG 检索结果、few-shot 示例、长 system prompt。
| 场景 | 代表方法与收益 |
|---|---|
| RAG 长文档 | LongLLMLingua[3] NaturalQuestions 4× 压缩 +21.4 EM、LooGLE cost -94%;RECOMP-Abstractive[5] 压到 4% token 而 PPL 几乎不变;xRAG[9] 175:1 |
| 长文档 QA | Selective Context[1] 削 50% token,BERTScore 仅降 0.023 |
| Few-shot / ICL | AutoCompressor[7] 把示例转 soft vector,准确率持平或升;LLMLingua-2[4] 2-5× 压缩带来 1.6-2.9× 端到端加速 |
@tbl-longctx-compress-usecase 输入压缩的典型场景与收益
代价有三类:
- 压缩计算开销:硬压缩要跑代理模型/encoder 打分,软压缩要训练编码器;压缩本身的延迟需计入端到端。
- 信息损失:高压缩比下硬压缩可能删掉关键 token(如 BBH 7× 压缩损 13pp),不适合需要精确回忆全文的任务。
- 绑定与迁移:task-aware 硬压缩需按任务调整;软压缩产物与压缩模型强绑定,换目标模型要重训。
Takeaway
| 知识点 | 核心结论 |
|---|---|
| 定位 | 在前向传播前删输入 token,直接降 prefill $O(n^2)$ 与输入计费 |
| 硬压缩 | 按困惑度/自信息删原文 token,产物可读、任意模型可接收(LLMLingua 系列、Selective Context) |
| 软压缩 | 训练编码器把上下文压成少量向量,压缩比高但与模型绑定(Gist/AutoCompressor/ICAE/xRAG) |
| task-aware | 以 query 为条件打分(LongLLMLingua)压缩比更高,RAG 场景甚至提升性能 |
| 与 KV 压缩 | 正交:输入压缩压"输入长度",KV 压缩压"已存 KV",可叠加 |
| 最佳场景 | RAG 长文档、few-shot、长 system prompt 等低信息密度输入 |
| 主要代价 | 压缩开销 + 高压缩比下的信息损失 + 软压缩的跨模型迁移成本 |
@tbl-longctx-compress-takeaway 全文要点
参考资料
- Li et al., Compressing Context to Enhance Inference Efficiency of Large Language Models (Selective Context), EMNLP 2023. https://arxiv.org/abs/2310.06201 自信息驱动的 phrase 粒度 token 删除,2× 压缩、BERTScore 降 0.023。
- Jiang et al., LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models, EMNLP 2023. https://arxiv.org/abs/2310.05736 困惑度驱动的粗-细两级压缩 + budget controller,最高 20× 压缩。
- Jiang et al., LongLLMLingua: Accelerating and Enhancing LLMs in Long Context Scenarios via Prompt Compression, ACL 2024. https://arxiv.org/abs/2310.06839 question-aware 双阶段压缩 + 文档重排,NQ 4× 压缩 +21.4%。
- Pan et al., LLMLingua-2: Data Distillation for Efficient and Faithful Task-Agnostic Prompt Compression, ACL 2024 Findings. https://arxiv.org/abs/2403.12968 判别式 encoder token 二分类,压缩速度提升 3-6×。
- Xu et al., RECOMP: Improving Retrieval-Augmented LMs with Compression and Selective Augmentation, ICLR 2024. https://arxiv.org/abs/2310.04408 extractive 与 abstractive 两类 RAG 压缩器,6-28% token 保留。
- Mu et al., Learning to Compress Prompts with Gist Tokens, NeurIPS 2023. https://arxiv.org/abs/2304.08467 改 attention mask 把 prompt 压进 1-10 个 gist token,最高 26× 压缩、FLOPs -40%。
- Chevalier et al., Adapting Language Models to Compress Contexts (AutoCompressor), EMNLP 2023. https://arxiv.org/abs/2305.14788 每段 50 个 summary vector 累积拼接,40:1 压缩。
- Ge et al., In-Context Autoencoder for Context Compression in a Large Language Model (ICAE), ICLR 2024. https://arxiv.org/abs/2307.06945 LoRA encoder 压到 32-256 memory slot,4× 压缩 PPL +0.49、2.2-3.6× 加速。
- Cheng et al., xRAG: Extreme Context Compression for Retrieval-augmented Generation with One Token, NeurIPS 2024. https://arxiv.org/abs/2405.13792 复用检索 embedding + MLP bridge 压成单 token,~175:1 压缩、GFLOPs -3.53×。