这篇文章是微软在23年10月发表的一篇针对LLM的prompt压缩的文章。
众所周知,自从22年底ChatGPT横空出世以来,LLM基本就是杀疯了的感觉,各大公司都在疯狂涌入这一赛道,然后对于LLM的使用就成了其中一个核心课题,各种针对大模型的prompt工程文章层出不穷,甚至一些奇奇怪怪的prompt调优方法也一个接一个的涌出(比如:继奶奶漏洞后又一个离奇指令!“给你20美元”,立马提升ChatGPT效果)。
但是,整体来说,最常用的经验一直都是:
而这些经验基本上都要求越来越长的prompt设计,且在实际应用当中,往往user context本身也包含了大量的文本信息,这就更加恶化了问题,使得prompt更加的冗长,给模型增加了大量的运算量,影响模型的推理速度和生成效果。
因此,一个很重要的prompt优化的方向就是给prompt进行瘦身操作,而这篇文章的核心就是一个新的压缩prompt的方法(LLMLingua),使得可以在尽可能保持生成效果的前提下对prompt进行充分的压缩。
下面,我们就来看看它的具体实现方法。
首先,我们来看一下文中的给出的LLMLingua瘦身法的整体方法示意图:
可以看到:
类似的工作其实早些时候同样有一个Selective Context走的是类似的路子,文中也提到是inspired by这个工作,但是区别在于,同样用文中的话来说,LLMLingua更加精细一些。
下面,我们来看一下LLMLingua的具体构成,如上述示意图所示,LLMLingua主要包括了三个组成部分:
下面,我们具体来考察一下这三部分的内容:
首先,我们给出文中关于Budget Controller部分的伪代码说明:
可以看到,Budget Controller的输入为一个小的语言模型和原始的prompt输入,输出则是选择后的压缩demonstration。
具体来说的话,就是先用一个粗颗粒度的compressor对所有的demonstration进行压缩,然后按照ppl进行排序和筛选,将最具有代表性的case进行输出。
然后,我们来看一下ITPC部分的伪代码:
可以看到:
最后,考虑到这里引入了第二个Language Model,因此这个小模型计算出来的ppl和大模型真实的词向量分布之间可能存在一定的gap,用人话说就是小模型认为的最有信息量的文本并不一定被大模型认为是最具有信息量的文本,因此为了优化效果,需要将这个小模型与实际使用的大模型进行对齐。
而具体到实现方面,其实就是使用LLM的一些生成结果对小模型进行以下finetune。
下面,介绍完了方法之后,我们来看一下文中关于LLMLingua的具体实验结果。
首先,关于文中给出的基础实验,主要是在以下几个任务和数据集上进行考察:
得到结果如下:
可以看到:
此外,文中还对LLMLingua使用的几个具体的方法进行了消解实验,得到结果如下:
可以看到:
此外,文中还考察了一下换用不同的LLM以及不同的小模型之后LLMLingua方法的有效性,得到结果如下:
可以看到:
此外,文中还研究了一下大模型infer的输出文本长度与压缩率的关系,或者说与输入的prompt长度的关系,得到结果如下:
可以看到:
文中最后还给出了LLMLingua实际的运行效率结果如下:
可以看到:
不过,这也不是说LLMLingua就完美无缺了,文中还考察了一下压缩率对模型效果的影响,得到结果如下图所示:
可以看到:
综上所述,文中主要还是提出了一种Prompt的压缩方法,可以在尽可能保留生成效果的前提下压缩prompt长度,从而提升infer速度以及节约成本。
这个技术感觉还是非常有价值的,譬如我们工作中涉及的推荐场景,当用户有着极大量的用户历史的情况下,prompt就会异常的长,此时调用LLM就会是一个极大的负担,即使我们知道LLM有时可以给出很好的用户画像以及相关推荐,调用模型本身也会是一个巨大的负担,但是使用了LLMLingua之后,上述问题就可以得到很好的处理了。
因此整体上这个技术感觉还是很有意思的,感觉可以一试,不过前提也是复现起来比较简单了……