基于LLM的搜索排序
大语言模型在各类语言任务中展现出了惊人的零样本泛化能力,搜索引擎自然也不例外。不过,现有研究大多集中在利用LLM的生成能力来做信息检索,却很少有人直接拿它来做段落排序。这篇EMNLP 2023的杰出论文(Outstanding Paper)干脆把问题摆到台面上:LLM到底擅不擅长搜索排序?
论文标题:Is ChatGPT Good at Search? Investigating Large Language Models as Re-Ranking Agents(https://aclanthology.org/2023.emnlp-main.923/)
核心围绕着两个问题展开:
- ChatGPT在段落重排序任务上到底表现如何?
- 能不能用一个更小的专用模型来模仿ChatGPT的排序能力?
针对第一个问题,论文提出了一个叫“排列生成”(permutation generation)的方案——让LLM直接输出一组段落的排序组合,而不是先算相关性分数再排。针对第二个问题,则用蒸馏技术,把ChatGPT的排序能力迁移到更小的专用排序模型上。
具体来说,零样本段落重排序有三种常见的指令模式(如下图,灰色和黄色块分别代表模型输入和输出):
- (a) 查询生成:依赖LLM的对数概率,根据段落反过来生成查询。
- (b) 相关性生成:直接让LLM输出相关性判断。
- (c) 排序生成:生成一组段落的排序列表。
论文选的是最后一种:把一组段落喂给LLM,每个段落配一个唯一标识符(比如[1]、[2]……),然后要求LLM根据段落与查询的相关性,输出一个降序排列的顺序。格式类似 [2] > [3] > [1] > [...] 。这种方法直接输出排序,不产生中间相关性分数,有点像list-wise的思路。
排序用的prompt模板分两种:
- 针对
text-da vinci-003:
- 针对
gpt-3.5-turbo和gpt-4:
考虑到LLM的输入长度限制,论文用了滑动窗口策略来处理更多文档。直接看示例:
第一步先对第5–8位排序,p8和p5胜出;第二步对第3–6位排序,p8和p3胜出;最后对第1–4位排序,得到最终结果。滑动窗口的方案简单直观,但从全局看,它有个潜在问题——不同段落之间的排序未必存在偏序传递关系。比如图中的p4和p5未必就比p6和p7更优。当然,眼下LLM的长度限制已经不再是瓶颈,这个策略的意义也就不那么大了。
另一方面,成本是个现实问题,用GPT-4做排序实在贵得离谱。因此很自然的想法是把GPT-4的排序能力蒸馏到小模型上。论文从MS MARCO里抽了10,000个查询,用BM25为每个查询检索20个候选段落,然后让学生模型去拟合ChatGPT对这些段落的排序输出。
上表是TREC和BEIR数据集上的评估结果,几个关键发现:
- GPT-4在两个数据集上都表现亮眼。跟monoT5(3B)比,GPT-4在TREC和BEIR上的nDCG@10分别平均提升了2.7和2.3。
- ChatGPT在BEIR上也不含糊,超过了大多数监督基线。
- 一个巧妙的组合方案:先用ChatGPT重排序得到前30个段落,再交给GPT-4重新排序。这个方法效果很好,成本却只有纯用GPT-4的1/5。
上表是TREC数据集上的消融实验,有几个有意思的结论:
- 初始段落顺序很敏感:原始实现用BM25的排名顺序作为初始输入。换成随机顺序或者反向BM25顺序后,性能明显下降。原因可能是BM25已经提供了一个不错的初始顺序,只用一次滑动窗口重排就能拿到不错的结果。
- 滑动窗口重排次数的影响:表中方法(3)(4)显示多做几次重排可能会提高nDCG@10,但nDCG@1反而下降了(比如降了3.88)。而方法(5)用GPT-4重新排序前30个段落,精度提升显著。这给出了一种实用的组合策略——先用ChatGPT粗排,再让GPT-4精排,既能省钱又能保证效果。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名