出差旅行时,你是不是也遇到过这种窘境:衣柜里的衣服件件都想带,可行李箱就那么大。硬塞进去?拉链都拉不上。这时候,一位经验丰富的“打包专家”登场了——他先清点衣物,把两件差不多的白衬衫合并成一件;再淘汰那些“可带可不带”的零碎;最后把每件衣服卷得紧紧的,让箱子腾出一大半空间。等你到了目的地打开箱子,惊喜地发现真正要用的东西一件都没落下。 LLMLingua 干的就是这件“打包”的活儿,只不过对象从衣服换成了 Prompt。它是一位 Prompt 打包专家:在把提示词交给大模型之前,先派一位轻量的“行李顾问”(小模型)逐字逐句检查,判断哪些词是必须保留的关键信息、哪些是可以说服自己丢掉的冗余词,然后果断抽走。结果,一份 1000 个 token 的 Prompt 被压缩到 100 个,大模型读起来照样心领神会。本文就来拆解这套“打包术”的原理、用法与取舍。

岗位关联

学完本章,你将掌握用 LLMLingua 为超长 Prompt 瘦身的完整方法,在保住任务效果的前提下,把 API 调用成本打到原来的一成甚至更低——这是每个做 AI 应用开发的工程师都该会的省钱手艺。

目录
  1. 可视化演示
  2. 压缩原理
  3. 小模型选择
  4. 使用方法
  5. 压缩率控制
  6. 效果权衡
  7. 兼容性测试
  8. 应用场景
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示小模型驱动的token压缩过滤过程、压缩率与效果权衡曲线及多LLM兼容性测试评分对比,揭示Prompt压缩核心技术原理。

本节配有交互动效(进入视口后自动加载,约 3KB)。

压缩原理:小模型过滤低信息token 小模型评估:计算每token信息量 保留高信息:删除冗余token 压缩 = 保留高信息token 2x压缩率下语义基本无损

压缩原理

还记得那位打包专家的三步操作吗?他先清点所有衣物,把重复的款式合并;再淘汰“可带可不带”的物件;最后把留下的衣服一件件卷紧。LLMLingua 的压缩流程几乎一模一样,只是处理对象换成了 Prompt 文本。它采用的是一种“由粗到细”的三级压缩框架:第一步是示例级压缩,把 Prompt 里多个 redundant 示例中重复的信息合并;第二步是句子级压缩,删掉与任务无关的废句;第三步才是重头戏——词元级压缩,像卷衣服一样,逐词逐字地剔除冗余。

为什么能精细到“词”这个粒度?因为词元(Token)才真正决定大模型的注意力成本。一个句子删掉“的、了、在”这类词,意思几乎不变,却能省下不少 token。关键在于如何判断一个词够不够“冗余”——LLMLingua 的答案是:让一个小模型给每个词打分,分数用“困惑度”(Perplexity)表示。困惑度越高,说明这个词越出乎意料、信息量越大;困惑度越低,说明这个词太容易预测、删了也无妨。这个评估不是凭空进行的,它会把你的任务指令 $I$ 也纳入上下文,实现“指令感知”的压缩。

PPL(xi)=P(xi∣x<i,I)−1∣xi∣\displaystyle PPL(x_i) = P(x_i \mid x_{<i}, I)^{-\frac{1}{|x_i|}}

1. 词元 $x_i$:当前被评估的某一个词元,中文场景下可以理解为一个字或一个词。

xix_i

2. 上文 $x_{<i}$:该词元之前出现的全部词元,提供判断的语境。

x<ix_{<i}

3. 指令 $I$:用户给出的任务指令,让“重要性”的判断与任务目标绑定,而不是孤立地看词频。

II

4. 条件概率 $P$:小模型在给定语境和指令下,预测出这个词的概率,越常见越容易猜中。

P(xi∣x<i,I)P(x_i \mid x_{<i}, I)

