【学习记录】LLMLingua:用小型模型“剪枝”大语言模型提示词,让长文本不再昂贵

在 LLM 应用中,提示词(Prompt)常常携带大量冗余信息,导致 token 浪费、成本飙升。LLMLingua 提出了一种创新方法:用一个更小的模型(如 GPT‑2 或 LLaMA‑7B)来评估原始提示词中每个 token 的“信息熵”或“困惑度”,然后剔除那些对语义理解贡献最小的 token,从而实现高压缩率下的语义保留。本文从原理、代码实现到定量评估和面试问答,全面解析 LLMLingua 技术。


📌 目录

  1. 为什么需要提示词压缩?
  2. LLMLingua 核心技术
  3. 完整 Demo 与代码实现
  4. AI 辅助定量评估
  5. 面试官可能会问 & 推荐回答
  6. 总结

一、为什么需要提示词压缩?

在大语言模型(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 评估流程

  1. 构建测试集:选取 50‑100 条真实 prompt(涵盖问答、角色扮演、代码生成等)。
  2. 执行压缩:对每条 prompt 用 LLMLingua 生成压缩版。
  3. 请求评分:使用更强模型(如 GPT‑4)对压缩质量打分(0‑10 分)。
  4. 分析结果:计算平均分、压缩率与语义保留率的关系。

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 的压缩效果?有哪些指标?

:可以从三个维度量化评估:

  1. 经济维度:Token 节省率、成本节省金额。
  2. 性能维度:任务性能保持率(如 RAG 系统的答案准确率变化)。
  3. 质量维度:使用更强模型(如 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 开销,同时保持甚至提升模型回答质量。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