人人都会AI编程

8.2 关键词检索:BM25 稀疏检索原理与适用场景

更新时间:2026-07-12

在 RAG 系统中,检索模块并不只有向量相似度一条路。BM25 是目前最经典、也最常用的关键词检索算法之一,它属于稀疏检索的范畴,基于词频和文档频率来量化查询与文档的相关性,完全不依赖深度学习模型。理解它的原理和适用场景,有助于我们搭建更健壮的检索流水线。

8.2.1 BM25 的核心原理

BM25 的全称是 Best Matching 25,可以看作对经典 TF‑IDF 的一系列改良,解决了很多实际检索中 TF‑IDF 的缺陷。它同样基于词袋模型:将查询和文档都看作词的集合,忽略语序,依靠统计信息计算相关性得分。

BM25 的得分由三个关键因素共同决定:

  • 词频(TF):某个词在文档中出现的次数越多,通常意味着该文档与这个词越相关。BM25 对 TF 做了饱和处理,即词频增加到一定程度后,额外次数带来的贡献会逐渐变小,避免了长文档或重复词对分数的过度影响。
  • 逆文档频率(IDF):某个词如果在整个语料库中很常见(比如“的”“是”“我们”),说明它区分能力弱,需要压低它的权重;反之,出现得少的词则享有较高权重。BM25 使用的是其自身版本的反文档频率,对不同词进行区分度校准。
  • 文档长度归一化:同等条件下,长文档天然含有更多词,可能会产生偏高的得分。BM25 引入可调参数 b 来根据文档长度对得分进行惩罚或补偿,使得长文档和短文档可以公平比较。

总的来看,BM25 的核心公式可以表达为:

\[
\text{score}(Q, d) = \sum_{t \in Q} \text{IDF}(t) \cdot \frac{ f(t,d) \cdot (k_1 + 1) }{ f(t,d) + k_1 \cdot (1 - b + b \cdot \frac{|d|}{\text{avgdl}}) }
\]

如果觉得公式不直观,只需把握住几点:

  • 查询中的每个词,各自计算与当前文档的匹配程度,然后求和。
  • 词本身越稀有(高 IDF),贡献越大;
  • 词在文档中出现次数(TF)起正向作用,但增长是非线性的;
  • 文档相对于平均长度的比例会调整最终权重,控制长文档的高频优势。

其中 k_1b 是两个可调参数(常用值 k_1=1.2~2.0b=0.75),大多数 BM25 实现都已经内置了合理的默认值。

8.2.2 稀疏检索的特点

BM25 生成的文档表示是一种稀疏向量:向量的每个维度对应词典中的一个词,大多数维度为零。这和基于 BERT 等模型生成的密集向量有本质不同:

  • 可解释性好:文档匹配完全由共同出现的词决定,可以清楚看到为什么某个文档被召回。
  • 无需训练:完全无监督,不依赖 GPU,任何规模的知识库都能快速建立索引。
  • 对精确词汇匹配敏感:只要用户输入的词出现在文档中,就有较高概率被检索到,非常适合需要精确术语命中的场景。

同时,BM25 默认只做字面匹配,无法理解同义词和语义改写。这也是在复杂 RAG 系统中会把它和密集检索组合使用的关键原因。

8.2.3 适用场景

  1. 精确关键词匹配场景

用户查询中包含专有名词、产品型号、编号、代码等不易被向量模型准确捕获的词汇时,BM25 比密集检索可靠。例如搜索“X200-PRO 散热参数”,BM25 可以精准命中包含该完整型号的文档片段。

  1. 法律、合规、合同等严谨文书

这类文档往往对措辞有极高要求,相同术语不能随意替换。BM25 的精确匹配特性可以确保条款中的原文被准确召回,避免语义近似带来的歧义。

  1. 多语言混合及特殊符号

在技术文档、代码库或混有中英日俄等多语言的资料中,嵌入模型可能无法有效理解某些术语,而 BM25 只依赖字符级索引,天然具有跨语言字面匹配能力。

  1. 低资源或无 GPU 环境

BM25 基于倒排索引,CPU 即可高效运行,内存占用可控。即便文档规模达到百万级,也可以使用 Elasticsearch 等成熟引擎承担检索任务,性能和稳定性广受验证。

  1. 作为混合检索中的互补组件

这是 BM25 在现代 RAG 中最常见的角色。密集检索擅长语义泛化,但有时会漏掉精确关键词;BM25 恰好弥补这个弱点。通过同时运行两种检索,再将结果融合(比如用倒数排名融合 RRF),可以显著提升整体召回率和答案质量。

8.2.4 在 RAG 中的实际落地

如果你正在搭建一个面向业务的 RAG 系统,可以考虑以下方式引入 BM25:

  • 单独使用 BM25:如果知识库规模不大(几千篇以内),且领域术语固定、很少出现同义改写,BM25 已经是够用且低成本的选择。
  • 混合检索:使用 BM25 和向量检索分别召回 top‑k 候选,再通过 RRF 或加权重排合并结果,作为最终送给 LLM 的上下文。大多数生产级 RAG 系统都会选择这一步,以确保召回的质量上限。
  • 利用 Elasticsearch / Lucene / Milvus 的 BM25 实现:这些工具都已内建 BM25 算法,只需将原始文本入库即可自动构建倒排索引,开箱即用,避免自己实现分词和打分逻辑。

BM25 看似“传统”,但在事实性要求高、术语精确的场景里,它依然是最可靠、最透明的第一道把关。将它与密集检索合理搭配,才能让 RAG 系统的检索模块既不漏掉关键信息,也不被杂讯淹没。