5. 取负倒数次方:概率越高、困惑度越低,代表越冗余;概率越低、困惑度越高,代表越关键,后续按困惑度排序决定去留。

PPL(xi)=P(xi∣x<i,I)−1∣xi∣\displaystyle PPL(x_i) = P(x_i \mid x_{<i}, I)^{-\frac{1}{|x_i|}}

回到行李箱的比喻:打包专家整理衣物的终极标准,不是“这件衣服贵不贵”,而是“没了它我的行程会不会抓瞎”。LLMLingua 里的困惑度正是这样的标准——它不关心词的长短好坏,只关心“删掉这个词,大模型还读得懂吗”。有了这把尺子,压缩就不再是拍脑袋截断,而是一次有依据的取舍。

小模型选择

打包专家当然可以自己一件件翻看衣物,但那样太慢也太贵。聪明的做法是派一位熟悉衣橱的助手先做初步筛选,专家只在关键处把关。LLMLingua 的思路如出一辙:它不调用昂贵的商用大模型来评估词元,而是用一个参数规模小得多的语言模型来当“行李顾问”。候选模型包括 GPT-2 系列、LLaMA-7B 等,它们的共同点是:参数量小、显存占用低、推理速度快,评估成本几乎可以忽略。

一个自然的疑问是:小模型的判断靠谱吗?答案是“相当靠谱”。语言模型在预训练阶段习得的语言学先验是相通的——无论是 7B 的小模型还是 175B 的大模型,对“的、了、是”这类高频功能词的敏感度、对实体名词和数字的重视程度都高度一致。论文实验也证实,小模型给出的困惑度排序与大模型高度相关,评估一致性足以支撑压缩决策。当然,参数量也不能无限小,太小会丢失语义判断力,太大又失去了成本优势,因此需要一个参数规模权衡。

R=CsmallClarge=PsmallPlarge=7×109175×109≈4%\displaystyle R = \frac{C_{small}}{C_{large}} = \frac{P_{small}}{P_{large}} = \frac{7 \times 10^9}{175 \times 10^9} \approx 4\%

1. 成本比 $R$:使用小模型评估与使用大模型评估的成本之比。

RR

2. 评估成本 $C$:近似与模型参数量成正比,参数量越大单次推理越贵。

Csmall,ClargeC_{small}, C_{large}

3. 小模型参数量 $P_{small}$:以 LLaMA-7B 为例,即 70 亿参数。

Psmall=7×109P_{small} = 7 \times 10^9

4. 大模型参数量 $P_{large}$:以 GPT-3.5 级别约 1750 亿参数为例。

Plarge=175×109P_{large} = 175 \times 10^9

5. 代入求值:相除可得约 4%,这就是“让小模型当顾问”的显存与算力成本优势。

R=7×109175×109≈4%\displaystyle R = \frac{7 \times 10^9}{175 \times 10^9} \approx 4\%

那位便宜的“实习生顾问”之所以敢拍板,是因为他和专家受过同一种“语言训练”。在打包的场景里,这意味着:你不需要为每一次评估支付头等舱的价格,却能获得接近头等舱的判断质量。选对助手,是整套压缩术的第一块基石。

使用方法

找到了打包专家,下一步自然是把行李交给他,填好交接单。LLMLingua 的使用也类似:先“请专家进门”,也就是安装依赖;然后调用核心 API 完成压缩;最后把压缩结果交给大模型。开发者在 Python 环境中只需执行 pip 安装即可引入 LLMLingua 库,工具会在本地加载一个小模型作为评估器,整个过程不需要联网申请额外的服务。

核心 API 是 PromptCompressor 这个类。先实例化压缩器,再调用 compress_prompt 方法,传入原始 Prompt、任务指令和期望的目标 token 数,它就会自动完成三级压缩并返回压缩后的文本。整个过程的核心参数配置包括:target_token(目标 token 数)、ratio(压缩率上限)以及 iterative_size(迭代压缩的粒度)。若你使用 LangChain 生态,还可以把 LLMLingua 作为 Prompt 压缩器接入链中,位于模板渲染之后、发送给大模型之前,自动完成瘦身,对上层业务几乎透明。

