首页 > 教程攻略 > ai资讯 >基于LLM的搜索排序

基于LLM的搜索排序

来源:互联网 时间:2026-08-22 13:56:08

大语言模型在各类语言任务中展现出了惊人的零样本泛化能力,搜索引擎自然也不例外。不过,现有研究大多集中在利用LLM的生成能力来做信息检索,却很少有人直接拿它来做段落排序。这篇EMNLP 2023的杰出论文(Outstanding Paper)干脆把问题摆到台面上:LLM到底擅不擅长搜索排序?

论文标题:Is ChatGPT Good at Search? Investigating Large Language Models as Re-Ranking Agentshttps://aclanthology.org/2023.emnlp-main.923/

核心围绕着两个问题展开:

  1. ChatGPT在段落重排序任务上到底表现如何?
  2. 能不能用一个更小的专用模型来模仿ChatGPT的排序能力?

针对第一个问题,论文提出了一个叫“排列生成”(permutation generation)的方案——让LLM直接输出一组段落的排序组合,而不是先算相关性分数再排。针对第二个问题,则用蒸馏技术,把ChatGPT的排序能力迁移到更小的专用排序模型上。

具体来说,零样本段落重排序有三种常见的指令模式(如下图,灰色和黄色块分别代表模型输入和输出):

  • (a) 查询生成:依赖LLM的对数概率,根据段落反过来生成查询。
  • (b) 相关性生成:直接让LLM输出相关性判断。
  • (c) 排序生成:生成一组段落的排序列表。

论文选的是最后一种:把一组段落喂给LLM,每个段落配一个唯一标识符(比如[1]、[2]……),然后要求LLM根据段落与查询的相关性,输出一个降序排列的顺序。格式类似 [2] > [3] > [1] > [...] 。这种方法直接输出排序,不产生中间相关性分数,有点像list-wise的思路。

排序用的prompt模板分两种:

  1. 针对 text-da vinci-003
This is RankGPT, an intelligent assistant that can rank passages based on their relevancy to the query.The following are {{num}} passages, each indicated by number identifier []. I can rank them based on their relevance to query: {{query}}[1] {{passage_1}}[2] {{passage_2}}(more passages) ...The search query is: {{query}}I will rank the {{num}} passages above based on their relevance to the search query. The passages will be listed in descending order using identifiers, and the most relevant passages should be listed first, and the output format should be [] > [] > etc, e.g., [1] > [2] > etc.The ranking results of the {{num}} passages (only identifiers) is:
  1. 针对 gpt-3.5-turbogpt-4
system:You are RankGPT, an intelligent assistant that can rank passages based on their relevancy to the query.user:I will provide you with {{num}} passages, each indicated by number identifier []. Rank them based on their relevance to query: {{query}}.assistant:Okay, please provide the passages.user:[1] {{passage_1}}assistant:Received passage [1]user:[2] {{passage_2}}assistant:Received passage [2](more passages) ...userSearch Query: {{query}}.Rank the {{num}} passages above based on their relevance to the search query. The passages should be listed in descending order using identifiers, and the most relevant passages should be listed first, and the output format should be [] > [], e.g., [1] > [2]. Only response the ranking results, do not say any word or explain.

考虑到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精排,既能省钱又能保证效果。