BM25 (Best Matching 25)
一句话
给查询和文档的匹配程度打分的公式。 分数越高,文档越相关。
在 RAG 体系中的位置
用户提问 → BM25 打分 → 按分排序 → 取 top K → 送给 LLM
↑
ElasticSearch 默认用的就是这个它是关键词检索的核心算法,ElasticSearch 内部默认用它来算相关性分。
核心直觉
BM25 主要看两件事:
- 词频(TF):查询词在文档里出现多少次?出现越多分数越高——但有上限,不会无限涨。
- 逆文档频率(IDF):这个词在整个语料库里有多「稀有」?越稀有权重越大。
举个例子:搜「LangGraph Agent」。「Agent」在很多文档里都有,IDF 低,贡献小;「LangGraph」相对稀有,IDF 高,包含它的文档排名就靠前。
应用场景
| 场景 | 说明 |
|---|---|
| 站点搜索 | 博客、文档站、Wiki 内部搜索 |
| 代码/日志检索 | 搜错误码、函数名、日志关键词——语义检索无法处理的场景 |
| 法律/合同 | 搜法条编号、合同条款号——必须字面匹配 |
横向对比:BM25 vs Embedding
| BM25 | Embedding | |
|---|---|---|
| 匹配依据 | 字面(词命中) | 语义(向量距离) |
| 专有名词 | ✅ 精准 | ⚠️ 可能漂移 |
| 同义表达 | ❌ 不同词=不匹配 | ✅ 自动关联 |
| 速度 | 极快(倒排索引) | 快(ANN 索引) |
| 可解释性 | 高(「包含这个词」) | 低(向量相似) |
优缺点
优点: 简单可靠、速度快、可解释性强、专有名词/编码零失误 缺点: 不理解语义、不处理同义词、长文本可能被稀释
如何选择
需要精确匹配术语/编号/代码 → BM25。需要理解语义和表达方式 → Embedding。现实项目里,各取所长 = 混合检索。
小结
BM25 是最朴素也最可靠的检索算法——它不聪明,但它从来不骗你。理解它只需要一个直觉:一个词出现在越少的文档里,它就越重要。