Skip to content

BM25 (Best Matching 25)

一句话

给查询和文档的匹配程度打分的公式。 分数越高,文档越相关。

在 RAG 体系中的位置

用户提问 → BM25 打分 → 按分排序 → 取 top K → 送给 LLM

         ElasticSearch 默认用的就是这个

它是关键词检索的核心算法,ElasticSearch 内部默认用它来算相关性分。

核心直觉

BM25 主要看两件事:

  1. 词频(TF):查询词在文档里出现多少次?出现越多分数越高——但有上限,不会无限涨。
  2. 逆文档频率(IDF):这个词在整个语料库里有多「稀有」?越稀有权重越大。

举个例子:搜「LangGraph Agent」。「Agent」在很多文档里都有,IDF 低,贡献小;「LangGraph」相对稀有,IDF 高,包含它的文档排名就靠前。

应用场景

场景说明
站点搜索博客、文档站、Wiki 内部搜索
代码/日志检索搜错误码、函数名、日志关键词——语义检索无法处理的场景
法律/合同搜法条编号、合同条款号——必须字面匹配

横向对比:BM25 vs Embedding

BM25Embedding
匹配依据字面(词命中)语义(向量距离)
专有名词✅ 精准⚠️ 可能漂移
同义表达❌ 不同词=不匹配✅ 自动关联
速度极快(倒排索引)快(ANN 索引)
可解释性高(「包含这个词」)低(向量相似)

优缺点

优点: 简单可靠、速度快、可解释性强、专有名词/编码零失误 缺点: 不理解语义、不处理同义词、长文本可能被稀释

如何选择

需要精确匹配术语/编号/代码 → BM25。需要理解语义和表达方式 → Embedding。现实项目里,各取所长 = 混合检索。

小结

BM25 是最朴素也最可靠的检索算法——它不聪明,但它从来不骗你。理解它只需要一个直觉:一个词出现在越少的文档里,它就越重要。

下一步