BM25算法 是什麼?

BM25:BM25算法 的完整解釋

BM25 (Best Matching 25) 是一種用於資訊檢索的排序函數,它基於詞頻和逆文檔頻率,並考慮了文檔長度的影響,以提高檢索的準確性。

容易混淆

BM25 vs TF-IDF BM25 在 TF-IDF 基礎上加了詞頻飽和和文件長度歸一化。

BM25 vs 向量檢索 BM25 看字詞匹配,向量檢索看語意相似,兩者強項不同。

BM25 vs 關鍵字堆疊 BM25 不只是數次數,還會看稀有度和文件長短。

記住這句就好

先看它要解決的是什麼問題,再看它是不是最合適的方法。

實際案例

案例 1:站內搜尋 使用者輸入產品型號時,BM25 可以快速把含有關鍵字的頁面排前面。

案例 2:FAQ 找答案 問題和答案中的關鍵詞對上時,BM25 很適合做第一層召回。

算法與應用

面向 重點
核心 詞頻越高不一定越重要,還要看詞稀不稀有、文件長不長。
優點 簡單、穩定、可解釋,對文字檢索很實用。
注意 遇到同義詞或語意改寫時,單靠 BM25 可能不夠。

BM25 的公式與三個關鍵設計

BM25 給「查詢詞」與「文件」算一個相關度分數,總分是查詢裡每個詞的分數加總:

score(D, Q) = Σ IDF(qᵢ) × ( f(qᵢ,D) × (k₁+1) ) / ( f(qᵢ,D) + k₁ × (1 − b + b × |D|/avgdl) )

看起來複雜,但它其實只是在處理三件事。

要處理的問題 BM25 的做法 對應的部分
常見詞不該加分 越少文件出現的詞,權重越高 IDF(qᵢ)
出現 20 次不該是 10 次的兩倍 詞頻的效果會飽和 k₁ 控制飽和速度
長文件容易誤中 依文件長度與平均長度的比值折算 b 控制正規化強度

常見的預設值是 k₁ 介於 1.2 到 2.0、b 等於 0.75。

第二列是 BM25 勝過傳統 TF-IDF 的核心。TF-IDF 的詞頻是線性的,一個詞出現 100 次分數就是出現 1 次的 100 倍,這顯然不合理。BM25 讓詞頻的貢獻趨近一個上限,出現 5 次和 50 次的差別遠小於出現 0 次和 1 次的差別。

為什麼在向量檢索時代還要用 BM25

現在的 RAG 系統幾乎都採用混合檢索,也就是 BM25 加上向量檢索一起用,原因是兩者的失敗模式剛好互補。

BM25 擅長精確比對。 產品型號、錯誤代碼、人名、專有名詞、罕見縮寫,這些東西向量模型常常抓不準,因為它們在訓練資料裡出現得少,嵌入品質差。使用者搜「E-1042 錯誤」時,BM25 一定找得到,向量檢索可能找回一堆「錯誤處理」的通用文件。

向量檢索擅長換句話說。 使用者問「怎麼把錢拿回來」,文件寫的是「退款流程」,字面完全不重疊,BM25 找不到,向量檢索找得到。

合併兩邊結果的常見做法是倒數排名融合(Reciprocal Rank Fusion, RRF),它只看名次不看分數,所以不需要處理兩套分數尺度不同的問題,實作簡單而且效果穩定。

另外一個現實理由:BM25 不需要 GPU、不需要訓練、可以即時更新索引,成本比向量檢索低一個量級。

情境判斷

Q1(判斷題): 一篇很長的文件重複很多次關鍵字,BM25 會一直把它排第一嗎? → 不會完全照次數線性加分,因為詞頻會飽和,文件長度也會被校正。

Q2(判斷題): 如果使用者查的是同義詞,BM25 還一定有用嗎? → 有用但不夠,這時常會再搭配語意檢索。

相關術語

常見問題

BM25 和 TF-IDF 差在哪?

BM25 多了詞頻飽和和文件長度修正,搜尋排序通常更穩。

BM25 適合做語意搜尋嗎?

單獨用不夠,因為它主要是詞字面匹配。

參數 k1 和 b 是什麼?

k1 控制詞頻飽和,b 控制文件長度影響。