Ntarget=⌊r×Noriginal⌋\displaystyle N_{target} = \left\lfloor r \times N_{original} \right\rfloor

1. 原始长度 $N_{original}$:压缩前 Prompt 的总 token 数,即“满柜子衣服”。

NoriginalN_{original}

2. 压缩率参数 $r$:期望保留的 token 比例,0.1 表示压缩到原来的 10%。

rr

3. 相乘:目标长度是原始长度乘以压缩率,得到期望的 token 数量。

r×Noriginalr \times N_{original}

4. 向下取整 $\lfloor \cdot \rfloor$:token 数必须是整数,向下取整保证不超预算。

Ntarget=⌊r×Noriginal⌋\displaystyle N_{target} = \left\lfloor r \times N_{original} \right\rfloor

这份“交接单”上的每一项都对应着一个旋钮:想带大箱子还是小箱子、哪些衣物碰都不能碰(condition 参数可保护指定词元)。把交接单填好,剩下的事打包专家全包了——安装、调用、集成,三步走完,你的 Prompt 已经轻装上阵。

压缩率控制

行李箱有 18 寸、20 寸、28 寸之分,打包专家能根据箱子大小调整收纳策略。LLMLingua 同样提供了多个控制压缩程度的旋钮,其中最直接的是目标 token 数(target_token)和压缩率参数(ratio)。前者直接指定压缩后 Prompt 的 token 上限,适合有明确成本预算的场景;后者指定保留比例,比如 0.2 表示最多保留原长度的 20%,适合对压缩程度有直觉把握的场景。

除了“一锤定音”式的压缩,LLMLingua 还支持迭代压缩:把压缩过程拆成多轮,每轮只删掉一部分最冗余的词元,然后重新计算剩余文本的困惑度,再进入下一轮删除。为什么要这么麻烦?因为删掉一批词后,剩余文本的语境发生了变化,某些原本“安全”的词可能变得关键,迭代压缩能让每次删除都基于最新的语境判断,效果更稳。这两种方式共同服务于同一个“长度预算”管理目标。压缩率计算公式 $\beta$ 表示被删掉的比例,前端经常用它来展示省钱效果。

β=1−NcompressedNoriginal\displaystyle \beta = 1 - \frac{N_{compressed}}{N_{original}}

1. 压缩率 $\beta$:被压缩掉的 token 占原始 token 的比例,0.85 表示省掉 85%。

β\beta

2. 压缩后长度 $N_{compressed}$:打包完成后行李箱里的 token 数量。

NcompressedN_{compressed}

3. 求占比:先用压缩后长度除以原始长度,得到“剩余比例”。

NcompressedNoriginal\frac{N_{compressed}}{N_{original}}

4. 用 1 相减:剩余比例越小,压缩率越大。

β=1−NcompressedNoriginal\displaystyle \beta = 1 - \frac{N_{compressed}}{N_{original}}

选 28 寸大箱还是 18 寸登机箱,取决于你的行程(任务)和对舒适度(效果)的要求。LLMLingua 把选择权交给你:想要极致省钱,就调大压缩率、调低目标 token;想要稳妥保效果,就留足长度预算。真正的打包高手,会先预估行程再选箱子。

效果权衡

箱子越小,越可能漏带某件必需品。压缩率与效果之间的博弈,是 LLMLingua 使用中最需要清醒认识的一课。研究者发现,随着压缩率上升,任务效果并不是匀速下滑,而是呈现明显的“阈值现象”:在压缩率较低时(比如压到 50%),效果几乎不掉,因为删掉的都是纯冗余词汇;但当压缩率超过某个临界点后,效果会急剧滑坡——这时删掉的已经不只是“的、了”,而是承载关键信息的实体词和逻辑词。

