跳到正文
← 返回文章

技术分享

RAG入门-详解BM25

6 分钟读完1,610 字

引用

BibTeX

@misc{rag-bm25,
  author = {Jingxi Qiu},
  title = {RAG入门-详解BM25},
  howpublished = {Jingxi Qiu},
  year = {2026},
  url = {https://mouwumou.github.io/zh/blog/rag-bm25/}
}

APA

Qiu, J. (2026). RAG入门-详解BM25. In Jingxi Qiu.

MLA

Qiu, Jingxi. “RAG入门-详解BM25.” Jingxi Qiu, 2026.

Chicago

Qiu, Jingxi. 2026. “RAG入门-详解BM25.” In Jingxi Qiu. Preprint.

BM25

BM25(Best Matching 25)主要用来计算一个文档(Document)与用户查询语句(Query)之间的相关性得分

它是目前全文搜索领域(如 Elasticsearch, Lucene, Solr)最主流的搜索算法,被认为是经典TF-IDF算法的改进版,常被用于搜索引擎、文档检索、RAG检索阶段的第一轮召回或稀疏检索基线。

关于TF-IDF算法详见上一篇:

link_to_page

BM25要解决什么问题

在搜索场景中,用户输入一个查询:machine learning retrieval

系统需要从大量文档中找出最相关的文档。一个朴素想法是:

查询词在文档中出现得越多,文档越相关。

例如,文档A中出现了10次retrieval,文档B中只出现了1次,那么A可能更相关。

但这个想法有三个问题:

第一,高频词不一定重要。例如“the”“is”“of”在英文中极常见,不能因为它们出现多就认为文档相关。

第二,词频的边际收益应该递减。一个查询词出现1次和2次差别很大,但出现100次和101次差别通常不大。

第三,长文档天然更容易匹配查询词。如果不做长度归一化,长文档会因为包含更多词而获得不公平优势。

BM25正是围绕这三个问题设计的。BM25的计算逻辑主要基于以下三个要素:

  • TF (Term Frequency,词频): 一个词在文档中出现的次数越多,相关性通常越高。
  • IDF (Inverse Document Frequency,逆文档频率): 如果一个词在所有文档中都很罕见(如“量子纠缠”),它比常见词(如“的”、“是”)更能代表文档的主题。罕见词的权重更高。
  • 文档长度归一化 (Document Length Normalization): 长文章天然包含更多词汇。BM25会对长文档进行分值惩罚,对短文档进行补偿,以确保匹配的公平性。

其中TF和IDF都是TF-IDF的内容,新引入的这个文档长度归一化有效优化了TF-IDF在长短文本的权重问题。

BM25核心公式

Score(D,Q)=i=1nIDF(qi)f(qi,D)(k1+1)f(qi,D)+k1(1b+bDavgdl)Score(D, Q) = \sum_{i=1}^{n} IDF(q_i) \cdot \frac{f(q_i, D) \cdot (k_1 + 1)}{f(q_i, D) + k_1 \cdot (1 - b + b \cdot \frac{|D|}{avgdl})}

参数含义:

  • qiq_i: 查询语句中的第ii个关键词。Q={q1,q2,...,qn}Q=\{q_1, q_2,...,q_n\}
  • f(qi,D)f(q_i, D): 词qiq_i在文档DD中出现的频率(TF)。
  • D|D|: 当前文档的长度。
  • avgdlavgdl: 语料库中所有文档的平均长度。
  • k1k_1: 可调参数(通常取1.2到2.0),控制词频饱和的速度。
  • bb: 可调参数(通常取0.75),决定文档长度惩罚的力度。
  • IDF(qi)\mathrm{IDF(q_i)}: 词qiq_i的逆文档概率

由这个公式我们可以计算在给定查询Q={q1,q2,...,qn}Q=\{q_1, q_2,...,q_n\}对于文档D的相似指数。

BM25常用的IDF形式是:

IDF(qi)=log(Nn(qi)+0.5n(qi)+0.5+1)\mathrm{IDF}(q_i)=\log\left(\frac{N-n(q_i)+0.5}{n(q_i)+0.5}+1\right)

其中NN是总文档数量,n(qi)n(q_i)是包含查询词qiq_i的文档数量。

可以预见,出现在越多文档中的词,n(qi)n(q_i)越大,IDF越小,而log曲线让IDF的边际效益递减。

再看公式右边:

f(qi,D)(k1+1)f(qi,D)+k1(1b+bDavgdl)\frac{f(q_i, D) \cdot (k_1 + 1)}{f(q_i, D) + k_1 \cdot (1 - b + b \cdot \frac{|D|}{avgdl})}

其中f(qi,D)=count(qi,D)Df(q_i, D)=\frac{count(q_i,D)}{|D|},就是TF-IDF中的TF。但不同的是BM25这里也做了个缩放:

其中BM25使用1b+bDavgdl1 - b + b \cdot \frac{|D|}{avgdl}对文本长度进行归一化,避免长短文本问题。当文本长度avgdlavgdl大于平均长度D|D|时,Davgdl\frac{|D|}{avgdl}会大于1从而增大分母,从而压低得分,反之亦然。

而对于整个公式而言,当f(qi,D)f(q_i, D)上升时,分数确实会上升,但上升速度会越来越慢。参数k1k_1控制这种上升速度,k1k_1 越大,词频增长的影响越明显,k1k_1越小,词频越快进入饱和(增长变慢,最后接近天花板)。

通过控制参数k1k_1bb,我们能控制模型对于长文本和高频词的敏感程度,避免长文档占便宜,也避免词频线性增长问题。

BM25和TF-IDF的关系

BM25可以看作是TF-IDF的改进版本。

TF-IDF(t,D)=TF(t,D)IDF(t)\mathrm{TF\text{-}IDF}(t,D)=\mathrm{TF}(t,D)\cdot \mathrm{IDF}(t)

BM25 保留了 IDF 思想,但对 TF 做了更精细的建模:

维度 TF-IDF BM25
词频增长 通常线性或对数增长 明确建模饱和效应
文档长度 处理方式较简单 显式长度归一化
参数控制 较少 k1k_1bb可调
实践表现 基础方法 通常更强、更稳定

因此,在很多传统搜索任务中,BM25往往比朴素TF-IDF表现更好。

优劣势

优势

  1. 无需训练。只需要统计语料库中的词频、文档频率和文档长度即可。
  2. 可解释性强。每个词对最终分数的贡献都可以拆解。
  3. 速度快。BM25可以很好地结合倒排索引实现高效检索。
  4. 鲁棒性强。在没有大量标注数据时,BM25往往是一个非常强的baseline。
  5. 适合作为RAG的第一阶段检索器。在很多RAG系统中,BM25常被用于lexical retrieval,然后再用dense retriever或reranker做进一步排序。

劣势

BM25还是集成了TF-IDF很多统计模型的劣势

  1. 它不能理解语义,不知道词之间的同义、上下位、语境关系。
  2. 它对分词、停用词、词干化、大小写归一化等预处理非常敏感。
  3. 它还是没有解决高维稀疏问题,如果语料库中有几十万甚至上百万个词,向量维度会非常高,而且大多数位置是0。
  4. 它不适合处理复杂语义查询。例如:Which papers propose retrieval-augmented generation methods for open-domain question answering?这种查询中,相关性不只是词是否出现,还涉及语义理解。

BM25在RAG中的作用

在RAG系统中,BM25通常扮演稀疏检索器的角色。一个典型流程是:

用户查询

BM25召回top-k文档

向量检索召回top-k文档

合并候选集

reranker重排序

LLM基于高分文档生成答案

BM25的优势在于它对关键词、实体名、术语、代码标识符、数字、专有名词非常敏感。

例如:

ERR_CONNECTION_RESET

BM25 formula k1 b parameter

paper title: Attention Is All You Need

这些查询中,词面匹配很关键,BM25往往比纯向量检索更稳定。向量检索擅长语义泛化,BM25擅长精确匹配。二者互补。

总结

BM25是一个经典但非常实用的检索排序函数。它基于三个核心思想:

  1. IDF:稀有词更重要。
  2. 词频饱和:词出现越多越相关,但收益递减。
  3. 长度归一化:长文档不能因为更长就天然占优。

它比朴素TF-IDF更稳健,也比神经检索方法更轻量、更可解释。在现代RAG和搜索系统中,BM25仍然是不可忽视的核心组件,尤其适合作为第一阶段召回器或与向量检索形成混合检索。

相关文章