LLMLingua 详解:微软的提示词压缩工具,最高 20 倍压缩
大模型的成本与延迟,大多花在冗长的提示词上——检索增强塞进几十段文档、few-shot 示例动辄几千 token,其中很多其实不必送进模型。微软开源的 LLMLingua 专门解决这个问题:用小语言模型对提示词做 token 级压缩,最高 20 倍压缩率且性能几乎不损失,还能顺带压缩 KV-Cache 加速推理。本文从动机、快速上手、三代方法原理到应用集成,完整拆解。
1、项目概述
LLMLingua 是微软的提示词与 KV-Cache 压缩项目,仓库约 6.6k Star、414 Fork,MIT 协议,pip 一装即用。它不是单一方法,而是一个持续演进的家族,每代都有正式论文。
论文体系:
- LLMLingua(EMNLP 2023):初代,小模型困惑度压缩
- LongLLMLingua(ACL 2024):面向长上下文与 RAG
- LLMLingua-2(ACL 2024 Findings):GPT-4 蒸馏的 BERT 分类器
- SecurityLingua(CoLM 2025):压缩兼识别越狱意图
核心数字:
- 最高 20 倍压缩,性能几乎不损失
- 官方示例:2365 token 压到 211(11.2 倍),GPT-4 省 0.1 美元
- LongLLMLingua:只用 1/4 token,RAG 性能反升最高 21.4%
- LLMLingua-2:比初代快 3 到 6 倍
2、为什么要压缩提示词
长提示词带来三重代价,压缩正是对症下药。
三个痛点:
- 成本:按 token 计费,超长提示直接烧钱
- 延迟:首 token 时间随提示变长,KV-Cache 也随长度膨胀
- 效果:lost in the middle——藏在长上下文中部的信息模型容易"看不见"
关键思路:不是粗暴截断,而是让一个小模型判断哪些 token 可以删——保留关键信息、去掉冗余表达,让大模型"吃得更少、看得更准"。
3、安装与快速上手
一条 pip 命令安装,三行代码完成第一次压缩。
# 安装
pip install llmlingua
# 基本用法
from llmlingua import PromptCompressor
llm_lingua = PromptCompressor()
compressed = llm_lingua.compress_prompt(
prompt, # 待压缩的原文
instruction="", # 指令部分(受保护)
question="", # 问题部分(受保护)
target_token=200) # 目标 token 数
# 返回字典:compressed_prompt、origin_tokens、
# compressed_tokens、ratio(如 11.2x)、saving(省钱估算)# 换用其他小模型
llm_lingua = PromptCompressor("microsoft/phi-2")
# 量化版 Llama-2-7B,8GB 显存即可
llm_lingua = PromptCompressor("TheBloke/Llama-2-7b-Chat-GPTQ",
model_config={"revision": "main"})上手要点:
1. PromptCompressor 默认加载小型语言模型,开箱即用
2. instruction 与 question 是"条件",压缩时会重点保护
3. target_token 控制压缩目标,返回值自带压缩率与省钱统计
4. 显存有限就换量化模型,8GB 也能跑 7B 级压缩器
4、LLMLingua:小模型 token 级压缩原理
初代方法的核心洞察:token 的困惑度(perplexity)低,意味着它容易被预测、信息量低,删掉对语义影响最小。
压缩流程(粗到细):
1. 用 GPT2-small 或 LLaMA-7B 这类小模型给 token 逐个打困惑度分
2. 困惑度低、信息量小的 token 优先丢弃
3. 粗到细逐层压:先压演示示例(demo),再压上下文(context),最后词级精压
4. instruction 与 question 作为条件受保护,几乎不被压缩
方法特点:
- 无需重新训练大模型,黑盒、即插即用
- 对 GPT-4 等闭源模型同样适用(压的是输入,不是模型)
- 压缩本身在小模型上完成,代价远低于直接调大模型
5、LongLLMLingua:面向长上下文与 RAG
第二代针对长上下文的"lost in the middle"问题:压缩的同时做文档级重排与差异化压缩率,让关键信息落在模型注意力最集中的头尾位置。
compressed = llm_lingua.compress_prompt(
prompt_list, # 文档列表
question=question, # 用问题引导压缩
rate=0.55, # 压缩率
condition_in_question="after_condition",
reorder_context="sort", # 按重要度重排文档
dynamic_context_compression_ratio=0.3, # 差异化压缩
condition_compare=True,
context_budget="+100",
rank_method="longllmlingua") # 启用完整流水线关键参数:
1. condition_in_question:先看问题再压缩,保留与问题相关的信息
2. reorder_context 设 sort:按重要度重排,关键段放到头尾
3. dynamic_context_compression_ratio:重要文档少压、次要文档多压
4. rank_method 设 longllmlingua 启用整条流水线
效果:RAG 场景只用 1/4 的 token,性能反而最高提升 21.4%——压缩在这里不只是省钱,还提升了效果。
6、LLMLingua-2:数据蒸馏与 3 到 6 倍提速
第三代换了思路:不再用生成式小模型逐 token 算困惑度,而是用 GPT-4 做数据蒸馏——让 GPT-4 压缩大量文本,把"哪些 token 被保留"训练成 BERT 级编码器的二分类任务,推理时一次前向即可。
llm_lingua = PromptCompressor(
model_name="microsoft/llmlingua-2-xlm-roberta-large-meetingbank",
use_llmlingua2=True)
compressed = llm_lingua.compress_prompt(
prompt,
rate=0.33, # 保留约三分之一
force_tokens=['\n', '?']) # 强制保留的结构 token要点:
1. use_llmlingua2 开启二代模式,模型换成 xlm-roberta-large
2. rate 直接指定保留比例(如 0.33 即压到三分之一)
3. force_tokens 强制保留换行、问号等结构性 token,避免格式被压坏
4. 分类器一次前向完成,比初代快 3 到 6 倍,任务无关、域外数据更稳
7、结构化压缩与生态集成
实际提示词往往由多段构成(系统指令、文档、示例),structured_compress_prompt 支持给不同段落指定不同压缩率。
# 用专用标签给各段指定压缩率(示例:该段压到 40%)
# <llmlingua, rate=0.4>这里是低优先级的背景资料</llmlingua>
compressed = llm_lingua.structured_compress_prompt(
structured_prompt,
instruction="",
question="",
rate=0.5)应用与生态:
- 场景:RAG、会议纪要摘要、上下文学习(ICL)、思维链(CoT)、代码,examples 目录各配 notebook
- 集成:LangChain、LlamaIndex、Prompt flow 均有官方接入
- SecurityLingua:压缩时顺带识别越狱攻击意图,token 成本仅为其他 LLM 护栏的百分之一
落地要点:
1. RAG 管线里把压缩插在"检索之后、调用大模型之前"
2. 多段提示用结构化压缩,指令段不压、资料段狠压
3. 已用 LangChain / LlamaIndex 的项目可直接挂现成组件
8、总结
LLMLingua 家族用"小模型压大提示"的思路,同时解决 token 成本、推理延迟与 lost in the middle:初代用小模型困惑度做粗到细压缩;LongLLMLingua 面向长上下文与 RAG,1/4 token 换来最高 21.4% 的提升;LLMLingua-2 用 GPT-4 蒸馏的 BERT 分类器提速 3 到 6 倍;SecurityLingua 把压缩与安全护栏合一。MIT 开源、pip 即装、已接入 LangChain 与 LlamaIndex。
落地建议:在 RAG 或长文档管线中,把 compress_prompt 插在检索之后、调用大模型之前,从 rate=0.5 起步灰度对比压缩前后的答案质量;追求速度选 LLMLingua-2,长上下文场景启用 LongLLMLingua 参数集,多段提示用结构化压缩。对于 token 开销大的生产管线,做这样的"提示词瘦身"是控制成本与延迟的必要手段。