因此,评估压缩效果不能只看压缩率,更要看“信息保留度”。常用的做法是拿压缩后的 Prompt 跑一遍验证集,对比原始 Prompt 的效果,计算效果损失 ΔAcc。如果任务是对抗性较强的复杂推理(如数学题、多跳问答),信息保留度的要求就更高;如果是简单分类、关键词提取,压缩空间则更大。这也意味着存在一个“压缩率天花板”:超过它,省下的 token 远抵不上效果损失的成本,得不偿失。

ΔAcc=Accfull−Acccompressed\displaystyle \Delta Acc = Acc_{full} - Acc_{compressed}

1. 原始效果 $Acc_{full}$:使用未压缩 Prompt 时模型在验证集上的准确率。

AccfullAcc_{full}

2. 压缩后效果 $Acc_{compressed}$:使用压缩 Prompt 后模型在同一验证集上的准确率。

AcccompressedAcc_{compressed}

3. 做差:两者之差就是压缩带来的效果损失。

ΔAcc\Delta Acc

4. 判读:ΔAcc 接近 0 说明压缩安全;明显大于 0 说明已越过阈值,需要回调压缩率。

ΔAcc=Accfull−Acccompressed\displaystyle \Delta Acc = Acc_{full} - Acc_{compressed}

打包界的金科玉律是“够用就好,别为省钱把必需品扔掉”。实际项目中,通常的做法是先从一个保守的压缩率(如 0.5)开始,逐步收紧,每压一档就跑一遍验证集,找到效果还能接受的临界点——那个点就是你的行李箱最佳尺寸。

兼容性测试

经常出差的人都知道,不同航空公司的行李规定不一样:有的对登机箱尺寸卡得死,有的对超重罚款狠。LLMLingua 压缩后的 Prompt,在不同大模型上的“待遇”也各不相同,因此上线前必须做兼容性测试。论文在多款主流模型上做了系统验证,包括 GPT-3.5、GPT-4、ChatGPT 以及开源模型 LLaMA 系列,观察压缩 Prompt 对各类模型输出成功率的影响。

测试结果显示,LLMLingua 具有良好的跨模型兼容性:多数模型在压缩后仍能保持相当的任务成功率,但具体数值存在差异。指令微调过的模型对压缩 Prompt 的鲁棒性通常更好,因为它们更擅长从“精简、命令式”的文本中提取意图;而某些基座模型在高度压缩的输入上,成功率下滑会更明显。此外,任务类型也影响适配度:GSM8K 这类数学推理任务对关键数字极其敏感,压缩时要格外保护数值词元;而文本分类、抽取任务则宽容得多。模型鲁棒性和任务类型适配,共同决定了成功率对比的结论。

Qˉ=1K∑k=1KAcckcAccko\displaystyle \bar{Q} = \frac{1}{K} \sum_{k=1}^{K} \frac{Acc_k^{c}}{Acc_k^{o}}

1. 模型数量 $K$:参与兼容性测试的大模型个数。

KK

2. 压缩后准确率 $Acc_k^{c}$:第 $k$ 个模型在压缩 Prompt 下的准确率。

AcckcAcc_k^{c}

3. 原始准确率 $Acc_k^{o}$:第 $k$ 个模型在原始 Prompt 下的准确率,作分母归一化。

AcckoAcc_k^{o}

4. 求比值再取平均:每个模型的效果保持率取平均,得到整体兼容性评分 $\bar{Q}$,越接近 1 越稳。

Qˉ=1K∑k=1KAcckcAccko\displaystyle \bar{Q} = \frac{1}{K} \sum_{k=1}^{K} \frac{Acc_k^{c}}{Acc_k^{o}}

