文献阅读:LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models
文献阅读:LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models
- 文献链接:https://arxiv.org/abs/2310.05736
- 项目链接:https://llmlingua.com/
- GitHub链接:https://github.com/microsoft/LLMLingua
1. 文章简介
这篇文章是微软在23年10月发表的一篇针对LLM的prompt压缩的文章。
众所周知,自从22年底ChatGPT横空出世以来,LLM基本就是杀疯了的感觉,各大公司都在疯狂涌入这一赛道,然后对于LLM的使用就成了其中一个核心课题,各种针对大模型的prompt工程文章层出不穷,甚至一些奇奇怪怪的prompt调优方法也一个接一个的涌出(比如:继奶奶漏洞后又一个离奇指令!“给你20美元”,立马提升ChatGPT效果)。
但是,整体来说,最常用的经验一直都是:
- 越详细的prompt可以带来约好的效果;
- prompt当中增加IcT可以优化生成效果;
而这些经验基本上都要求越来越长的prompt设计,且在实际应用当中,往往user context本身也包含了大量的文本信息,这就更加恶化了问题,使得prompt更加的冗长,给模型增加了大量的运算量,影响模型的推理速度和生成效果。
因此,一个很重要的prompt优化的方向就是给prompt进行瘦身操作,而这篇文章的核心就是一个新的压缩prompt的方法(LLMLingua),使得可以在尽可能保持生成效果的前提下对prompt进行充分的压缩。
下面,我们就来看看它的具体实现方法。
2. 方法介绍
首先,我们来看一下文中的给出的LLMLingua瘦身法的整体方法示意图:
可以看到:
- 整体上来说,LLMLingua的思路就是使用一个额外的小模型来对原始的长文本进行文本内容的压缩,然后交给LLM进行最终的回答生成。
类似的工作其实早些时候同样有一个Selective Context走的是类似的路子,文中也提到是inspired by这个工作,但是区别在于,同样用文中的话来说,LLMLingua更加精细一些。
下面,我们来看一下LLMLingua的具体构成,如上述示意图所示,LLMLingua主要包括了三个组成部分:
- Budget Controller
- 用于demonstration的压缩,从而粗颗粒度地控制budget
- Prompt Compresser
- 对于prompt进行进一步的细颗粒度的压缩,得到最终的输出prompt;
- Distribution Alignment
- 用于消除压缩用小模型 M s M_s Ms与LLM之间的分布gap
下面,我们具体来考察一下这三部分的内容:
1. Budget Controller
首先,我们给出文中关于Budget Controller部分的伪代码说明:
可以看到,Budget Controller的输入为一个小的语言模型和原始的prompt输入,输出则是选择后的压缩demonstration。
具体来说的话,就是先用一个粗颗粒度的compressor对所有的demonstration进行压缩,然后按照ppl进行排序和筛选,将最具有代表性的case进行输出。
2. Iterative Token-level Prompt Compression (ITPC)
然后,我们来看一下ITPC部分的伪代码:
可以看到:
- 这里整体的思路就是在token层面使用MLM的方式计算每个token的ppl,然后选择ppl最高的token进行保留,从而对prompt进行二次压缩,保留其中最有信息量的token组成最终的prompt。
3. Distribution Alignment
最后,考虑到这里引入了第二个Language Model,因此这个小模型计算出来的ppl和大模型真实的词向量分布之间可能存在一定的gap,用人话说就是小模型认为的最有信息量的文本并不一定被大模型认为是最具有信息量的文本,因此为了优化效果,需要将这个小模型与实际使用的大模型进行对齐。
而具体到实现方面,其实就是使用LLM的一些生成结果对小模型进行以下finetune。
3. 实验结果 & 结论
下面,介绍完了方法之后,我们来看一下文中关于LLMLingua的具体实验结果。
1. 基础实验结果
首先,关于文中给出的基础实验,主要是在以下几个任务和数据集上进行考察:
- 推理(Reasoning)
- GSM8K
- BBH
- 语义理解(Understanding)
- ShareGPT
- 概括(Summarization)
- Arxiv March23
得到结果如下:
可以看到:
- 在相同的压缩率,甚至更高的压缩率下,LLMLingua相较于其他的prompt压缩方法都能够获得更好的生成效果。
2. 消解实验
此外,文中还对LLMLingua使用的几个具体的方法进行了消解实验,得到结果如下:
可以看到:
- ITPC,Budget Controller等技术都能够有效的提升压缩的prompt的效果,在同等的压缩效果下获得最好的效果表达。
3. 讨论 & 局限
此外,文中还考察了一下换用不同的LLM以及不同的小模型之后LLMLingua方法的有效性,得到结果如下:
-
不同的LLM下Lingua的效果
-
不同的小模型下Lingua的效果
可以看到:
- LLMLingua方法对于不同的大模型,不同的压缩小模型都具备相对可靠的效果,具有很好的鲁棒性。
此外,文中还研究了一下大模型infer的输出文本长度与压缩率的关系,或者说与输入的prompt长度的关系,得到结果如下:
可以看到:
- 压缩比例越高,输入的prompt长度越短,对应会获得的输出的文本长度也同样就会越短,使得整体的效率提升更多。
文中最后还给出了LLMLingua实际的运行效率结果如下:
可以看到:
- 使用LLMLingua之后,尽管多了一个小模型的压缩环节,整体的端到端运行效率依然是有大幅提升的,且压缩程度越高,整体的效率提升越多。
不过,这也不是说LLMLingua就完美无缺了,文中还考察了一下压缩率对模型效果的影响,得到结果如下图所示:
可以看到:
- 尽管当压缩比例较小时,LLMLingua对效果有着较好的保留效果,但是当压缩率高于20时,模型效果出现显著的下降。
4. 总结 & 思考
综上所述,文中主要还是提出了一种Prompt的压缩方法,可以在尽可能保留生成效果的前提下压缩prompt长度,从而提升infer速度以及节约成本。
这个技术感觉还是非常有价值的,譬如我们工作中涉及的推荐场景,当用户有着极大量的用户历史的情况下,prompt就会异常的长,此时调用LLM就会是一个极大的负担,即使我们知道LLM有时可以给出很好的用户画像以及相关推荐,调用模型本身也会是一个巨大的负担,但是使用了LLMLingua之后,上述问题就可以得到很好的处理了。
因此整体上这个技术感觉还是很有意思的,感觉可以一试,不过前提也是复现起来比较简单了……
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)