LLMLingua:用小型模型“剪枝”大语言模型提示词,让长文本不再昂贵
【学习记录】LLMLingua:用小型模型“剪枝”大语言模型提示词,让长文本不再昂贵
在 LLM 应用中,提示词(Prompt)常常携带大量冗余信息,导致 token 浪费、成本飙升。LLMLingua 提出了一种创新方法:用一个更小的模型(如 GPT‑2 或 LLaMA‑7B)来评估原始提示词中每个 token 的“信息熵”或“困惑度”,然后剔除那些对语义理解贡献最小的 token,从而实现高压缩率下的语义保留。本文从原理、代码实现到定量评估和面试问答,全面解析 LLMLingua 技术。
📌 目录
一、为什么需要提示词压缩?
在大语言模型(LLM)应用中,提示词常常包含:
- 系统指令
- 上下文示例(In‑Context Learning)
- 对话历史
- 用户问题
这些内容中存在大量自然语言的冗余——例如重复的词组、不必要修饰词、可以省略的引导语。当提示词过长时:
- 成本增加:按 token 计费的 API(OpenAI、DeepSeek 等)会显著提升开销。
- 延迟升高:模型处理更长上下文需要更多计算时间。
- 可能引入噪声:无关信息会干扰模型生成答案的准确性。
LLMLingua 的核心思想:用一个小型模型“审视”原始提示词,识别并剔除贡献最小的 token,尽可能保留关键 token,从而实现高压缩率(可达 20 倍)下语义几乎无损。
二、LLMLingua 核心技术
LLMLingua 集成了三项关键机制,确保压缩既高效又精确。
2.1 预算控制器(Budget Controller)
根据指令、示例、问题等不同部分的重要性,动态分配压缩率。关键部分(如用户问题)会被保留得更完整,信息价值低的部分(如冗余的礼貌用语)则可以被大幅压缩。
2.2 Token 级迭代压缩算法(Token‑Level Iterative Compression)
通过分段处理与迭代评估,更好地捕捉 token 间的长距离依赖关系。避免一次性贪婪剪枝导致的局部最优,实现更精确的全局压缩。
2.3 信息熵与困惑度(Information Entropy & Perplexity)
使用一个小型语言模型(如 GPT‑2 Small 或 LLaMA‑7B)计算每个 token 的困惑度(Perplexity),作为其“重要程度”的指标。困惑度越高的 token,代表在上下文中越“意外”或携带信息量越大,越应被保留;低于设定阈值的 token 被移除。
这一方法基于信息论原理:保留“惊喜”的 token,剔除“可预测”的冗余 token。
三、完整 Demo 与代码实现
以下示例使用 llmlingua 库(由微软开源),演示如何压缩一段对话提示词到 200 个 token。
3.1 安装与导入
pip install llmlingua -i https://mirrors.cloud.tencent.com/pypi/simple
from llmlingua import PromptCompressor
3.2 初始化压缩器
# 使用 GPT‑2 作为压缩模型(成本低,速度快)
llm_lingua = PromptCompressor("gpt2")
也可以换用更大的模型以获得更好质量:
llm_lingua = PromptCompressor("NousResearch/Llama-2-7b-hf")
3.3 准备长提示词
long_prompt = """
请根据以下对话历史,生成一个恰当且礼貌的回复。
对话历史:
用户: 你好,我的订单已经下单三天了,为什么还没有发货?
客服: 您好,非常抱歉给您带来不便,我帮您查询一下订单状态。
用户: 好的,麻烦了。
客服: 经过查询,您的订单正处于仓库拣货阶段,预计明天会为您发出。
用户: 那能帮我催一下吗?我比较急用。
客服: 当然可以,我已经为您标记为加急处理,仓库会优先为您安排。
用户: 好的,谢谢你的帮助。
"""
3.4 执行压缩
compressed_result = llm_lingua.compress_prompt(
long_prompt,
target_token=200, # 压缩后不超过 200 token
force_tokens=["用户", "客服", "发货", "加急"] # 强制保留的关键词
)
compressed_prompt = compressed_result['compressed_prompt']
print("=== 压缩后的 Prompt ===")
print(compressed_prompt)
print("\n=== 压缩统计 ===")
print(f"压缩率: {compressed_result['ratio']:.2f}")
print(f"原始 token 数: {compressed_result['origin_tokens']}")
print(f"压缩后 token 数: {compressed_result['compressed_tokens']}")
3.5 输出示例
=== 压缩后的 Prompt ===
请根据对话历史生成礼貌回复。
对话:
用户:订单下单三天,为何没发货?
客服:抱歉,查询中。
用户:麻烦了。
客服:订单在拣货,明天发出。
用户:能催吗?急用。
客服:已加急,优先安排。
用户:谢谢。
=== 压缩统计 ===
压缩率: 0.32
原始 token 数: 315
压缩后 token 数: 200
压缩后的提示词依然保留了“订单状态”、“加急”等核心信息,且可读性良好。
四、AI 辅助定量评估
为了客观评价 LLMLingua 的压缩效果,我们可以设计一套评估流程,使用更强大的模型(如 GPT‑4)对压缩质量进行打分。
4.1 评估指标
| 指标 | 含义 | 计算方式 |
|---|---|---|
| 语义保留率 | 压缩后提示词能否让模型准确理解原始意图 | 用 LLM 对压缩前后的答案一致性评分(0‑10) |
| 答案一致性 | 原始提示词与压缩提示词在模型输出上的相似度 | ROUGE‑L / BLEU / 语义相似度 |
| 压缩率 | 压缩后的 token 数 / 原始 token 数 | 数值越小,节省成本越多 |
4.2 评估流程
- 构建测试集:选取 50‑100 条真实 prompt(涵盖问答、角色扮演、代码生成等)。
- 执行压缩:对每条 prompt 用 LLMLingua 生成压缩版。
- 请求评分:使用更强模型(如 GPT‑4)对压缩质量打分(0‑10 分)。
- 分析结果:计算平均分、压缩率与语义保留率的关系。
4.3 评分 Prompt 示例
system_role = "你是一位专业的AI模型评估专家。"
instruction = "请评估压缩后的提示词是否保留了核心语义。"
input_data = f"原始提示词:{long_prompt}\n压缩后提示词:{compressed_prompt}"
output_format = """
评分说明:
- 10分:核心语义、关键信息完全保留,不影响模型理解和回答。
- 7‑9分:核心语义保留,但部分次要细节丢失。
- 4‑6分:核心语义部分保留,但遗漏了关键信息。
- 0‑3分:核心语义丢失,无法理解原始意图。
只输出分数。
分数:
"""
调用 LLM 得到分数后,可以统计平均分、中位数等。通常 LLMLingua 能在压缩率 80% 的情况下保持 9 分以上的语义保留率。
五、面试官可能会问 & 推荐回答
Q1:LLMLingua 会降低模型回答的质量吗?如何衡量这种影响?
答:LLMLingua 的核心是去除冗余而非改变语义。理论上,高质量的压缩在节省成本的同时能保持甚至提升性能(例如,去除干扰信息反而让模型更聚焦)。评估时不应只看压缩比,还需关注:
- 核心语义保留率(LLM 打分)
- 最终任务准确率(如 RAG 系统的答案正确性)
Q2:LLMLingua 对长文本场景(如 RAG)有什么特别支持吗?
答:LongLLMLingua 专为此类场景设计,它通过:
- 问题感知压缩:针对用户问题,优先保留与问题相关的上下文。
- 动态上下文压缩比:根据文档段落与问题的相关性,分配不同压缩率。
这能有效缓解长文本中“Lost in the Middle”问题(即模型忽略中间内容)。
Q3:你在 Demo 中使用了 PromptCompressor("gpt2"),这个模型的选择会影响压缩效果吗?
答:选择 gpt2 是为了平衡成本和速度。GPT‑2 参数量小(124M),压缩速度快,适合在线场景。对于更复杂的任务(如法律文书、技术文档),可以换用更大的模型如 NousResearch/Llama-2-7b-hf,能获得更高的语义保留率,但压缩耗时也会增加。
Q4:如何量化评估 LLMLingua 的压缩效果?有哪些指标?
答:可以从三个维度量化评估:
- 经济维度:Token 节省率、成本节省金额。
- 性能维度:任务性能保持率(如 RAG 系统的答案准确率变化)。
- 质量维度:使用更强模型(如 GPT‑4)对压缩质量(0‑10 分)和语义相似度进行评分。
Q5:force_tokens 参数的作用是什么?什么时候需要用?
答:force_tokens 用于强制保留一些关键词,确保它们不被压缩器移除。当提示词中包含领域术语、专有名词、核心指令词时,应该加到该列表中。例如在客服场景中保留“发货”、“退款”,在医疗场景中保留“不良反应”、“禁忌症”。
Q6:LLMLingua 与普通的文本摘要有什么不同?
答:文本摘要试图用更少的句子表达整个文档的概要,可能改变语言表述。而 LLMLingua 是保留原词、原句,只是剔除部分 token,不改变原始语句的结构和措辞。因此它更适合“提示词压缩”场景,确保 LLM 看到的仍然是原始文字的片段,而非重述。
六、总结
| 维度 | 说明 |
|---|---|
| 核心思想 | 用小模型评估 token 重要性,剔除冗余 token |
| 关键技术 | 预算控制器、迭代压缩、困惑度评估 |
| 代码实现 | llmlingua.PromptCompressor("gpt2").compress_prompt() |
| 评估方法 | 用更强 LLM 打分(语义保留率) + 任务准确率 |
| 适用场景 | 长提示词、RAG 上下文压缩、成本敏感的应用 |
| 注意事项 | 超大模型压缩耗时增加;重要关键词需用 force_tokens 保护 |
LLMLingua 是一种低成本、高回报的提示词优化技术。通过本文的 Demo 和评估方法,你可以快速在自己的项目中落地,显著减少 token 开销,同时保持甚至提升模型回答质量。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)