虽然由精密的嵌入 (embedding)模型驱动的密集检索器擅长理解语义关联 (semantic relationship)和用户意图,但它们有时在要求精确词语匹配的查询上可能力有不逮。例如,模型可能把握查询的大致主题,但未能优先显示包含非常具体但较不常见的产品代码或技术术语的文档。反之,传统的稀疏检索器如BM25擅长查找这些精确词语,但缺乏更广泛的上下文 (context)理解能力,无法检索语义相似但词语不同的内容。它们基于关键词匹配运作,这种方式虽然精准,但在面对同义词、转述或复杂自然语言查询时可能表现欠佳。
混合搜索通过结合密集和稀疏检索方法的优点,提供了一种实用且通常非常有效的方案。目标是建立一个更全面、更可靠的检索流程,既能获取嵌入提供的语义细节,又能保持稀疏方法的关键词精准度。这种协作方式有助于确保提供给生成模型的信息尽可能相关和完整。
两种视角的优势
结合密集和稀疏检索器为您的RAG系统带来多项优势,显著提升信息管道的质量:
- 召回率提升: 您会提高找到所有相关文档的概率。如果一个文档因不寻常的措辞或罕见关键词而被密集检索器遗漏,稀疏检索器可能会发现它,反之亦然。
- 精准度提升(可能): 仅简单合并结果可能会增加干扰,但精密的整合技术通常会偏向于被两个系统都高度排序的文档。这种共识可以作为相关性的有力迹象。
- 查询多样性的适应性: 该系统能更有效地处理更广泛的查询类型。它既能处理模糊的、对话式的查询(密集搜索在此表现突出),也能处理高度具体的、关键词驱动的查询(稀疏搜索在此表现出色)。
- 更好地处理专业术语: 稀疏检索器确保了重要的专业标识符、缩写或行话,这些可能在通用嵌入 (embedding)模型训练数据中代表性不足,但仍能被有效检索出来。
设想一个金融RAG应用中的情形。用户可能会问:“XYZ法规对科技公司的第三季度收益有何影响?”密集检索器可以找到一般性讨论收益和科技公司的文档。稀疏检索器将确保明确提及“XYZ法规”的文档被找到。混合方法理想情况下会优先显示同时满足查询两个方面的文档。
混合搜索的构建:整合策略
实现混合搜索最常见的方法是分数整合(也称为后期整合)。在此设置中,密集和稀疏检索器都独立处理输入查询。每个都会生成一份候选文档列表及其相应的相关性分数。核心任务在于智能地将这两组结果合并成一个重新排序的列表。
混合搜索的一种常见架构涉及并行检索,随后进行整合步骤以合并并重新排序结果。
融合这些分数有多种方法:
-
加权求和:
这是一种直接的方法,其中文档 d 的最终分数是其在密集检索器 (Sdense(d)) 和稀疏检索器 (Ssparse(d)) 中的归一化 (normalization)分数的加权组合。
S混合(d)=w密集⋅归一化(S密集(d))+w稀疏⋅归一化(S稀疏(d))
这里,w密集 和 w稀疏 是总和为1的权重 (weight)(例如,w密集=0.6,w稀疏=0.4),反映了每个检索器的感知重要性。函数 归一化() 表示分数归一化,这是一个稍后会讨论的重要步骤。权重的选择通常是基于经验的,可能需要根据您的特定数据集和查询模式进行调整。
-
倒数排名整合(RRF):
RRF 提供了一种优雅的方式来合并排名,无需过多担忧绝对分数的值或它们的分布,因为这些在不同检索系统之间可能有显著差异。对于每个文档 d,其RRF分数通过将其在每个检索器结果列表中的排名的倒数相加计算得出。
RRFScore(d)=i∈检索器∑k+排名i(d)1
如果一个文档未被某个检索器找到,其在该检索器中的排名可以视为无限大(或实际上是一个非常大的数字),从而使其对总和的贡献可忽略不计。常数 k(通常为60)有助于降低仅被一个检索器高度排序但被其他检索器低度排序的文档的影响。在多个系统中持续表现良好的文档会获得更高的RRF分数。
-
两阶段检索(级联):
另一种方法涉及级联或两阶段流程。
- 稀疏-密集: 首先,使用快速稀疏检索器(如BM25)迅速获取更大范围的候选文档集合(例如,前100个)。然后,仅对这个更小、预筛选的集合应用计算量更大的密集检索器(或重排序器,如下一节所述)。这对于非常大的文档集合来说可以很高效。
- 密集-稀疏: 对于初始检索来说不太常见,但可以先使用密集检索找到语义相关的候选文档,然后使用稀疏匹配作为过滤器或增强功能,以筛选或提升包含精确关键词的文档。
整合策略的选择通常取决于您数据的特征、预期的查询类型以及可用的计算资源。
有效整合的实施细节
成功实施混合搜索需要注意一些重要细节:
分数归一化 (normalization)
稀疏检索器(如BM25)和密集检索器(嵌入 (embedding)的余弦相似度)生成的分数具有不同的量纲和分布。BM25分数范围较广,而余弦相似度通常在-1到1之间(对于正向嵌入,则在0到1之间)。在不进行归一化的情况下直接将这些分数加权求和,可能导致一个检索器的分数压倒另一个,无论选择的权重 (weight)如何。
常见的归一化方法包括:
- 最小-最大缩放: 将分数缩放到特定范围,通常是[0, 1]。
S归一化=(S−S最小值)/(S最大值−S最小值)
- Z-分数标准化: 将分数转换为平均值为0、标准差为1的形式。
S归一化=(S−μ)/σ
- 基于排名的归一化: 直接使用排名(如RRF所做)可以避免分数缩放问题。
归一化的 S最小值、S最大值、μ 和 σ 参数 (parameter)理想情况下应从每个检索器的一组代表性查询结果中估算得出。
分数整合中的加权方案
如果使用加权求和,确定最佳权重(w密集 和 w稀疏)非常重要。
- 固定权重: 这些是固定值,通常通过在验证数据集上进行实验来确定。您可以从 w密集=0.5,w稀疏=0.5 开始,然后进行调整。
- 动态权重: 对于更先进的系统,权重可以根据查询特性进行动态调整。例如,一个包含特定实体的非常短的查询可能更偏好较高的 w稀疏,而一个更长、更具描述性的查询可能更偏好较高的 w密集。实施此功能通常需要一个查询分析组件。
- 学习权重: 也可以训练一个小型模型(例如,逻辑回归)来学习最佳权重,利用查询和检索到的文档的特征。然而,这会增加系统的复杂性。
对于大多数生产RAG系统,从RRF或经过良好调整的静态加权求和开始,能够提供一个可靠的起点。
检索器选择
- 稀疏检索器: BM25是一种广泛采用的选择,可在Elasticsearch、OpenSearch和Python中的
rank_bm25等库中使用。
- 密集检索器: 可选范围包括来自Sentence Transformers等库的预训练 (pre-training)模型(例如,
all-MiniLM-L6-v2、multi-qa-mpnet-base-dot-v1)到更强大的专有模型,或您根据特定专业进行微调 (fine-tuning)的模型(如“嵌入模型专业微调”一节中所述)。
混合搜索性能评估
评估混合搜索设置时,请考虑:
- 在基准数据集上使用标准检索指标(nDCG、MAP、Precision@K、Recall@K)。将混合系统与每个独立的检索器进行比较。
- 在实际环境中进行不同整合策略或权重 (weight)的A/B测试,以衡量其对后续RAG任务性能(例如,答案质量、用户满意度)的影响。
- 定性分析:手动审查混合系统与独立检索器结果显著不同的查询。理解在这些情况下它表现更好(或更差)的缘由。这可以为进一步调整提供参考。
混合搜索中的难题
尽管强大,混合搜索也带来一些考虑:
- 复杂度: 您需要管理和维护两个不同的检索系统,包括它们的索引、查询和更新。
- 调整工作: 寻找最佳整合策略、归一化 (normalization)方法和权重 (weight)可能需要细致的实验。
- 计算成本: 运行两个检索器通常会比单个检索器带来更高的延迟和计算成本,尽管稀疏-密集等策略可以减轻此问题。
尽管存在这些难题,检索质量上的好处通常使混合搜索成为要求高准确性和适应性的生产RAG系统的一项值得的投入。通过将稀疏搜索的词汇精准度与密集搜索的语义理解相结合,您为生成模型构建了一个更具弹性和效用的支持。