生成 · 2023
上下文压缩
检索之后先把段落压短,只把和问题有关的句子送进模型。
要解决的问题
重排序之后的段落仍然很长。无关句子占用上下文,也增加费用和干扰。
相对前一代的变化
重排序决定哪些段落留下。压缩决定留下的段落里,哪些句子或哪段摘要真正进入提示词。
做法
RECOMP 训练抽取式或摘要式压缩器,无关时甚至可以输出空摘要。LongLLMLingua 则按问题对提示词里的词做删减。工程上也可以只抽取包含答案线索的句子。
局限
压缩会丢掉跨句才能看懂的条件。摘要式压缩还可能把原文改写错。
在链路中的位置
在重排序之后、最终生成之前。
详解
「详解」根据 Datawhale《All-in-RAG》 的 检索进阶技术 改写,有删节和重组,未包含原教程的代码、图片和练习。原教程与本节详解均按 CC BY-NC-SA 4.0 许可提供:使用时需署名并标明修改,不得用于商业目的,再次改编须以相同许可共享。
命中的段落里仍有大量无关句子
重排序决定哪几块留下。压缩决定留下的块里,哪些句子进入提示词。上下文压缩检索器先按普通方式召回,再把文档交给压缩器;压缩器可以删除无关句子,也可以写成更短的摘要。
重排和压缩可以串成管道
一个实用顺序是:向量召回,ColBERT 或交叉编码器重排,再用模型抽取与问题有关的句子。前面的步骤缩小阅读范围,后面的步骤减少 token。LlamaIndex 的响应合成也有类似选择:refine 逐块修正答案,compact 尽量把多块塞进一次调用。压缩发生在生成最终答案之前。
压缩可能把条件一起删掉
抽取式压缩保留原句,风险是跨句的例外和定义被拆开。摘要式压缩更短,也更容易改写数字、否定和主体。压缩后应抽查原块和结果:关键数字还在不在,否定有没有被反过来,引用能否回到原句。