作者 | 酯基
整理 | NewBeeNLP
https://zhuanlan.zhihu.com/p/660596492
后台留言『交流』,加入 NewBee算法讨论组
重排器(Reranker)作为信息检索的第二阶段,需要根据查询和文档的相关性,对候选文档做细粒度的排序。经典的重排方法一般使用交叉编码器,结合文档和查询的语义信息进行打分和排序。
现有的涉及LLM的重排方法大致可以分为三类:
本文中针对前两种方法介绍一些研究。
排序学习方法主要分为point-wise,pair-wise以及list-wise三种思路,LLM通过prompt进行重排也类似。
参考综述:Large Language Models for Information Retrieval: A Survey[1]
Zero-Shot Listwise Document Reranking with a Large Language Model
这篇文章中,与现有的score and rank的point-wise打分方式不同,作者提出一种名为
Listwise Reranker with a Large Language Model (LRL) 的方法,利用GPT-3对文档进行list-wise的排序,直接生成候选文档的identifier序列实现重排。
作者提到,这种list-wise的方法能够让模型同时关注到所有的文档信息。
具体地,作者使用如下的instruction让LLM实现文档的重排:
prompt1模型将根据提示在方括号后生成一系列按相关性重新排序后的passage id。
为了更好地对比,作者还采用了如下方法实现point-wise的打分:
prompt2此方法中,采用模型生成的第一个token中True与False的概率分布作为具体的分数进行排序。
RankVicuna: Zero-Shot Listwise Document Reranking with Open-Source Large Language Models
RankVicuna 也是一种Listwise的LLM排序方法,但是不同于LRL,它是经过针对重排微调后的模型。利用RankGPT-3.5作为教师模型在MS MARCO v1训练集中随机抽样的100K套训练集文档上生成数据,将RankGPT的能力蒸馏到7B的RankVicuna中。
RankVicuna推理和训练时使用的promptLarge Language Models are Effective Text Rankers with Pairwise Ranking Prompting
本文中,作者提出利用LLM做list-wise与point-wise重排任务时,模型存在无法很好地理解排序指令的问题,并且在越小规模的模型中越显著。作者认为这一问题有可能与预训练中缺少相应任务有关。
LLM应用于list-wise时出现的问题针对这一问题,作者提出一种名为 pairwise ranking prompting (PRP) 的范式,设计了一种简单的prompt,结合了生成和打分的模型API,使得规模较小的开源模型也能够在公开数据集上实现SOTA.
PRP的prompt设计如下图所示,输入为u(q,d_1,d_2)的三元组形式。利用LLM对输入敏感这一特性,同一个三元组会变换顺序输入模型两次,即u(q,d_1,d_2)和u(q,d_2,d_1),若两次判断相反,则记为 d_1=d_2。
PRP图示用上述的PRP作为一个单元,作者还提出了三种变体:PRP-Allpair、SORTING-BASED以及SLIDING WINDOW
RankVicuna以及几种baseline模型在DL19和DL20数据集上的结果如下图所示。可以看出,仅7B参数的RankVicuna的重排能力甚至能够媲美175B参数的基于GPT3.5的模型。
RankVicuna的结果与LRL与PRP的对比Few-shot Reranking for Multi-hop QA via Language Model Prompting
本文中,作者提出一种名为 PROMPTRANK 的框架,依靠prompting和多跳重排,可以在少样本的前提下解决复杂的多跳问答(MQA)。
多跳问答(multi-hop question answering, MQA)是指query对应多个文档,且回答问题需要结合召回的复数文档进行多步推理的场景。目前的MQA大多基于retrieve-then-read的pipeline,然而这种模式下往往需要大规模的训练数据,对低资源场景(如医疗、法律等特定领域)不友好。
使用TF-IDF相似度得到初步的候选文档集,再使用LLM进行重排。
LLM对召回的文档先进行打分,保留top K_1个文档,用超链接对这些文档进行扩展,再用LLM对扩展文档打分并挑选top K_2的文档,如此往复直到到达最大深度H。
给定一个查询q和推理路径c,作者使用条件概率作为LLM打分的依据,定义如下式:
其中 为给定模型提示 ,模型产生问题q的概率。特别地,作者提到在实验中,使用 的效果要显著地好于 。
作者解释称,这一方面是由于LLM对输入格式很敏感,使用 产生的分数可靠性较低。另一方面, 中prompt的格式,即问题位于文档后的形式,与LLM预训练语料的格式较为接近(例:FAQ),使得模型能够更加适应这种任务。
在指令的编写中,作者使用了Instruction Search的方法,即不使用人工编写instruction,而是让语言模型进行填空,例如:
Task: < X > documents and < Y > question. Question:
mask部分可以填为 _< X > = “Read the following” and < Y > = “answer the”_,作者采用了两种不同的模板,并且用不同的instruction的最终得分进行集成,得到最终分数。
作者提到,结合不同prompt所得结果的分数能够使分数稳定,降低最终分数对不同prompt的敏感度。
在提示中,作者还考虑了添加示例。但是由于模型输入长度限制,每个输入最多只能加入一个示例。作者同样通过集成的方法来解决这一问题,即每个提示包含一个不同的示例,最终通过集成不同提示的得分,使模型同时能从多个示例中进行学习。
实验部分,作者采用HotpotQA,一个多跳查询的数据集,以及2WikiMQA进行测试。评价指标使用召回率Recall@2/10/20。
在实验中,作者用语言模型生成了200种instructions并随机采样其中10个,集成分数的方法采用最大值。从结果中可以看出,零样本的PROMPTRANK已经可以显著地提升召回表现,甚至超越了完全监督的DrKit。
HotpotQA结果结果也显示,示例的加入可以进一步提升模型表现。从下图中可以看出随着示例的加入,模型的性能有较大的提升。由于输入长度限制(1024 tokens),每次输入的示例不会超过2个,这个结果也证明了Demonstration Ensembling这一方法的有效性。
示例数量的影响LLM不同于传统的交叉编码器,具有更强的语义理解能力,并且能够捕捉到文档列表整体的顺序信息,它仍然面对几个不可忽视的问题。
一方面,LLM的输入长度对于一个文档列表来说还是十分受限的,必须通过滑动窗口或集成的方式才能实现文档输入。另一方面,list-wise的LLM重排器对于输入非常敏感,在某些极端的情况下,例如将输入文档随机打乱顺序时,模型的输出结果甚至可能不如BM25。另外,还有参数过剩与时效性的问题会导致LLM重排器难以落地。
想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定o要备注信息才能通过)
Large Language Models for Information Retrieval: A Survey: https://arxiv.org/abs/2308.07107v2