長文件正規化懲罰實例:詞「檢索」在 d1(長度3)與 d2(長度8,本頁最長文件)都恰好出現 1 次(tf=1),IDF 相同,但 d1 分數≈0.4196,d2 分數≈0.2642——同樣 tf=1,文件長度越超過平均長度 (avgdl=4.5),分母的長度正規化項越大,分數越低,這就是 BM25 抑制「長文件灌水」的機制。
df / IDF 對照表
| 詞 | df | IDF |
|---|
總分 / 排名表
| 名次 | 文件 | 總分 |
|---|
想在一堆文件裡找答案,就像問兩個個性不同的朋友:一個記性好、你講的字要一模一樣才找得到, 專有名詞和代碼最準,換句話說卻會傻眼;另一個很懂你的意思、能猜到你想問什麼,但常漏掉必須 一字不差的字眼。與其只信一個,不如兩個都問、再把兩份名單合成一份——這就是混合檢索 (hybrid retrieval)的想法。下面你會看到 BM25 怎麼逐詞替關鍵字打分,RRF 又怎麼只看名次、把兩路排名截長補短融成最終順序。
現代 RAG(檢索增強生成)系統很少只用單一路檢索:BM25 抓「關鍵字語意」(詞出現在多少文件裡、在單一文件 裡出現幾次,配合文件長度正規化避免長文件灌水取巧),向量檢索抓「語意相似度」(見 HNSW 等近似最近鄰索引)。兩路排序清單的分數量綱通常不可直接比較(BM25 分數 與向量餘弦相似度不是同一種尺度),因此常用 RRF(Reciprocal Rank Fusion,倒數排名融合)只看各路的 「名次」而非原始分數,依 1/(k+rank) 加總重新排序,讓兩路排序截長補短。本頁 Section 1 示範 BM25 逐詞 逐文件打分表,Section 2 示範 RRF 融合排名與三方排名對照。
統計:對查詢詞逐一計算文件頻率 df(含詞的文件數)與逆文件頻率 IDF;本頁採 BM25+ 慣例變體 IDF = ln((N-df+0.5)/(df+0.5)+1),分式外多加的「+1」讓 IDF 對任意 0≤df≤N 恆正——查詢詞「檢索」 df=3(4 份文件裡有 3 份含詞,超過半數),教科書原始 BM25 公式 ln((N-df+0.5)/(df+0.5)) 在此會算出 負值(≈-0.847),BM25+ 變體則仍為正值(≈0.357),是 Lucene 等實務系統常見的穩定寫法,非教科書 唯一寫法,本頁誠實標示為變體而非原始定義。打分:tf=0 時分數為 0;否則 idf·(tf·(k1+1))/(tf+k1·(1-b+b·(docLen/avgdl))),k1=1.5 控制詞頻飽和速度,b=0.75 控制長度正規化 強度——文件越長於平均長度(avgdl),分母越大、分數越受懲罰。逐詞分數加總為文件總分,依分數高到低 排名(同分取索引小,tie-break)。
| 詞 | df | IDF |
|---|
| 名次 | 文件 | 總分 |
|---|
輸入 A 為上方 BM25 節算出的排名;輸入 B 為 VEC_RANKING——固定給定的「向量檢索排名」示意值,並非本頁 計算所得,代表現實系統中由 HNSW 等 ANN 索引另外算出的一路排名,本頁誠實標示其為外部輸入,不假裝 是本頁推導的結果。兩路排名各自轉為 1-based 名次後,逐文件算 RRF 分數 = 1/(k+rankA) + 1/(k+rankB), k=60 是 Cormack et al. (2009) 原始論文與多數實務系統(Elasticsearch、OpenSearch 等)沿用的慣例平滑 常數,本頁沿用而非自行推導,數值越小的名次(越前面)貢獻越大。依 RRF 分數由高到低重新排序即為融合 排名(同分 tie-break 與 BM25 排名共用同一套規則:索引小者優先)。
| 名次 | BM25 | 向量(外部給定) | 融合 |
|---|