在 RAG 技术中,有使用 BM25 算法去检索相关文档,那么他的原理是怎样的?
BM25(Best Matching 25)是一种用于信息检索的算法,广泛应用于搜索引擎和文本挖掘领域。它是对 TF-IDF(词频 - 逆文档频率)模型的改进,主要通过引入文档长度归一化和词频饱和机制,更准确地评估文档与查询之间的相关性
原理
- 逆文档频率(IDF)
用于衡量一个词的 “稀有性”。如果一个词在较少的文档中出现,其 IDF 值越高,表明这个词具有更好的区分能力。
IDF(qi)=log(n(qi)+0.5N−n(qi)+0.5)
其中,N 是文档总数,n (qi) 是包含词 qi 的文档数
- 词频(TF)调整
BM25 引入了词频饱和机制,避免长文档因词频过高而获得不合理的高分
BM25(qi,d)=IDF(qi)⋅TF(qi,d)+k1⋅(1−b+b⋅avgdid)(k1+1)⋅TF(qi,d)
其中 TF(qi,d) 表示词汇 qi 在文档 d 中出现的次数,k1 和 b 是可调参数,|d | 是文档长度,avgdl 是文档平均长度
文档长度归一化
BM25 通过文档长度归一化处理,使得文档长度对权重的影响是非线性的。这避免了长文档仅因词数多而得分更高的问题,即以上公式的 avgdid
查询与文档的相关性
对于一个查询 Q 和文档 d,BM25 的最终得分是查询中每个词与文档相关性的累加
BM25(Q,d)=i=1∑nBM25(qi,d)
n 表示 Q 中的词汇数量
例子
假设我们有以下文档集合(3 篇文档)和一个查询:
文档集合:
- 文档 D1:
"苹果 苹果 苹果"
(3 个词,文档长度为 3) - 文档 D2:
"苹果"
(1 个词,文档长度为 1) - 文档 D3:
"苹果 香蕉"
(2 个词,文档长度为 2)
查询 Q:"苹果"
- 计算 IDF
首先,我们需要计算查询词 “苹果” 的逆文档频率(IDF)
IDF(" 苹果 ") 的 log(3+0.53−3+0.5)=log(3.50.5)=log(0.1429)≈−1.90
注意:这里的 IDF 值是负数,因为 “苹果” 在所有文档中都出现了。在实际应用中,IDF 通常取正值,可以通过调整公式或对结果取绝对值来处理。
- 计算文档长度相关参数
接下来,计算文档长度相关的参数
avgdl=3D1+D2+D3=33+1+2=2
- 计算 BM25 分数
假设参数 k1=1.2 和 b=0.75,我们分别计算每个文档的 BM25 分数
计算 | 值 |
---|
BM25(" 苹果 ",D1) | 2.62 |
BM25(" 苹果 ",D2) | 2.41 |
BM25(" 苹果 ",D3) | 1.9 |
D3 中包含 “苹果” 和 “香蕉”,而查询只关心 “苹果”,因此 D3 的相关性不如 D1 和 D2。 | |
注:实际情况,查询 Q 可能包含多个词汇