09. 检索结果重排序与优化-重排序基本原理

0 阅读4分钟

09. 检索结果重排序与优化-重排序基本原理

1. 概述 📚

我们将学习重排序的基本原理,了解它在RAG流程中的重要作用。重排序能够对初步召回的结果进行二次筛选和打分,把最相关的文档排在前面,过滤掉不相关的内容,提升检索效果。

2. 为什么需要重排序 🤔

我们将理解为什么需要在检索流程中引入重排序环节 🎯。通过上篇文档的学习,我们掌握了混合检索技术,它能够结合稀疏检索和稠密检索的优势,提升召回率 📈。但在实际应用中,我们发现单纯依靠向量相似度或关键词匹配进行召回,往往会面临一些难以解决的问题 ⚠️。

第一个问题是语义相似但不相关 😵。向量检索通过计算查询和文档的向量相似度来召回结果,但相似度高并不代表真正相关。比如用户搜索"IT部在哪办公",向量检索可能召回"IT部负责办公设备维修",因为这两个句子在语义上很相似,但实际上回答的是完全不同的问题 ❌。

第二个问题是召回率与精确率的矛盾 ⚖️。为了提高召回率,我们通常需要召回更多的候选文档(比如Top 50),但这会导致精确率下降 📉。在这50个候选文档中,真正相关的可能只有5个,其余45个都是干扰信息。如果把这些干扰信息全部送给大模型,会严重影响生成质量 😰。

第三个问题是上下文窗口的限制 📏。大模型的上下文窗口是有限的,我们无法把所有召回的文档都送进去。即使上下文窗口足够大,还存在"迷失中间"现象——模型对长上下文的开头和结尾关注度高,中间部分容易被忽略 👀。

重排序就是解决这些问题的关键 🔑。它像一个"阅卷老师" 🧑‍🏫,对初步召回的结果进行二次筛选和打分,把最相关的文档排在前面,过滤掉不相关的内容 ✨。这样既能保证高召回率,又能提高精确率,还能减少送给大模型的文档数量,提升整体效果 🚀。

接下来我们将学习重排序的基本原理,了解它是如何工作的 💡。

3. 重排序的基本原理 ⚙️

我们将学习重排序的基本原理,了解它是如何工作的 💡。重排序的核心是使用交叉编码器(Cross-Encoder)模型,它与我们之前学习的双编码器(Bi-Encoder)有很大的区别。

3.1 双编码器与交叉编码器的区别

在之前的文档中,我们学习了向量检索使用的双编码器模型。它的工作方式是分别对查询和文档进行编码,生成独立的向量,然后通过计算向量相似度来召回结果。这种方式速度快,但精度相对较低,容易出现语义相似但不相关的问题。

交叉编码器则完全不同。它不生成独立的向量,而是将查询和文档拼接在一起输入模型,直接输出两者的相关性分数。这样可以更深入地分析查询和文档之间的逻辑关系,精准识别微小的语义差异,区分相关与无关内容。

对比项双编码器(Bi-Encoder)交叉编码器(Cross-Encoder)
编码方式分别编码查询和文档,生成独立向量拼接查询和文档,联合编码
计算方式向量相似度计算直接输出相关性分数
精度较低较高
速度较快较慢
适用场景召回阶段(Top 50)重排序阶段(Top 5)

3.2 重排序的工作流程

重排序的工作流程通常包括以下几个步骤:

  1. 初步召回:使用混合检索(稀疏+稠密)召回较多的候选文档(如Top 50)
  2. 重排序打分:使用交叉编码器模型对每个候选文档进行打分
  3. 重新排序:根据打分结果重新排序,选择最相关的文档(如Top 5)
  4. 送给大模型:将重排序后的文档送给大模型生成回答

这样既能保证高召回率,又能提高精确率,还能减少送给大模型的文档数量,提升整体效果 🚀。

3.3 重排序的优势

重排序相比单纯的向量检索有以下优势:

  • 更高的精度:能够精准识别查询和文档之间的语义关系
  • 更好的区分度:可以区分语义相似但不相关的内容
  • 减少干扰信息:过滤掉不相关的文档,提高生成质量
  • 更合理的排序:将最相关的文档排在前面,符合用户需求