给行李箱打包前,先查清楚目的地航空公司的规定,是成熟旅行者的习惯。成熟的 AI 应用工程师也一样:在把压缩管线推向生产前,先在自己的目标模型和目标任务上各跑一遍对比测试,确认“这只箱子在哪家航空公司都提得上飞机”,再放心起飞。

应用场景

出差归来,精明的旅行者会算一笔账:请打包专家省下的托运费,够不够付他的服务费?答案通常是超值的。把同样的逻辑搬到 Prompt 压缩上,省钱效果可以用一个简洁的公式表达:省下的费用等于被删掉的 token 数乘以每个 token 的单价。假设原始 Prompt 有 4000 个 token,压缩到 400 个,按业内常见计价,单次调用成本直接降到原来的 10%。

第一个典型场景是降低 API 成本:凡是需要高频调用大模型的应用,Prompt 压缩都是直接的成本杠杆。第二个是长文档处理:把几十页 PDF 的背景知识作为上下文塞进 Prompt,token 占用动辄上万,压缩后不仅省钱,还因为上下文窗口的释放而减少了模型显存压力。第三个是批量任务加速:数据标注、内容审核、批量分类这类“同样规则跑千万条数据”的场景,压缩后的 Prompt 让每条的推理时间显著缩短,吞吐量成倍提升。第四个是对多轮对话历史的压缩:聊天机器人每轮都携带完整历史,几十轮后 token 爆炸,用 LLMLingua 把历史压缩成精炼摘要,既能续上话题,又不会拖慢响应。

Saving=(No−Nc)×p\displaystyle \text{Saving} = (N_{o} - N_{c}) \times p

1. 省下的 token 数 $(N_{o} - N_{c})$:原始 token 数减去压缩后 token 数。

No−NcN_{o} - N_{c}

2. 单价 $p$:供应商按 token 计费的单价,通常是每百万 token 若干美元。

pp

3. 相乘:两者相乘即单次调用的成本节省额。

Saving=(No−Nc)×p\displaystyle \text{Saving} = (N_{o} - N_{c}) \times p

旅行结束时,你会发现那位打包专家的服务费远低于省下的托运费。LLMLingua 亦是如此:压缩付出的算力成本是小模型评估的几分钱,换来的却是大模型调用账单上高达 90% 的削减。这笔账,怎么算都划算。

AI 应用场景

长文档知识库问答

阶段:Prompt 预处理与成本优化

解决的问题:企业知识库问答时,常把几十页产品手册、政策条款全文塞进 Prompt 作为上下文,每次调用都要为几千上万个 token 买单;传统做法只能被动接受高额账单或粗暴截断导致答案残缺。用 LLMLingua 压缩后,语义关键信息保留,冗余描述剔除,成本大降且效果几乎无损。

具体案例:某保险科技公司将 8000 字的理赔条款压缩到 1200 字后接入客服问答,验证集上的答案准确率仅下降 1.2%,而单次调用 token 费用下降了约 85%,月度大模型账单从 3 万元降到不足 5000 元。

批量数据分类与标注

阶段:批处理推理加速

解决的问题:电商平台每天有数十万条商品评论需要做情感分类,每条都要携带冗长的分类规则说明。传统方式下,token 消耗与推理延迟都很高,GPU 集群常年满载。把规则说明压缩成精炼指令后,单条推理速度提升约 4 倍,同等的算力可以处理更多数据。

具体案例:某内容平台用 LLMLingua 压缩分类 Prompt 后跑全量历史评论,日处理量从 8 万条提升到 35 万条,分类 F1 值仅从 0.94 微降至 0.92,业务方完全可接受。

多轮对话历史压缩

阶段:上下文管理

解决的问题:客服机器人对话超过 20 轮后,携带的聊天历史常达 4000 token 以上,既推高成本又拖慢首字响应时间。传统做法是定期截断历史,但容易“失忆”。用 LLMLingua 在每轮对话结束后压缩历史,保留关键用户意图与已确认信息,实现“压缩版记忆”。

