多路召回设计
- 引言2. BM25(Best Matching 25)检索BM25(Best Matching 25) 是一种在信息检索(Information Retrieval)领域广泛使用的排名函数,用于评估一个文档与搜索查询的相关性。它是基于概率检索框架对 TF-IDF 算法的改进,特别是在处理...
引言
BM25(Best Matching 25)检索
BM25(Best Matching 25) 是一种在信息检索(Information Retrieval)领域广泛使用的排名函数,用于评估一个文档与搜索查询的相关性。它是基于概率检索框架对 TF-IDF 算法的改进,特别是在处理词频饱和及文档长度归一化方面表现更为优秀。
目前,BM25 及其变体(如 BM25F)是 Lucene、Elasticsearch 和 Solr 等主流搜索引擎的默认相关性评分算法。
1. 核心公式
BM25 的核心思想是计算查询 $$ 的相关性分数,并将这些分数累加。
其标准数学公式如下:
变量含义说明:
- $$ 的最终相关性得分。
- $$ 个关键词(Query Term)。
- $$ 的逆文档频率(Inverse Document Frequency)。
- $$ 中出现的频率(Term Frequency)。
- $$ 的长度(即文档中词的总数)。
- $$:表示整个文档集合中所有文档的平均长度(Average Document Length)。
- $$ 之间)。
- $$)。
2. 公式拆解与原理
BM25 公式主要由三个部分组成:IDF 组件、TF 饱和度组件 和 文档长度归一化组件。
2.1 IDF (逆文档频率)
IDF 用于衡量一个词的稀有程度。如果一个词在很多文档中都出现(如 "的", "是"),它的权重应该很低;如果一个词很少出现,它的权重应该很高。
BM25 中使用的 IDF 公式通常为:
其中:
- $$:表示索引中的文档总数。
- $$ 的文档数量。
- $$:用于平滑处理,防止除以零或取对数负无穷。
2.2 TF (词频) 与 饱和度 ($$)
在传统的 TF-IDF 中,词频得分是线性的(或对数的),这意味着一个词出现次数越多,得分越高且无上限。但在实际搜索中,一个词出现 100 次并不代表其相关性是出现 1 次的 100 倍。
BM25 引入了参数 $$ 来控制词频的饱和度:
- 当 $$(在忽略长度归一化的情况下)。
- 这意味着一旦一个词在文档中出现了一定次数,再次出现对分数的贡献会急剧减小。
2.3 文档长度归一化 ()
长文档往往包含更多的词,因此更容易包含查询词。为了公平起见,需要对长文档进行惩罚,对短文档进行补偿。
分母中的 部分负责此功能:
- 如果 $(长文档),分母变大,得分降低。
- 如果 $$(短文档),分母变小,得分提高。
- 参数 $****$ 控制归一化的强度:
- :完全归一化。
- :不进行归一化(完全忽略文档长度)。
3. BM25 与 传统 TF-IDF 的对比
| 特性 | 传统 TF-IDF | BM25 |
|---|---|---|
| 词频 (TF) 增长 | 线性增长(Linear)。词出现越多分越高,无上限。 | 渐进饱和(Saturation)。词频增加到一定程度后,分数增长趋缓。 |
| 文档长度 | 通常需要额外的余弦相似度归一化。 | 内置了可调节的长度归一化机制。 |
| 参数调节 | 较少,通常是固定的公式。 | 有 $$ 两个超参数可供根据数据分布进行微调。 |
| 适用场景 | 简单的文本挖掘任务。 | 搜索引擎、推荐系统召回。 |
4. 参数调优建议
在实际应用(如 Elasticsearch)中,默认参数通常表现良好,但针对特定数据可以微调:
- ** (默认约 1.2)**:
- 如果你希望文档中词频更高时分数差异更明显,可以调大 。
- 如果是短文本(如标题搜索),词频通常很低, 的影响较小。
- ** (默认 0.75)**:
- 如果文档长度差异很大,且长文档确实包含更多垃圾信息,保持 或更高。
- 如果你索引的是精准的短文本(如商品名称),长度对相关性影响不大,可以尝试减小 。
- 如果文档越长代表信息量越丰富(相关性越高),可以将 。
5. 总结
BM25 算法是召回(Retrieval)阶段的黄金标准。它通过非线性的词频饱和及精细的长度归一化,解决了传统 TF-IDF 在长文本和高频词场景下的缺陷,能够更准确地反映查询与文档的语义相关性。
Rank
1. RRF 初次排 (Reciprocal Rank Fusion)
RRF(倒数排名融合) 是一种将多个检索结果列表(例如:一个是 BM25 的结果列表,一个是向量检索的结果列表)合并成一个单一列表的算法。它通常被称为“初次排序”或“粗排融合”。
为什么需要 RRF?
不同的召回算法输出的分数范围完全不同:
- BM25 的分数可能是 $$(基于词频,无上限)。
- 向量检索(余弦相似度)的分数通常在 $$ 之间。 直接把这两个分数相加(例如 $$)是没有意义的,因为 BM25 会完全主导结果。RRF 忽略具体的分数,只看排名(Rank),从而解决了“分数归一化”的难题。
RRF 核心公式
公式中的变量含义如下:
- :表示某一个文档。
- $)。
- 个列表中的排名位置(从 1 开始,即第一名为 1)。
- )。它的作用是减缓排名靠前的文档权重的衰减速度。
举个例子
假设我们设定 $$(为了计算简单):
- BM25 列表:文档 A 排第 1,文档 B 排第 100。
- 向量列表:文档 B 排第 1,文档 A 排第 100。 计算 RRF 得分:
- 文档 A 得分:$$
- 文档 B 得分:$$ 结果:两者得分相同,都被提升到了顶部。RRF 倾向于奖励在多个列表中都排名靠前的文档。
2. Dranker 精排 (Deep Ranker / Distilled Ranker)
注:在业界标准术语中,通常称之为 Re-ranker (重排序) 或 Cross-Encoder (交叉编码器)。你提到的 "Dranker" 极大概率是 Deep Ranker 或 Distilled Ranker 的缩写/谐音,指代基于深度学习的精排模型。
精排(Fine Ranking) 是在召回和融合之后,对候选的 Top-N(例如前 50 个)文档进行极其精细的语义打分。
核心机制:Cross-Encoder (交叉编码器)
与向量召回(Bi-Encoder,双塔模型)不同,精排模型的工作方式如下:
- 输入:它将“查询 Query”和“文档 Document”拼接在一起,作为一个整体输入到 BERT 等模型中。
- 输入格式:
[CLS] Query [SEP] Document [SEP] - 处理:模型内部的注意力机制(Self-Attention)允许 Query 中的每个字与 Document 中的每个字进行深度交互。
- 输出:直接输出一个 $$ 之间的相关性概率分数。
为什么叫“精”排?
| 维度 | 向量召回 (Bi-Encoder) | 精排 (Cross-Encoder / Dranker) |
|---|---|---|
| 计算位置 | 离线计算文档向量,在线只算距离。 | 在线实时计算整个模型推理。 |
| 计算复杂度 | 极低(点积运算)。 | 极高(BERT 完整推理)。 |
| 精度 | 较低。只能捕捉模糊的语义相似。 | 极高。能理解逻辑关系、否定词、因果关系。 |
| 处理数据量 | 全库(百万/亿级)。 | 仅处理 Top 50 或 Top 100。 |