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 重排序的工作流程
重排序的工作流程通常包括以下几个步骤:
- 初步召回:使用混合检索(稀疏+稠密)召回较多的候选文档(如Top 50)
- 重排序打分:使用交叉编码器模型对每个候选文档进行打分
- 重新排序:根据打分结果重新排序,选择最相关的文档(如Top 5)
- 送给大模型:将重排序后的文档送给大模型生成回答
这样既能保证高召回率,又能提高精确率,还能减少送给大模型的文档数量,提升整体效果 🚀。
3.3 重排序的优势
重排序相比单纯的向量检索有以下优势:
- 更高的精度:能够精准识别查询和文档之间的语义关系
- 更好的区分度:可以区分语义相似但不相关的内容
- 减少干扰信息:过滤掉不相关的文档,提高生成质量
- 更合理的排序:将最相关的文档排在前面,符合用户需求