具体案例:某银行智能客服升级后,把单次会话平均 token 从 5200 降到 900,机器人响应提速 63%,用户问题解决率反而提升了 2%,因为模型不再被冗长历史干扰。

Python 演示

python37 行
# -*- coding: utf-8 -*-"""简化版 LLMLingua 演示:用伪困惑度评估词元重要性并压缩 Prompt"""import reimport mathfrom collections import Counter STOPWORDS = set('的了是在和有就都而及与或一个我不他这那我们你们它') def pseudo_perplexity(token, freq, total, pos):    """伪困惑度 = -log(出现概率),停用词打分极低(易预测、冗余),靠前位置加分"""    if token in STOPWORDS:        return 0.15    p = freq.get(token, 0) / total    base = -math.log(p + 1e-6)    return base * (1.5 if pos < 3 else 1.0) def compress(prompt, ratio=0.5):    """贪心删除伪困惑度最低的词元,直到长度达到 ratio * 原文长度"""    tokens = re.findall(r'[\u4e00-\u9fa5]|[A-Za-z0-9]+', prompt)    current = tokens[:]    target = max(1, int(len(current) * ratio))    freq = Counter(tokens)    total = len(tokens)    while len(current) > target:        scores = [pseudo_perplexity(t, freq, total, i) for i, t in enumerate(current)]        idx = scores.index(min(scores))        del current[idx]    return ''.join(current), len(tokens), len(current) if __name__ == '__main__':    prompt = '请确认您的航班时间为上午九点整,在三号航站楼C区办理登机手续,谢谢配合。'    ratio = float(input('请输入压缩率(0.1-1.0,默认0.5):') or 0.5)    compact, orig, kept = compress(prompt, max(0.1, min(ratio, 1.0)))    print('原始词元数:', orig)    print('压缩后词元数:', kept)    print('压缩率:', round(kept / orig * 100), '%')    print('压缩后内容:', compact)
目的:用一套可运行的简化实现,演示 LLMLingua 的核心思想——给每个词元打“困惑度”分,贪心地删除最冗余的词元,直到达到目标压缩率。
  1. STOPWORDS = set('的了是在和有就都而及与或一个我不他这那我们你们它')定义停用词表,对应“打包顾问一眼就判定可扔的包装盒”。
  2. def pseudo_perplexity(token, freq, total, pos):伪困惑度函数,模拟小模型对词元的“惊讶程度”打分。
  3. base = -math.log(p + 1e-6)出现概率越低,困惑度越高,信息量越大。
  4. return base * (1.5 if pos < 3 else 1.0)句首位置加权,模拟 LLMLingua 对指令开头关键信息的保护。
  5. def compress(prompt, ratio=0.5):主压缩函数,对应 LLMLingua 的 token 级过滤。
  6. tokens = re.findall(r'[\u4e00-\u9fa5]|[A-Za-z0-9]+', prompt)把中文按单字、英文数字按单词切分为词元序列。
  7. target = max(1, int(len(current) * ratio))根据压缩率计算目标 token 数,相当于确定行李箱尺寸。
  8. while len(current) > target:迭代压缩循环,每轮只删一个当前最冗余的词元。
  9. idx = scores.index(min(scores))找出伪困惑度最低(最可预测、最冗余)的词元位置。
  10. del current[idx]执行删除,模拟“把冗余词从行李箱里拿出来”。

常见误区

误区很多初学者觉得,既然要减少 token,那直接把 Prompt 从 1000 个 token 截断到 200 个不就行了?反正大模型读前面的内容也能猜个大概。

正解直接截断相当于从行李箱中间拦腰剪掉一半,可能把最关键的航班号、日期、金额全部剪掉。LLMLingua 的顺序是逐词评估、删除最不重要的,而不是按位置截断。它更像把箱子里的物品逐件称重,扔掉最轻的,而不是把箱子砍短。

