检索融合方法- 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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等。压缩的目的是减少数据量&…