Skip to content

5.3.2 BM25 和向量检索分别擅长解决什么问题? ​

先给结论:BM25 更擅长精确术语、编号、专有名词这类“字面命中很重要”的问题;向量检索更擅长近义表达、自然语言改写、主题相近这类“语义接近更重要”的问题。

所以两者通常不是谁替代谁,而是:

  • 解决的盲点不同

先看 BM25 的强项 ​

BM25 更擅长的,通常是这些场景:

  • 查询里有明确术语
  • 查询里有规则编号、产品型号、接口名
  • 查询要求精确命中某几个词
  • 数据本身就是术语密集型文档

比如:

  • “退款规则 4.2.3”
  • “型号 XG-500 的保修期”
  • “接口 createOrder 的幂等字段”

这类问题里,关键词本身就带着很强区分度。

如果系统能精准命中这些词,通常就已经离正确候选很近了。

再看向量检索的强项 ​

向量检索更擅长的,通常是这些场景:

  • 用户说法很多变
  • 问题和文档表述不完全一致
  • 需要找主题相近内容
  • 近义表达覆盖很重要

比如:

  • “怎么关闭会员自动扣款?”
  • “如何取消自动续费?”

这两种说法如果只靠字面命中,未必稳定。

但语义检索通常更容易把它们拉到一起。

一个更直观的对比 ​

你可以先把两者区别理解成:

  • BM25 更像在问:这些词有没有准确命中
  • 向量检索 更像在问:这段内容和当前问题是不是在说接近的事情

它们都在解决“相关性”,但判断依据不同。

哪些问题更容易让 BM25 更占优势 ​

下面这些问题,BM25 往往更容易稳:

  1. 产品型号、零件号、规则编号
  2. 专有术语、缩写词、内部名词
  3. 字段名、接口名、函数名
  4. 用户会明确写出关键词,且这些词具有很强区分度

这些场景里,如果只靠向量检索,常见问题是:

  • 语义上差不多
  • 但不一定精确命中那一个最关键的词

哪些问题更容易让向量检索更占优势 ​

下面这些问题,向量检索往往更有优势:

  1. 用户问法变化很大
  2. 文档和问题表述风格差异明显
  3. 查询本身是自然语言描述,不是关键词串
  4. 需要找“意思接近”而不是“词一样”的内容

这些场景里,如果只靠 BM25,常见问题是:

  • 表达换了一种说法就不稳
  • 关键词不完全重合时容易漏召回

一个更现实的系统结论 ​

真实系统里,经常会同时遇到这两类需求:

  • 一方面要覆盖近义表达
  • 一方面又要稳住术语精度

所以最后常见的结论不是:

  • 选一个就够

而是:

  • 两种都要有,而且分工要清楚

一个最小示意 ​

python
query = "接口 createOrder 的超时时间是多少"

vector_candidates = vector_search(embed(query), top_k=10)
bm25_candidates = bm25_search(query, top_k=10)

这段示意代码想说明的是:

  • 如果查询里既有自然语言语义,又有明确术语 createOrder
  • 那么向量检索和 BM25 往往都能提供价值

前者帮助系统理解“超时时间”这个问题意图,后者帮助系统精确抓住 createOrder 这个接口名。

一个常见误区 ​

很多人会这样理解:

  • 向量检索更先进,所以 BM25 只是过渡方案

这通常是误判。

更稳的理解是:

  • 向量检索和 BM25 解决的是两类不同盲点

只要你的系统里仍然有:

  • 术语
  • 编号
  • 产品名
  • 接口名

BM25 这类能力就很难完全消失。

一句话总结 ​

BM25 和向量检索分别擅长不同问题。BM25 更强在精确术语和关键词命中,向量检索更强在语义接近和问法变化覆盖。真实 RAG 系统往往不是二选一,而是把两者结合起来。