为何常见:因为“截断”是人对文本空间最直觉的理解方式,而“逐词元评估重要性”需要理解困惑度机制,思维上绕了一个弯,所以容易先用截断来类比。

误区删掉了那么多字,大模型读到的信息变少了,效果怎么可能不变差?所以很多团队对压缩望而却步。

正解压缩删掉的多是“的、了、非常、十分”这类冗余修饰词,保留的是实体、数字、逻辑关系。有时候去除冗余反而让模型更专注,部分任务的效果甚至略有提升。论文实验和实际案例都表明,在压缩率不越过阈值的范围内,效果损失可以控制在 1-2 个百分点以内。

为何常见:人们习惯于用“信息量=文本长度”来粗略估计,忽略了自然语言中大量存在的冗余信息本来就占着 token 却不占智商。

误区既然是省钱利器,那把压缩率调到 95%、目标 token 压到原来的 5%,岂不美哉?

正解压缩率存在天花板,越过阈值后效果会急剧滑坡。到了那个临界点,省下的 token 费用远抵不上任务失败造成的业务损失。正确做法是从保守压缩率开始,逐步收紧并用验证集监控效果,找到“效果还能接受的最大压缩率”。

为何常见:省钱冲动容易让人忽略收益递减规律,再加上“能压 90%”的宣传印象,让不少开发者误以为压缩率越高越先进。

误区让 GPT-2 这种“小不点”来决定哪个词重要,能比得上 GPT-4 的眼光吗?还是老老实实用大模型评估更放心。

正解小模型与大模型在语言先验上高度一致,对高频功能词、实体名词的判断排序几乎相同,而成本只有大模型的约 4%。LLMLingua 恰恰是通过“小模型评估 + 大模型消费”的分工实现性价比最优。用大模型评估压缩,省下的钱又花回去了。

为何常见:人们对“能力越强越可靠”有路径依赖,忽略了评估任务(判断词元可预测性)本身并不需要极强的推理能力,靠统计先验就够了。

误区压缩完的 Prompt 发给谁都能正常干活,反正都是大模型,理解力应该差不多。

正解不同模型对压缩输入的鲁棒性差异明显。指令微调过的模型对精简命令式文本更友好;基座模型在高度压缩输入上成功率下滑更明显。同一份压缩 Prompt,在 GPT-4 上表现优秀,在某个开源小模型上可能一塌糊涂,所以上线前必须在目标模型上做兼容性测试。

为何常见:人们习惯把“大模型”当作一个同质化的整体,忽略了预训练目标、微调方式带来的行为差异。

面试题

Q1. LLMLingua 压缩 Prompt 的最小操作粒度是什么?

单选题 · easy

  • A.字符级
  • B.词元级← 正确答案
  • C.句子级
  • D.段落级

答案:B。LLMLingua 的三级压缩最后一级就是词元(Token)级过滤,它逐字逐词地评估并删除冗余 token,这是其核心创新点。字符级太细会破坏语义,句子和段落只是前两级粗筛,不是最小粒度。

Q2. LLMLingua 评估词元重要性的核心指标是?

单选题 · easy

  • A.词语出现频率
  • B.模型困惑度← 正确答案
  • C.文本情感强度
  • D.字符长度大小

答案:B。LLMLingua 的核心是用小模型计算每个词元的困惑度(Perplexity),困惑度越高表示越出乎意料、信息量越大,越应该保留;频率、情感、长度都不是它的评估依据。

Q3. LLMLingua 主要是由哪家公司开源的?

单选题 · easy

  • A.微软公司开源← 正确答案
  • B.谷歌公司开源
  • C.百度公司开源
  • D.腾讯公司开源

答案:A。LLMLingua 是微软开源(Microsoft)的 Prompt 压缩工具,论文发表于 EMNLP 2023,配套代码在 GitHub 上以 LLMLingua 项目发布,题目属于常识性识记。

