🔍 向量检索 vs 关键词检索 + 混合检索
BM25 靠字面精确命中,向量检索靠语义理解。互补关系,两路都跑用 RRF 融合。
两种「相关」的理解
🔤 字面相关
词汇重叠——查询词在文档里出现了几次?
对应关键词检索(BM25),靠词频统计,擅长精确命中。
🧠 语义相关
意思接近——换了种表达方式,还是同一个意思?
对应向量检索,靠语义空间距离,擅长模糊语义匹配。
关键词检索 BM25
字面匹配
靠词频统计
精确命中强
向量检索
语义匹配
靠 embedding 距离
语义理解强
BM25:靠词频 + 稀缺度
🗂️ 倒排索引
记录「每个词出现在哪些文档里」,而不是「每篇文档有哪些词」。
是 Elasticsearch、Lucene 传统搜索引擎的核心。
⚖️ 打分看两点
• 词频 TF:这个词在这篇文档出现几次
• 稀缺度 IDF:这个词有多罕见——给常见词降权、给罕见词加权
BM25 在 TF-IDF 上加了饱和度限制,防止重复太多次权重无限叠加。
向量检索:靠语义距离
🧮 先转向量
用 Embedding 模型把文本转成高维向量(语义空间的坐标),语义相近则坐标靠近。
「苹果手机怎么截图」和「iPhone 如何截屏」虽无一字相同,余弦相似度可达 0.95。
⚡ ANN 检索
用近似最近邻算法(ANN)在向量库找最近的 Top-K,百万量级几十毫秒返回。
优势:语义理解强,跨越同义词、近义词、不同表达方式。
劣势:对精确词汇不敏感——产品型号、人名在向量空间距离可能不近。
核心区别对比
| 维度 | 🔤 关键词 BM25 | 🧠 向量检索 |
|---|---|---|
| 匹配方式 | 词汇重叠统计 | 语义空间距离 |
| 索引结构 | 倒排索引(稀疏) | 向量库(稠密) |
| 同义词 | ✗ 无法处理 | ✓ 天然支持 |
| 精确词命中 | ✓ 极好 | ✗ 容易漏 |
| 计算方式 | 基于统计,可解释 | 黑盒,向量距离 |
| 适合场景 | 专有名词、代码、精确查询 | 语义问答、模糊表达 |
混合检索 + RRF 融合
RRF(Reciprocal Rank Fusion,互倒排名融合):不看来路的原始分数(量纲不同没法直接加权),只看排名,用排名的倒数打分:
score = Σ 1/(rank + k)
两路都认为相关的文档排最前,只有一路相关的也不会被丢掉。
关键词检索(BM25)靠词频+稀缺度做字面精确匹配,擅长专有名词/型号,但同义词没辙;向量检索靠 embedding 语义距离理解「换种说法同一个意思」,但精确词容易漏。两者互补,生产用混合检索——两路并行召回,用 RRF 按排名倒数融合排序,取长补短。
关键词检索靠 BM25,本质是词频统计,看查询词在文档里出现了多少次,擅长精确命中,产品型号、专有名词都能精准找到,但遇到同义词就没辙;向量检索靠 embedding 把文本转成高维向量,语义相近坐标就靠近,能理解换种说法同一个意思,比如「手机截图」和「iPhone 截屏」,但反过来对精确词汇不敏感,型号这种容易漏。
因为两种检索各有盲区,是互补关系。向量检索擅长语义,但产品型号、人名这些精确词在向量空间里距离可能不近;BM25 擅长精确命中,但同义词完全没辙。生产里我一般两路都跑,向量和 BM25 各召回一批,再用 RRF 融合排序。RRF 不看原始分数因为量纲不同,只看排名,用排名的倒数打分,两路都相关的排最前,只有一路相关的也不会丢。
RRF 是 Reciprocal Rank Fusion,互倒排名融合。它不看来路的原始分数,因为向量检索和 BM25 的分数量纲完全不同没法直接加权,它只看排名,用 1 除以排名加一个常数 k 来打分,然后把两路的分加起来排序。两路都认为相关的文档分最高排最前,只有一路相关的也不会被完全丢掉,这样取长补短。