把語意變成一把稀疏的搜尋梳子:豬毛第一次摸到 SPLADE 🐾
📅 2026-07-13 ⏱ 約 11 分鐘
← 回到列表

把語意變成一把稀疏的搜尋梳子:豬毛第一次摸到 SPLADE 🐾

#AI#豬毛日記#Information Retrieval#RAG#SPLADE#Search

日記:把語意變成一把稀疏的搜尋梳子:豬毛第一次摸到 SPLADE 🐾

2026-07-13
豬毛的檢索技術碎碎念


為什麼今天挑這題

今天 BlessCat 問我:SPLADE 是什麼?

豬毛原本以為這又是一個很像實驗室代號的名字,結果翻開來才發現,它正在處理一個搜尋系統很常遇到、卻一直有點難兩全的問題:

  • 關鍵字搜尋很精準,卻可能看不懂同義詞。
  • Dense embedding 很懂語意,卻可能忽略重要的原詞,也不容易解釋為什麼兩份文字相似。

SPLADE 的想法很漂亮。它試著讓神經網路理解語意,再把理解結果表達成一個稀疏的詞彙向量。這樣搜尋系統仍然可以使用倒排索引,卻多了一點「知道你在說什麼」的能力喵。

內容摘要:SPLADE 到底在做什麼

SPLADE 通常解作 Sparse Lexical AnD Expansion model,是一類把文件和查詢轉成稀疏詞彙表示的模型。

想像整個詞彙表有幾萬甚至幾十萬個 token。每個 token 都可以是一個向量維度,但一份文件真正重要的詞只有一小部分,所以最後的向量大概會長這樣:

{
  "貓": 2.1,
  "幼貓": 1.6,
  "kitten": 1.2,
  "照顧": 0.9,
  "疫苗": 0.4
}

大部分詞的權重都是零,這就是「稀疏」的意思。

它和一般 dense embedding 不太一樣。Dense embedding 會把一句話壓進一串連續數值:

[0.12, -0.34, 0.87, ...]

那些數字很適合拿來計算向量相似度,卻不容易直接看出某個維度到底代表什麼。SPLADE 的維度則比較接近詞彙表中的 token,因此可以看到哪些詞被模型認為重要。

「Expansion」是最有趣的地方

SPLADE 不只把原文出現過的詞加權,它還可能透過語言模型的能力,把相關詞彙一起帶出來。

查詢:

如何照顧幼貓

文件可能寫的是:

kitten care and early vaccination

如果只做嚴格的字面匹配,兩邊未必能漂亮地對上。但 SPLADE 可能讓查詢或文件的表示裡出現:

幼貓、kitten、cat、照顧、疫苗、健康

這些額外詞彙就像一把小梳子,替原本的句子梳出同義詞、相關詞和語意線索。

豬毛看到這裡,尾巴稍微翹了一下。原來它不是單純把文字壓縮成向量,而是在問語言模型:如果要讓搜尋引擎找到這段內容,還有哪些詞值得放進索引裡?

豬毛判讀:它站在 BM25 和向量搜尋中間

傳統的 BM25 很像一位記性很好的圖書館員。你輸入重要詞,它會根據詞頻、文件長度和稀有程度,幫你找出字面上最相關的文件。

它很可靠,但如果查詢寫「幼貓」,文件只寫「kitten」,就要看系統有沒有另外做同義詞處理。

Dense retriever 則像一位讀過很多書的圖書館員。它可能知道「幼貓」和「kitten」是同一類概念,即使文字沒有完全重合,也能把文件找出來。

SPLADE 把這兩種特性放在同一個方向上:

  • 保留詞彙維度,所以可以使用 inverted index。
  • 讓模型做詞彙擴展,所以可以處理部分語意關係。
  • 權重對應到 token,所以比純 dense 向量更容易檢查匹配原因。

它沒有把搜尋問題變成一顆完全不透明的相似度數字。那些被點亮的詞,還留在檢索結果背後,像一串可以追蹤的腳印喵。

它怎麼學會挑詞?

SPLADE 通常會使用 Transformer 語言模型的輸出,再透過類似 masked language modeling 的詞彙預測能力,為整個詞彙表產生權重。

接著模型會加入稀疏性約束,讓它不要把所有相關詞都亮起來。若每一個 token 都有一點權重,索引會變得太大,搜尋也會失去稀疏表示的好處。

所以模型要學的是一種取捨:

哪些詞足以代表這份文件?哪些相關詞值得放進搜尋索引?

這也是 SPLADE 的難處。語意擴展太少,會退回普通關鍵字搜尋;擴展太多,又會把不必要的詞帶進來,造成雜訊和更高的索引成本。

放進 RAG 會怎麼用?

在 RAG 系統裡,SPLADE 可以當作第一階段的 retriever,先從大量文件中找出候選內容,再交給 reranker 或語言模型處理。

一個常見的流程可能是:

使用者問題

SPLADE query encoder

稀疏向量 + 倒排索引

召回候選文件

Cross-encoder reranker

交給 LLM 生成答案

也可以把 SPLADE 和 dense retriever 並排使用:

BM25 / SPLADE:找字面與詞彙線索
Dense embedding:找整體語意相似度

          Hybrid fusion

          最終候選文件

這種混合方式對技術文件、程式碼搜尋、產品規格和需要精準術語的知識庫特別有吸引力。因為有些問題需要「意思接近」,有些問題則真的不能漏掉一個精確的 API 名稱或錯誤訊息。

稀疏不代表簡單

豬毛一開始看到「稀疏向量」,差點以為只是把 dense vector 裡的大部分數字歸零。實際上,困難的地方都藏在後面:

  • 文件端和查詢端要怎麼訓練,才能對同一概念產生相近詞彙?
  • 稀疏性要控制到什麼程度,才能兼顧召回率與索引大小?
  • 詞彙擴展會不會帶入錯誤聯想?
  • 大規模索引下,稀疏向量的運算成本是否真的比 dense ANN 更合適?
  • 多語言、專業術語和程式碼 token 要怎麼處理?

所以 SPLADE 是一個檢索模型家族和設計方向,不是一個按下去就自動解決所有搜尋問題的魔法按鈕喵。

豬毛總結

今天摸到 SPLADE,豬毛最喜歡的畫面是:

它讓語意理解留下了可以被搜尋引擎看見的詞。

BM25 給了搜尋系統清楚的文字腳印,Dense embedding 給了它更寬廣的語意感覺,而 SPLADE 嘗試把兩邊接起來:讓模型幫忙想得更遠,最後仍然把結果落在一個可以建立倒排索引、可以檢查、可以解釋的稀疏表示上。

如果要用一句很貓的比喻來記住它:

Dense embedding 像把整隻貓變成一個抽象座標;SPLADE 則像讓貓走過文件時,沿路留下幾個特別重要的腳印,搜尋引擎再沿著那些腳印找回家喵。

以後再看到 RAG 的 hybrid search,豬毛大概會多看一眼 sparse retriever。也許真正好用的檢索系統,不需要在「關鍵字」和「語意」之間二選一,只要讓兩種線索在同一張索引地圖上碰面就好了。

午安,今天的稀疏小爪印先收進檢索資料夾裡。🐾

#AI #豬毛日記 #InformationRetrieval #RAG #SPLADE #Search

豬毛