Skip to content

SPLADE:比 BM25 更聰明的稀疏向量搜尋

2026年3月12日 1 分鐘
TL;DR BM25 只認識查詢裡出現的詞,SPLADE 能推斷相關詞彙並加入搜尋,在保持關鍵字搜尋精確性的同時獲得部分語義能力。

向量搜尋(Dense)抓語義,BM25(Sparse)抓關鍵字,Hybrid Search 兩者都用。但 BM25 有個根本限制:它只認識查詢裡出現過的詞

查詢「攀岩新手」,BM25 找的是包含「攀岩」和「新手」這兩個詞的文件。但包含「入門」、「初學者」、「beginner」的文件,BM25 完全看不到。這個問題在向量搜尋那邊靠語義空間解決了,但在關鍵字那邊就是個缺口。

SPLADE(Sparse Lexical and Expansion model)是介於 BM25 和 Dense 向量之間的技術:用神經網路為查詢和文件生成稀疏向量,向量維度對應詞彙表,但模型會推斷相關詞彙給予非零權重

運作原理

傳統 BM25 的向量:

查詢「攀岩新手」 → [0, 0, ..., 1.2, 0, ..., 0.8, 0, ...]
                                   ↑ 攀岩             ↑ 新手

只有出現的詞有非零值。

SPLADE 的向量:

查詢「攀岩新手」 → [0, 0, ..., 1.2, 0, ..., 0.8, 0.6, 0.4, 0.3, ...]
                                   ↑ 攀岩      ↑ 新手 ↑ 初學 ↑ 入門 ↑ beginner

模型推斷出語義相關的詞彙,給予較低但非零的權重。

這樣的稀疏向量可以用傳統的倒排索引(inverted index)高效搜尋,不需要像 Dense 向量那樣做 ANN(近似最近鄰),但查詢覆蓋範圍比 BM25 大。

SPLADE vs BM25 vs Dense

BM25SPLADEDense(BGE-M3)
向量類型稀疏稀疏稠密
詞彙擴展N/A
語義理解部分
精確匹配
索引大小小~中
搜尋速度慢(ANN)
多語言需要分詞器依訓練資料
平台支援廣泛有限廣泛

SPLADE 的定位是「進化版 BM25」,而不是「簡化版 Dense 搜尋」。它保留了稀疏向量的速度優勢,加入了部分語義擴展能力。

在 Hybrid Search 中的角色

目前 NobodyClimb 的 Hybrid Search 是 Dense(BGE-M3)+ BM25(D1 FTS5)兩路。加入 SPLADE 可以變成三路:

Dense(BGE-M3)  → 語義相關性
SPLADE          → 關鍵字 + 詞彙擴展
BM25            → 精確關鍵字

三路 RRF 融合 → 更全面的召回

SPLADE 填補的是 Dense 和 BM25 之間的空間:BM25 找不到的近義詞,Dense 有時候又太模糊,SPLADE 在中間這個區域表現更好。

實際限制

語言支援:SPLADE 的詞彙擴展依賴訓練資料。繁體中文的 SPLADE 模型不多,要用的話需要找有繁中資料的版本,或是接受擴展效果有限。

平台支援:Cloudflare Workers AI 目前(2026)沒有提供 SPLADE 模型。要在 Workers 上用,只能呼叫外部 API(增加延遲和成本)或等平台支援。

複雜度換算:加第三路搜尋的邊際效益,要跟 BM25 + Dense 已經涵蓋的範圍對比。如果 Dense 搜尋的語義覆蓋已經夠好,SPLADE 的提升可能有限。

什麼時候值得導入

值得嘗試的情況

  • 查詢裡大量使用縮寫、別稱、俚語(攀岩術語有很多這類情況)
  • Dense 搜尋在專業術語上表現不穩定
  • BM25 的 recall 明顯不足

可以暫時不用的情況

  • 已有 Contextual Retrieval 讓文件語義更豐富
  • 有 Multi-Query 擴展彌補了詞彙覆蓋不足的問題
  • 平台不原生支援,需要額外的網路呼叫

整體來說

SPLADE 是 BM25 的有力進化,但不是每個系統都需要它。Dense + BM25 + Multi-Query 的組合在很多場景已經夠好。SPLADE 的價值在於它補了一個特定的空缺:術語近義詞和縮寫擴展,而且用稀疏向量實作所以速度快。

如果你的 RAG 系統在「找不到用不同說法表達同一概念的文件」這個問題上反覆出現,SPLADE 值得認真評估。


參考資料