Prompt Compression
提示压缩通过删除信息量低的词元或紧凑地编码上下文来缩短 LLM 输入,从而降低成本和延迟,同时保留答案质量。
提示压缩会缩短输入大型语言模型 (LLM)的内容,同时保留模型回答问题所需的信息,因此请求使用的token更少、运行更快,也更容易放入上下文窗口。方法包括用小型语言模型删除可预测的词、总结冗长的历史记录,以及训练紧凑的学习型 token 来代替整段内容。提示较长且频繁发送时,压缩尤其有用,例如会插入许多检索文档的检索增强生成 (RAG)流水线、历史记录会随每一步增长的AI 代理,以及包含长指令和示例的应用。服务提供商按输入 token 计费,而注意力计算量会随输入长度增长,因此将提示压缩一半,大致可以将输入成本减半并降低推理延迟。
提示压缩的工作原理#
硬提示压缩会将文本转换为更短的文本,任何 LLM(包括闭源 API 模型)都能读取。大多数方法会使用小型语言模型为每个 token 评分,并删除模型认为容易预测的 token,因为这些 token 携带的信息最少。Selective Context 将这一思路应用于词语和短语;Microsoft 的 LLMLingua则增加了预算控制器,为指令、示例和问题分配不同的压缩比例,并进行迭代式 token 级裁剪,在性能损失很小的情况下实现最高 20 倍压缩。LLMLingua-2将压缩重新表述为 token 分类任务,使用 XLM-RoBERTa 等双向编码器,并在从更大型 LLM 蒸馏得到的压缩示例上训练;其运行速度比早期方法快 3 到 6 倍,在 2 到 5 倍压缩时可将端到端延迟加速 1.6 到 2.9 倍。抽象式方法则让模型对上下文进行总结,压缩程度更高,但可能会丢掉回答问题所需的细节。
软提示压缩会将文本转换为少量学习得到的嵌入,让模型读取这些嵌入而不是原始 token。Gist token训练 LLaMA-7B 和 FLAN-T5-XXL,将指令压缩为少量特殊 token,实现最高 26 倍压缩,并最多减少 40% 的 FLOPs。这些方法需要访问模型权重,因此适用于开放模型。
token 级压缩的核心只需几行 PyTorch代码即可实现。此示例使用来自 Hugging Face Transformers的 1.24 亿参数 GPT-2,计算每个 token 的自信息量,即根据它之前的所有内容计算出的 token 概率的负对数,并保留其中更令人意外的一半:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
prompt = (
"The quarterly maintenance report states that, as of the end of the quarter, a total of three conveyor "
"belts on line 4 were found to have worn bearings, and all of them were replaced on March 12 by the night shift."
)
ids = tokenizer(prompt, return_tensors="pt").input_ids[0]
# Self-information of each token, -log p(token | preceding tokens), under a small language model
with torch.no_grad():
logits = model(ids[None]).logits[0, :-1]
info = -logits.log_softmax(-1).gather(1, ids[1:, None]).squeeze(1)
# Keep the first token and the more surprising half of the rest, in their original order
keep = torch.cat([torch.tensor([True]), info > info.median()])
compressed = tokenizer.decode(ids[keep])
print(f"{len(ids)} -> {keep.sum().item()} tokens: {compressed}")它会打印 46 -> 23 tokens: The quarterly maintenance report states, a three convey on line 4 found worn bearings all replaced on March 12 by night shift。事实得以保留,包括第 4 行、磨损的轴承、3 月 12 日和夜班,而“截至本季度末”等可预测的填充内容则被删除。由“conveyor belts”裁剪后剩下的片段“convey”是逐个 token 裁剪时常见的问题,因此一些方法会裁剪整个单词或短语。
压缩图像#
视觉语言模型会将每张图像转换为数百个视觉 token,其中许多都是冗余信息。FastV会在第二层之后裁剪一半图像 token,在不损失性能的情况下,将 LLaVA-1.5-13B 的 FLOPs 降低 45%;token 合并也在视觉 Transformer 中采用了类似思路。目标检测器也可以充当图像压缩器:Ultralytics YOLO26会将照片转换为 Results.summary(),即包含每个物体类别名称、置信度和边界框坐标的列表;因此,如果 LLM 流水线只需要知道有哪些物体及其位置,就可以为每个物体发送几十个 token,而不必发送一张需要数百到一千多个 token 的图像。
提示压缩与相关技术的区别#
- 提示缓存:存储模型针对重复提示前缀计算出的状态,避免重新计算。提示长度不会改变;这两种技术可以很好地结合使用,压缩提示中变化的部分,并缓存固定部分。
- KV 缓存压缩:在生成过程中,逐出或量化模型内部的键值状态。提示压缩则在模型看到输入之前处理输入。
- 提示工程:由人手动编写清晰简洁的提示。压缩是自动进行的,适用于无人编辑的内容,例如检索到的文档。
- 上下文工程:确定每一步将哪些内容放入模型上下文的更广泛实践。压缩是其中一种工具,此外还有检索和过滤。
- 提示扩充:向提示中添加检索到或生成的上下文。流水线通常会先扩充,再压缩结果。










