檢索融合方法- Distribution-Based Score Fusion (DBSF)

在信息檢索(IR)、推薦系統和多模態檢索中,我們常常需要融合來自多個檢索器或模型的結果。不同檢索器可能對同一文檔打出的分數差異很大,如果直接簡單加權,很容易出現某個檢索器“主導融合結果”的情況。

Distribution-Based Score Fusion (DBSF) 是一種基于分布的分數融合方法,它通過統計方法對各檢索器的分數進行歸一化和標準化,使得融合過程更加穩健和公平。

背景

在多檢索器融合中,我們通常面臨以下問題:

  1. 分數尺度不統一

    • BM25 輸出的分數范圍可能是 0–30

    • Dense Embedding 輸出余弦相似度,范圍可能是 0–1

  2. 分布形態差異大

    • 某些檢索器的分數分布可能非常集中(方差小)

    • 某些檢索器存在極端值(outliers)

  3. 傳統方法的局限

    • Min-Max 或 Z-score 歸一化 + 加權融合

      • 容易受 outlier 影響

      • 對分布差異大的檢索器不夠穩健

    • 人工加權需要經驗和先驗知識

DBSF 應運而生,它通過統計分布的方式統一各檢索器的貢獻,不依賴復雜的手動權重。

DBSF 的原理

DBSF 的核心步驟如下:

  1. 計算均值和標準差
    對每個檢索器的分數集計算:

    • 均值 μ

    • 標準差 σ

  2. 截斷分數到 μ±3σ

    • 小于 μ?3σ 的分數 → 0

    • 大于 μ+3σ 的分數 → 1

    • 中間分數線性縮放到 0–1

  3. 標準化與歸一化
    對在 μ±3σ 區間的分數:

    s' = \frac{s - (\mu - 3\sigma)}{6\sigma}
  4. 融合分數
    將各檢索器的歸一化分數相加(或平均):

    \text{fused\_score}(d) = \sum_i s'_i(d)

這種方法能夠避免極端值影響,同時保證不同檢索器的信號都有貢獻。

優缺點

優點

  • 穩健性高:對 outlier 不敏感

  • 分布自適應:不同檢索器的分數分布差異大時效果更好

  • 無需手動調權重:自動平衡各檢索器的貢獻

  • 易于實現:基于均值和標準差即可

缺點

  • 無法體現先驗偏好:如果某個檢索器非常重要,DBSF 不會自動偏向它

  • 假設分數近似正態分布:在極端非正態分布下,μ±3σ 截斷可能不完全合理

  • 單純線性加權:融合邏輯簡單,可能無法捕捉復雜關系

示例代碼(Python)

下面是一個簡化實現示例:

import numpy as np
from collections import defaultdictdef normalize_dbsf(scores):values = np.array(list(scores.values()))mu, sigma = values.mean(), values.std(ddof=1) if len(values) > 1 else (values.mean(), 1e-9)lower, upper = mu - 3*sigma, mu + 3*sigmanorm_scores = {}for doc, s in scores.items():if upper == lower:ns = 0.5else:ns = (s - lower) / (upper - lower)ns = max(0.0, min(1.0, ns))norm_scores[doc] = nsreturn norm_scoresdef dbsf_fusion(results_list):fused = defaultdict(float)for scores in results_list:norm_scores = normalize_dbsf(scores)for doc, ns in norm_scores.items():fused[doc] += nsreturn sorted(fused.items(), key=lambda x: x[1], reverse=True)# 示例數據
bm25 = {"doc1": 28.4, "doc2": 17.2, "doc3": 3.9, "doc4": 10.5}
dense = {"doc1": 0.78, "doc2": 0.65, "doc3": 0.52, "doc4": 0.31}
ctr = {"doc1": 0.045, "doc2": 0.032, "doc3": 0.028, "doc4": 0.041}# 融合
fused_results = dbsf_fusion([bm25, dense, ctr])
print(fused_results)

輸出示例:

[('doc1', 2.07), ('doc2', 1.53), ('doc4', 1.25), ('doc3', 1.15)]

可以看到,doc3 雖然在 BM25 分數很低,但在 Dense 和 CTR 中仍然貢獻了一部分分數,被合理保留在排名中。

llama_index 相關的代碼實現。?