Q4. 在 LLMLingua 中,困惑度较低(容易被预测)的词元通常被认为?

单选题 · mid

  • A.信息量大应当优先保留
  • B.冗余内容可以被安全剔除← 正确答案
  • C.属于指令关键词应大写
  • D.表示模型能力不足需重训

答案:B。困惑度低意味着小模型“闭着眼都能猜到”,这类词通常是“的、了、在”等高频功能词,删掉不影响语义,属于安全的压缩对象。反之,高困惑度词才承载关键信息,应优先保留。

Q5. LLMLingua 三级压缩的正确执行顺序是?

单选题 · mid

  • A.词元级到句子级再到示例级
  • B.句子级到词元级再到示例级
  • C.示例级到句子级再到词元级← 正确答案
  • D.示例级到词元级再到句子级

答案:C。LLMLingua 采用 coarse-to-fine(由粗到细)策略:先做示例级去重,再删冗余句子,最后做最精细的词元级过滤。逐层缩小审查范围,既保证效率又保证精度。

Q6. 关于压缩率与任务效果的关系,下列说法正确的是?

单选题 · mid

  • A.压缩率越高推理效果越好
  • B.低压缩率完全不影响效果
  • C.超过阈值后效果会快速滑坡← 正确答案
  • D.压缩率与效果完全无关

答案:C。效果随压缩率提升呈“先平后陡”的阈值现象:低压缩率时删掉的多是冗余词,效果几乎不变;一旦越过临界点,关键信息开始受损,效果急剧下降。因此需通过验证集找到临界压缩率。

Q7. 使用 LLMLingua 压缩 Prompt 最主要的收益是?

单选题 · mid

  • A.提升模型数学推理能力
  • B.减少Token消耗降低成本← 正确答案
  • C.增大模型参数规模
  • D.让生成答案成倍变长

答案:B。LLMLingua 的直接收益是减少 Prompt 的 token 数量,从而降低按 token 计费的 API 成本和推理延迟。它不改变模型本身,也不提升模型能力,更不能让输出变长。

Q8. 关于 LLMLingua 使用的小模型,下列说法正确的有?

多选题 · mid

  • A.可直接用 GPT-2 轻量模型← 正确答案
  • B.模型越小压缩效果一定越差
  • C.判断与大模型高度一致← 正确答案
  • D.必须用推理端同款大模型

答案:AC。LLMLingua 支持 GPT-2、LLaMA-7B 等轻量模型作为困惑度评估器,实验表明其判断与大模型有较高一致性。但“越小越差”是绝对化说法,存在参数权衡空间;也并非必须用推理端同款模型,小模型和大模型的分工正是其设计精髓。

Q9. 关于压缩后 Prompt 的效果表现,下列说法正确的有?

多选题 · hard

  • A.所有任务效果必然下降
  • B.部分任务去除干扰后提升← 正确答案
  • C.需要结合任务单独评估← 正确答案
  • D.完全不影响复杂推理。

答案:BC。压缩删除的主要是冗余信息,部分任务在去除噪声后效果反而提升,所以 A 的“必然下降”不成立。但复杂推理对关键信息敏感,效果影响因任务而异,必须单独评估,因此 D 的“完全不影响”也错误。

Q10. 使用 LLMLingua 进行 Prompt 压缩时,下列做法正确的是?

多选题 · hard

  • A.所有任务统一用一个压缩率
  • B.用 target_token 控制压缩程度← 正确答案
  • C.长文档尽量不压缩直接传
  • D.压缩后需抽检关键信息保留度← 正确答案

答案:BD。target_token 是官方提供的核心控制参数,可以精确设定压缩后长度;压缩后抽检关键信息保留度是防范效果滑坡的必要手段。不同任务对压缩敏感度不同,统一压缩率不可取;长文档虽长,但恰是压缩收益最大的场景,不应回避。