今天是2024年11月4日,星期一,北京,天气晴
昨天有说到RAG中的长文本压缩,那么,进一步可以看看方案总结,关于prompt压缩的技术总结,在技术路线上可以分为硬提示和软提示两种路线。
事实上,核心问题是,我们应该如何去设计一个prompt 压缩算法,从而能够最大化的压缩prompt,同时又不影响LLMs的性能。这种被压缩的prompt能直接用在下游任务中吗?它的泛化性怎么样?
这些问题,都可以看看技术的技术方案,今天说的方法是个很好的索引,可以收藏后续看。
一、关于prompt压缩的技术总结
可以看看方案总结,《Prompt Compression for Large Language Models: A Survey》,https://arxiv.org/abs/2410.12388V2,可以看看几个看点。
1、提示压缩方法的说明性示例
图1:提示压缩方法的说明性示例。
硬提示方法移除低信息量的语言标记或进行释义以实现简洁。软提示方法将文本压缩成更少的特殊标记,
在硬提示中,每个标记不能关注之前删除的标记(Di)。在软提示中,经过压缩的标记(Ci)关注了所有先前的输入标记(Ii)之后,随后的输出标记(Oi)不能关注压缩标记之前的标记。
可以应用于多个场景,包括通用问答(General QA)、检索增强生成(Retrieval-Augmented Generation, RAG)、上下文学习(In-Context Learning, ICL)、基于代理的系统(Agent-based Systems)
二、硬提示压缩方法
硬提示方法包括过滤(Filtering)方法和释义(Paraphrasing)方法两种,这类方法通过删除、重写等方式直接对自然语言提示词进行压缩。
1)过滤(Filtering)方法
一个很简单的压缩思路就是删除那些不能为LLMs带来“信息”的文本,达到压缩Prompt的目的,这就是过滤的方案的核心,包括SelectiveContext、LLMLingua、LongLLMLingua、AdaComp等,也包括一些增强方案,如图;
首先是以信息熵为核心的方法都将语言模型的logits输出当做语言的信息熵。
SelectiveContext使用自信息量来量化词语重要性,删除冗余内容,LLMLingua使用小型语言模型(如GPT-2)计算困惑度,去除低信息量token,LLMLingua-2通过数据蒸馏训练分类器来保留关键token。
例如,SelectiveContext(Compressing Context to Enhance Inference Efficiency of Large Language Model,https://arxiv.org/abs/2310.06201)通过量化词汇单元的信息化量来识别并删除输入提示中的冗余或信息量较少的部分。使用Spacy的句法解析能力,将单个标记组合成名词短语,以保持文本连贯性。SelectiveContext不依赖外部模型或额外参数,可以应用于任何模型架构。
LLMLingua(LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models, https://arxiv.org/abs/2310.05736)使用一个较小的语言模型(如GPT-2)来计算内容的自我信息或困惑度,并在将自然语言提示输入到大模型之前移除冗余标记。LLMLingua在提示结构上操作,最初基于困惑度分数选择关键示例,然后应用token级过滤。
LongLLMLingua(LongLLMLingua: Accelerating and Enhancing LLMs in Long Context Scenarios via Prompt Compression(https://arxiv.org/abs/2310.06839)利用Prompt压缩增强LLMs在Long Context Scenarios下感知prompt中关键信息的能力,能够有效缓解Lost in the Middle,计算Document与Query之间的条件熵,以此来判断Document相对于Query的“重要性”。此时有两种选择,计算给定Document下的Query的熵,计算给定Query下的Document的熵。很显然考虑到Document自身拥有的信息熵可能差距非常悬殊,而且难以归一化,所以直接计算给定Document下的Query的熵更加合理。因此,提出了它的两个核心点:粗粒度压缩(Question-Aware Coarse-Grained Compression)和细粒度压缩(Question-Aware Fine-Grained Compression)。
另一种是,在模型加上一层Linear来进行token级别的分类来做压缩。也就是使用分类器模型来做,专门训一个模型:
也就是LLMLinga-2(LLMLingua-2: Data Distillation for Efficient and Faithful Task-Agnostic Prompt Compression,https://aclanthology.org/2024.findings-acl.57.pdf)训练一个token级别分类模型来做token“重要性”的识别,以此达到压缩的目的,有趣的是,压缩的实际目标与基于小模型logits的信息熵并不一致;使用双向语言模型可以做到的压缩性能上限要高出单向语言模型,并在实现上使用BERT+Classification范式,形成一个BERT的token级别分类模型,将每个token输出的logits作为起“保留”的概率,设定一个压缩比例阈值来进行压缩。
2)释义(Paraphrasing)方法,也叫改写式压缩
与其删词,不如换个写法,因此,可以释义(Paraphrasing)的方案,包括Nano-Capsulator、CompAct、FAVICOMP等;
Nano-Capsulator使用fine-tuned Vicuna-7B将原始提示词重写为更简洁的版本, CompAct专注于问答场景下的文档压缩重写
例如,Nano-Capsulator(Learning to Compress Prompt in Natural Language Formats, https://arxiv.org/abs/2402.18700): 将原始提示总结成简洁的自然语言版本,然后输入到LLM中。这个过程移除了不相关的信息,并将提示重构为流畅的句子。
压缩模型是独立于LLM操作的,并且包括语义保留损失以保留对下游任务重要的关键含义,以及一个奖励函数来优化提示对LLM的实用性。
硬提示方法通过直接操作自然语言标记来实现提示的压缩,通常保持使用自然语言单词或子单词,但结果提示可能在流畅性和语法正确性上有所欠缺。
这些方法的优势在于可以泛化到具有不同嵌入配置的LLMs,并且不需要额外的内存成本。
但也存在着诸多问题,例如,过滤后的硬提示可能会破坏语法正确性,并为LLM提供不熟悉的输入分布,可能影响其性能。此外,创建有效和精确的硬提示需要相当的人力,并且可能涉及训练模型来优化这些提示。
三、软提示压缩方法
软提示方法可能会被分为仅解码器(Decoder-Only)、编码器-解码器(Encoder-Decoder)等子类别。
1)仅解码器架构
仅解码器架构主要包括有,CC训练短软提示词来近似原始提示词的输出分布;GIST修改注意力机制,用特殊token替代原始提示词;AutoCompressor递归压缩,可处理长度达30,720的提示词。具体地:
Contrastive Conditioning (CC) (Prompt Compression and Contrastive Conditioning for Controllability and Toxicity Reduction in Language Models, https://arxiv.org/abs/2210.03162)通过训练一个较短的软提示来近似自然语言提示的输出分布,通过最小化token序列之间的Kullback-Leibler (KL) 散度。这种方法需要对自然语言提示和软提示进行重复序列采样,以估计输出分布。CC方法可以针对特定的自然语言提示进行训练,但泛化能力有限,因为新的提示需要从头开始重新训练。
Gist Tokens (GIST) (Learning to Compress Prompts with Gist Tokens, https://arxiv.org/pdf/2304.08467)通过在原始提示token后追加一系列新的可训练token来修改LLM的注意力机制。这些压缩token可以关注原始提示,而新生成的token只能关注压缩token,从而在注意力流中实现分离。GIST方法能够泛化到未见过的提示,而不需要额外的微调。
AutoCompressor (Adapting Language Models to Compress Contexts, https://arxiv.org/pdf/2305.14788)可以处理长上下文提示的压缩,其过程是递归的,将原始提示分成多个子提示,每个子提示被压缩成一小组token,然后与新的子提示一起传递给下一次迭代以进行进一步压缩。
2)编码器-解码器架构
采用编码器-解码器架构方案的,主要有ICAE专注于压缩信息密集的上下文,保持问题部分不变;500xCompressor通过KV值存储实现高压缩比;xRAG使用冻结的嵌入模型作为编码器;UniICL专注于压缩few-shot示例。
具体地:
In-Context AutoEncoder (ICAE) (In-context Autoencoder for Context Compression in a Large Language Model, https://arxiv.org/pdf/2307.06945)通过使用冻结的LLM作为解码器来增加压缩长度。将长而信息丰富的上下文压缩成少量token,然后用于问答。ICAE可以处理详细的、复杂的上下文,而问题本身保持未压缩,答案是基于压缩的上下文和未压缩的问题生成的。
500xCompressor (500xCompressor: Generalized Prompt Compression for Large Language Models,https://arxiv.org/abs/2408.03094)在保持压缩长度限制的同时实现高压缩比的提示压缩。与ICAE类似,500xCompressor在编码器中使用可训练的LoRA参数,同时保持原始LLM在解码器中冻结。不同之处在于,500xCompressor向解码器提供压缩token的K V值,而不是token本身,这些K V值保留了比嵌入向量更详细的信息。
xRAG(xRAG: Extreme Context Compression for Retrieval-augmented Generation with One Token) 使用冻结的嵌入模型作为编码器,只有编码器和解码器LLM之间的适配器包含可训练参数。xRAG证明了当前的嵌入模型可以将信息压缩到单个token中,用于问答任务。
UniICL(Unifying Demonstration Selection and Compression for In-Context Learning, https://arxiv.org/abs/2405.17062)专注于压缩输入提示的示例组件,留下查询不变。UniICL中唯一可训练的组件是放置在编码器和解码器之间的投影器。UniICL的编码器和解码器都是冻结的,减少了训练过程中的梯度计算,并节省了加载LLM所需的内存。
总结
本文主要介绍了看看方案总结,关于prompt压缩的技术总结,在技术路线上可以分为硬提示和软提示两种路线,对于进一步的细节,可以看看列出来的论文,大家可以多看看,多思考。
参考文献
1、https://arxiv.org/abs/2410.12388V2
2、https://zhuanlan.zhihu.com/p/660805821
关于我们
老刘,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
对大模型&知识图谱&RAG&文档理解感兴趣,并对每日早报、老刘说NLP历史线上分享、心得交流等感兴趣的,欢迎加入社区,社区持续纳新。
加入会员方式:关注公众号,在后台菜单栏中点击会员社区->会员入群加入