from llama_index.core.retrievers import QueryFusionRetrieverretriever = QueryFusionRetriever([vector_retriever, bm25_retriever],retriever_weights=[0.6, 0.4],similarity_top_k=10,num_queries=1,  # set this to 1 to disable query generationmode="dist_based_score",use_async=True,verbose=True,
)nodes_with_scores = retriever.retrieve("What happened at Interleafe and Viaweb?"
)for node in nodes_with_scores:print(f"Score: {node.score:.2f} - {node.text[:100]}...\n-----")

應用場景示例

  1. 多檢索器文本搜索:BM25 + Dense Embedding + Click-Through Rate

  2. 多模態檢索:文本檢索 + 圖像相似度

  3. 跨語言檢索:原文語言 + 翻譯語言

  4. 推薦系統:不同算法輸出的評分融合

DBSF 在這些場景下都能顯著提升融合結果的穩健性和多樣性。

總結

  • DBSF 是一種基于統計分布的分數融合方法

  • 通過 μ±3σ 截斷 + 標準化 + 相加,實現多檢索器結果的穩健融合

  • 適合 分布差異大沒有明確權重先驗 的場景

  • 實現簡單,可用 Python 自定義,也可以使用如 LlamaIndexQdrantUpstash 等系統內置功能

📚 參考資料

  • LlamaIndex 文檔:Relative Score Fusion 和 Distance-Based Score Fusion

  • Qdrant 文檔:Hybrid Queries

  • Upstash 文檔:Hybrid Indexes

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/99219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/99219.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/99219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle體系結構-歸檔日志文件(Archive Log Files)

核心概念:什么是歸檔日志文件? 定義: 歸檔日志文件(Archive Log Files)是在線重做日志文件(Online Redo Log Files)在被覆蓋之前的一個完整副本。它們由 Oracle 的后臺進程 ARCn(歸檔…

GoogLeNet實戰:用PyTorch實現經典Inception模塊

配套筆記&講解視頻,點擊文末名片獲取研究背景(Background) 1.1 領域現狀(大環境與挑戰) 想象一下,你和朋友們在看一大堆照片——貓、狗、汽車、蛋糕,大家要把每張照片貼上標簽。幾年前&…

【開題答辯全過程】以 “舊書驛站”微信小程序的設計與開發為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人,語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

【辦公類-112-01】20250912家園每周溝通指導(Deepseek擴寫完善+Python模擬點擊鼠標自動發送給家長微信)

背景需求 孩子剛上小班,家長比較關心孩子情況(情緒、社交、吃飯等) 所以我每周五晚上和家長溝通一下孩子的情況。 操作流程 第一周(9月5日)是“適應周”,我添加了所有孩子的一位家長的微信號 23份全部是手打,足足寫了4個小時。第一周案例多,所以寫了很多,措辭醞釀后…

Spark專題-第一部分:Spark 核心概述(1)-Spark 是什么?

眾所周知,教學文檔總該以理論部分作為開篇,于是我們這篇Spark專題同樣會以一堆理論和專有名詞開始,筆者會盡可能的讓專業詞匯通俗易懂 第一部分:Spark 核心概述 Spark 是什么? 1. 大數據時代的"超級賽車"…

從零到一上手 Protocol Buffers用 C# 打造可演進的通訊錄

一、為什么是 Protobuf(而不是 XML/自定義字符串/.NET 二進制序列化) 在需要把結構化對象持久化或跨進程/跨語言傳輸時,常見方案各有痛點: BinaryFormatter 等 .NET 二進制序列化:對類型簽名與版本極其脆弱、體積偏大&…

計算機網絡(三)網絡層

三、網絡層網絡層是五層模型中的第三層,位于數據鏈路層和傳輸層之間。它的核心任務是實現數據包在不同網絡之間(跨網絡)的邏輯傳輸。網絡層的數據傳輸單位是數據報(Datagram)或數據包(Packet)。…

互聯網大廠Java面試實錄:從基礎到微服務全棧技術答疑

互聯網大廠Java面試實錄:從基礎到微服務全棧技術答疑 本文以電商場景為背景,展現一場互聯網大廠Java開發職位的面試過程。嚴肅的面試官與搞笑的水貨程序員謝飛機展開三輪技術問答,涵蓋Java SE、Spring Boot、數據庫、微服務、安全以及CI/CD等…

StringBuilder 深度解析:數據結構與擴容機制的底層細節

文章目錄 前言 一、數據結構:不止是簡單的字符數組 1. 核心成員變量(定義在 AbstractStringBuilder 中) 2. 構造器與初始容量 二、擴容機制:從 "不夠用" 到 "換大容器" 的全過程 步驟 1:計算…

Elasticsearch面試精講 Day 17:查詢性能調優實踐

【Elasticsearch面試精講 Day 17】查詢性能調優實踐 在“Elasticsearch面試精講”系列的第17天,我們聚焦于查詢性能調優實踐。作為全文檢索與數據分析的核心引擎,Elasticsearch的查詢性能直接影響用戶體驗和系統吞吐能力。在高并發、大數據量場景下&…

WPF 數據綁定模式詳解(TwoWay、OneWay、OneTime、OneWayToSource、Default)

在WPF中,數據綁定模式(Binding Mode)用于指定數據流的方向。常見的模式有TwoWay、OneWay、OneTime、OneWayToSource和Default。TwoWay(雙向綁定):數據從源(通常是ViewModel或數據上下文&#xf…

使用 NVIDIA Dynamo 部署 PD 分離推理服務

1 Dynamo 介紹 NVIDIA Dynamo 是一個開源的模塊化推理框架,用于在分布式環境上實現生成式 AI 模型的服務化部署。Dynamo 通過動態資源調度、智能路由、內存優化與高速數據傳輸,無縫擴展大型 GPU 集群之間的推理工作負載。 Dynamo 采用推理引擎無關的設…

答題卡識別改分項目

目錄 核心思路 分步實現與代碼解析 1. 環境準備與工具函數定義 2. 圖片預處理 3. 輪廓提取與篩選 3. 輪廓提取與篩選 4. 透視變換(矯正傾斜答題卡) 5. 閾值處理(突出填涂區域) 6. 提取選項圓圈輪廓 7. 選項輪廓排序&…

Python爬蟲實戰:研究Pandas,構建新浪網股票數據采集和分析系統

1. 系統概述 股票數據分析系統旨在通過自動化手段獲取市場數據,進行深度分析,輔助投資決策。本系統主要包含以下核心模塊: 數據爬取模塊:從新浪財經獲取股票列表、基本信息及歷史交易數據 數據處理模塊:清洗原始數據,處理缺失值與異常值,計算技術指標 分析可視化模塊:…

【C++STL】list的詳細用法和底層實現

🌟個人主頁:第七序章 🌈專欄系列:C++ 目錄 ??前言: 🌈一:介紹 🌈二:list的創建 ??基本框架 🌙節點類 🌙構造函…

AI大模型開發(多模態+提示詞)

接著之前的例子,繼續測試模型對話,今天主要測試多模態加上系統提示詞。 一.多模態 多模態方法,主要添加了對圖片的測試。 public String chatWithMessage(UserMessage userMessage){ChatResponse chatResponse qwenChatModel.chat(userMess…

Qt程序單獨運行報錯問題

Qt程序單獨運行報錯問題介紹問題原因分析解決方案(從最佳實踐到臨時方法)方法一:使用 windeployqt 工具(最推薦、最規范)方法二:臨時修改系統 PATH(適合開發調試)方法三:…

Flask學習筆記(二)--路由和變量

一、路由Flask支持兩種路由1、使用route()裝飾器將URL綁定到函數app.route(/hello)def hello_world():return hello world2、使用應用程序對象的add_url_rule()函數def hello_world():return hello worldapp.add_url_rule(/, hello, hello_world)二、變量規則Flask開發中&#…

Skywalking告警配置+簡易郵件告警應用配置(保姆級)

Skywalking告警配置簡易郵件告警應用配置前言: 前文:SkyWalking Elasticsearch8 容器化部署指南:國內鏡像加速與生產級調優_skywalkinges-CSDN博客 ? SKywalking Agent配置Oracle監控插件安裝指南-CSDN博客 Skywalking版本:V10.…

無人機如何實現圖傳:從原理到實戰的全景解讀

無人機圖傳的工作不是簡單地把鏡頭的數據直接“丟”到一個屏幕上,而是一個由編碼、傳輸、解碼三段組成的系統。首先是視頻編碼:攝像頭采集的原始畫面通常需要經過編解碼器壓縮,常見標準包括H.264、H.265和VP9等。壓縮的目的是減少數據量&…