当前位置: 首页 > article >正文

大模型 RAG 中 RRF(Reciprocal Rank Fusion倒数排序融合)是什么

大模型 RAG 中 RRFReciprocal Rank Fusion倒数排序融合是什么Reciprocal Rank Fusion (RRF)是一种将多个搜索结果列表比如 ES 的全文检索列表和向量搜索列表合并成一个统一排名列表的算法。它的核心思想非常朴素且强大一个文档在不同列表中排名越靠前它的最终得分就越高。它的优势在于不需要对不同查询的得分Score进行归一化比如全文检索分可能是 100向量检索分是 0.9直接根据“排名”来计算。一、RRF是什么1. RRF 的数学公式对于每一个文档ddd其 RRF 得分的计算公式为RRFscore(d∈D)∑r∈R1kr(d)RRFscore(d \in D) \sum_{r \in R} \frac{1}{k r(d)}RRFscore(d∈D)r∈R∑​kr(d)1​RRR: 所有的排名列表集合比如全文检索结果集和向量检索结果集。r(d)r(d)r(d): 文档ddd在列表rrr中的排名从 1 开始。kkk: 一个常数平滑参数通常默认为60。它的作用是减轻低排名文档对总分的影响防止排名太靠后的文档通过“凑数”挤到前面。2. 具体计算示例假设用户搜“入职流程”我们得到两个列表列表 A全文检索: [文档1, 文档2, 文档3]列表 B向量检索: [文档2, 文档1, 文档4]取k60k 60k60计算得分文档1:1601(A)1602(B)≈0.016390.016120.03251\frac{1}{601} (A) \frac{1}{602} (B) \approx 0.01639 0.01612 0.032516011​(A)6021​(B)≈0.016390.016120.03251文档2:1602(A)1601(B)≈0.016120.016390.03251\frac{1}{602} (A) \frac{1}{601} (B) \approx 0.01612 0.01639 0.032516021​(A)6011​(B)≈0.016120.016390.03251文档3:1603(A)0(B)≈0.01587\frac{1}{603} (A) 0 (B) \approx 0.015876031​(A)0(B)≈0.01587文档4:0(A)1603(B)≈0.015870 (A) \frac{1}{603} (B) \approx 0.015870(A)6031​(B)≈0.01587最终文档1和文档2会排在最前面因为它们在两个维度上都表现优秀。3. 在 Elasticsearch 中如何开启在 ES 8.8 版本中官方已经原生内置了 RRF你不需要自己写 Python 逻辑去算分直接在查询请求中配置rank参数即可。JSON{ sub_searches: [ { query: { match: { content: 入职流程 } } // 1. 全文检索 }, { knn: { // 2. 向量检索 field: content_vector, query_vector: [0.1, 0.2, ...], k: 10, num_candidates: 100 } } ], rank: { rrf: { // 3. 开启 RRF 合并 window_size: 50, // 参与排序的前 N 个文档 rank_constant: 60 // 公式中的 k 值 } } }4. 为什么要用 RRF对大模型处理的好处在 RAG 系统中如果你只给大模型看前 3 条资料这 3 条资料的质量决定了回答的上限。互补性全文检索负责抓取“专有名词”如工号、政策编号向量检索负责抓取“语义意图”如怎么请假。稳定性RRF 不需要像Linear Combination线性加权如0.7×text0.3×vector0.7 \times \text{text} 0.3 \times \text{vector}0.7×text0.3×vector那样手动调权重它在大多数业务场景下表现非常稳健。5. 纯 Python 实现逻辑如果你的 ES 版本较低不支持原生的rank参数你可以手动用 Python 处理Pythondef rrf_merge(results_list, k60): rrf_scores {} for results in results_list: for rank, doc_id in enumerate(results, start1): if doc_id not in rrf_scores: rrf_scores[doc_id] 0 rrf_scores[doc_id] 1 / (k rank) # 按得分从高到低排序 sorted_docs sorted(rrf_scores.items(), keylambda x: x[1], reverseTrue) return sorted_docs二、以ES 为例怎么实现不同模式查询1. 搜索“一句话”使用 Full-text Queries如果你直接把用户的一句提问比如“如何办理入职手续”传给 ES你应该使用match查询。工作原理ES 会先把这一句话进行“分词”Tokenization。比如把“如何办理入职手续”拆成“如何”、“办理”、“入职”、“手续”。召回逻辑它会去索引里找包含这些词的文档。即便文档里写的是“入职流程办理”只要关键词重合度高它就能被检索出来。适用场景标准的 RAG 场景用户提问通常就是一句话。// 示例全文检索一句话 { query: { match: { content: 如何办理入职手续 } } }2. 搜索“关键词/精确值”使用 Term-level Queries如果你只想查某个特定的 ID、标签或者状态比如status: active通常使用term查询。工作原理它不会对你的输入进行分词而是拿着你输入的字符串去匹配索引里一模一样的内容。局限性如果你用term去搜一句话大概率什么也搜不到因为它在找一整句完全一致的索引项而索引通常是按词拆分的。3. 如何让“一句话”搜得更准既然你是为了给大模型LLM提供上下文以下三种进阶搜索方式更符合你的需求查询方式适合的输入特点match一句话只要词对上了就行顺序乱了也没关系。match_phrase短语/整句不仅要求词对上还要求顺序也得一致比如搜“年假规定”不会搜出“规定年假”。ELSER(语义搜索)模糊的提问ES 8.x 推出的模型支持语义理解。即使你搜“怎么休假”也能搜到包含“请假制度”的文档即便字面上没有重复的词。4. 给大模型处理时的建议由于大模型对上下文的质量很敏感建议你在 ES 检索时开启高亮或截断不要直接把万字长文丢给模型利用 ES 的highlight找到最相关的片段。混合检索Hybrid Search用match保证关键词没漏比如具体的专有名词、工号。用knn向量搜索保证语义理解没偏。通过 RRF倒数排名融合合并结果给模型最精准的那几段话。三、代码实现在代码层面实现 ES 检索并对接大模型通常有两种主流方式一种是使用Elasticsearch 官方 Python SDK适合底层控制另一种是使用LangChain/LlamaIndex适合快速搭建 RAG 流程。以下是几种核心查询方式的具体实现逻辑1. 使用官方 SDK 实现三种查询在 Python 中我们通常构建一个query字典发送给 ES 接口。from elasticsearch import Elasticsearch # 连接 ES es Elasticsearch(http://localhost:9200) index_name knowledge_base def search_es(user_input, query_typematch): if query_type match: # 1. 全文检索自动分词匹配度越高排名越靠前 query { match: { content: user_input } } elif query_type match_phrase: # 2. 短语匹配要求词序一致适合搜具体的规定名称 query { match_phrase: { content: user_input } } elif query_type bool: # 3. 组合查询最常用既要满足关键词又要满足过滤条件 query { bool: { must: [{match: {content: user_input}}], filter: [{term: {status: published}}] } } response es.search(indexindex_name, queryquery, size3) # 提取查询结果给大模型做上下文 return [hit[_source][content] for hit in response[hits][hits]]2. 向量检索Vector Search的实现如果你想支持“语义相似”而不只是“字面匹配”需要先将“一句话”转化成向量。# 假设你已经有了向量模型模型如 OpenAI 或 HuggingFace user_vector embedding_model.encode(怎么申请带薪假) query { knn: { field: content_vector, # 预先在 ES 中存好的向量字段 query_vector: user_vector, k: 3, num_candidates: 100 } } res es.search(indexindex_name, knnquery)3. 对接大模型LLM的完整闭环这是 RAG 最关键的一步将 ES 拿回来的数据“塞”进 Prompt。def generate_answer(user_question): # 第一步ES 检索 context_list search_es(user_question, query_typematch) context_text \n.join(context_list) # 第二步构建 Prompt prompt f 你是一个助手请根据以下参考资料回答用户的问题。 如果资料中没有提到请说不知道。 参考资料 {context_text} 用户问题{user_question} # 第三步调用大模型以 OpenAI 接口为例 # response llm.chat(prompt) return f已根据 {len(context_list)} 条背景资料生成回答4. 为什么现在流行“混合检索” (Hybrid Search)在实际业务中你会发现全文检索搜“工号 12345”很准但搜“心情不好想请假”很差。向量检索搜“情绪”很准但搜“工号”经常乱匹配。

相关文章:

大模型 RAG 中 RRF(Reciprocal Rank Fusion倒数排序融合)是什么

大模型 RAG 中 RRF(Reciprocal Rank Fusion倒数排序融合)是什么 Reciprocal Rank Fusion (RRF) 是一种将多个搜索结果列表(比如 ES 的全文检索列表和向量搜索列表)合并成一个统一排名列表的算法。它的核心思想非常朴素且强大&…...

论文排版之添加图片、表格、公式的题注

添加图片、表格、公式的题注 不想手动输入域代码教程在 WPS 上使用教学视频 题注能为图片、表格、公式添加智能编号,避免手动修改的麻烦。 1. 插入题注 a. 选中对象,在【引用】选项卡点击【插入题注】。(也可以不选中对象,直接在…...

无需服务器!Windows 部署 OpenClaw,打造私人 AI助手

欢迎来到我的博客,代码的世界里,每一行都是一个故事🎏:你只管努力,剩下的交给时间 🏠 :小破站 无需服务器!Windows 部署 OpenClaw,打造私人 AI助手前言1 什么是OpenClaw&…...

kubernetes知识点汇总13-18

13. 系统默认创建了哪几个namespace?答:default:用户创建资源对象时的默认命名空间。kube-node-lease:包含用于与各个节点关联的lease(租约)对象,lease保证kubelet可 以向api-server发送心跳&am…...

C语言指针概念详解:数组指针与二级指针的本质区别

前言 最近考研复试在复习C语言,突然看到以前初学时没有深究的一个知识点:数组指针与指针数组(int (*p)[5] vs int *p[5]) 之前一直以为这它们虽然一个本质是指针,一个本质是数组,但是二者同为二级指针&am…...

利用qwen 3.5-9b模型识别几何图像并转换成latex tikz代码

一开始用的是0.8b,没有识别成功,重复输出\\draw [blue] (1,-1) -- (0,0);\n\\draw [blue] (0,0) -- (1,0);, 被我终止了。 再用大一点的9b试一下,以前编写python程序就遇到0.8b错误,而9b正确的情况。 先下载9b的mmproj文件&…...

“十五五”规划:新建若干所新型研究型大学

以下内容转载自微信公众号“青塔”,仅作分享 原文链接:https://mp.weixin.qq.com/s/fy9WLPuZ3T_u_D1ywoK7rQ 近日,新华社受权全文播发《中华人民共和国国民经济和社会发展第十五个五年规划纲要》与李强总理代表国务院在十四届全国人大四次会…...

AIA | 西工大马启悦,高传强等:物理指导的激波抖振抑制翼型优化设计研究

物理指导的激波抖振抑制翼型优化设计研究 Physics-guided airfoil optimization design for shock buffet suppression 马启悦,高传强*,邬晓敬,张伟伟 引用格式: Ma Q, Gao C, Wu X, et al. Physics-guided airfoil optimizatio…...

【杂谈】-人工智能蓬勃演进背后的隐性支撑体系

人工智能蓬勃演进背后的隐性支撑体系 文章目录人工智能蓬勃演进背后的隐性支撑体系1、人工智能扩张正改写资源需求格局2、降低对社区的影响,已成为企业发展的紧迫使命3、从公开承诺迈向基础设施层面的实质性变革4、立足资源约束,开展基础设施创新设计人工…...

【MicroPython编程-ESP32篇:设备驱动】-8x8LED点阵驱动(基于Max7219+SPI)

8x8LED点阵驱动(基于Max7219+SPI) 文章目录 8x8LED点阵驱动(基于Max7219+SPI) 1、Max7219 LED驱动器介绍 2、软件准备 3、硬件准备 4、代码实现 4.1 MAX7219传感器驱动 4.2 主程序 1、Max7219 LED驱动器介绍 MAX7219/MAX7221是一款紧凑型串行输入/输出共阴极显示驱动器,可将微…...

实战演练:从零构建基于线性表的图书管理系统

1. 为什么选择线性表实现图书管理系统 刚接触数据结构时,很多人会疑惑:为什么图书管理系统要用线性表实现?这个问题我也思考了很久。直到去年帮学校图书馆升级系统时,我才真正理解线性表的优势。想象一下图书馆的书架,…...

Kali 离线环境部署 ipmitool 实战指南

1. 为什么要在Kali离线环境折腾ipmitool? 如果你和我一样,经常需要带着Kali Linux笔记本钻进机房、数据中心,或者在一些网络隔离的敏感环境里做安全评估或运维工作,那你肯定对“离线”这两个字又爱又恨。爱的是,离线环…...

ECharts高级技巧:动态控制饼图hover效果,让隐藏数据真正‘消失‘

ECharts高级技巧:动态控制饼图hover效果,让隐藏数据真正"消失" 在数据可视化领域,ECharts作为一款强大的JavaScript图表库,其灵活性和定制化能力一直备受开发者青睐。特别是在处理复杂交互场景时,ECharts提供…...

【STM32CubeMX】基于ADC反馈与DAC输出的PID闭环电压调节实战

1. 从零开始:为什么我们需要一个“聪明”的电压调节系统? 大家好,我是老张,一个在嵌入式领域摸爬滚打了十多年的工程师。今天我想和大家聊聊一个非常经典且实用的实战项目:用STM32做一个能自己“思考”和“调整”的电压…...

解决gcc编译错误:sys/cdefs.h缺失问题的全面指南

1. 问题现象与背景分析 当你尝试在64位Linux系统上编译32位程序时,突然遇到这样的报错信息: /usr/include/features.h:367:25: fatal error: sys/cdefs.h: No such file or directory这个错误看起来让人一头雾水——明明系统运行得好好的,为什…...

Matlab新手必看:DPABI脑影像分析工具从下载到运行的完整指南(附SPM配置)

Matlab脑影像分析实战:DPABI与SPM环境配置全解析 在神经科学研究领域,脑影像数据分析一直是推动认知科学、临床医学和心理学发展的重要工具。对于刚接触这一领域的科研人员来说,如何快速搭建一个稳定可靠的分析环境往往是第一个需要跨越的门槛…...

Meta联合国际警方使用AI技术打击全球诈骗网络

并非所有诈骗都始于恶意软件或账户被盗。有时,一个好友请求或聊天中分享的链接就足以实施诈骗。Meta为保护用户免受诈骗分子侵害,周三宣布在WhatsApp、Facebook和Messenger中新增反诈骗工具,包括WhatsApp的设备关联警告和Facebook的可疑好友请…...

从TI杯D题手势识别装置出发:OpenMV与Arduino的嵌入式视觉开发指南

从手势识别到嵌入式视觉:OpenMV与Arduino实战开发全解析 在智能硬件开发领域,手势识别技术正逐渐从实验室走向实际应用。不同于传统的传感器方案,基于计算机视觉的手势识别系统无需接触设备,通过摄像头捕捉手势动作即可实现人机交…...

FastReport 6.9.15在Delphi 11上的完整配置流程(含TeeChart集成)

FastReport 6.9.15在Delphi 11上的完整配置与TeeChart集成实战指南 对于Delphi开发者而言,FastReport作为一款功能强大的报表工具,能够显著提升数据可视化与报表生成效率。本文将详细介绍在Delphi 11环境中配置FastReport 6.9.15的全过程,并重…...

GNS3 3.0.5实战:5分钟搞定Cloud设备与VMware网卡桥接(附排错技巧)

GNS3 3.0.5云设备与VMware网卡桥接实战指南 1. 环境准备与基础配置 在开始GNS3与VMware的桥接实验前,需要确保基础环境配置正确。GNS3 3.0.5版本采用了全新的架构设计,将核心服务全部迁移到了GNS3虚拟机中运行,这带来了更高的稳定性和兼容性&…...

USB(三)——状态转换与枚举优化

1. USB设备状态转换机制详解 USB设备从插入到正常工作需要经历一系列状态变化,这个过程就像新生婴儿从出生到逐渐适应环境。我调试过上百个USB设备,发现90%的稳定性问题都出现在状态转换阶段。让我们用最接地气的方式拆解这个流程。 1.1 从物理连接到逻辑…...

知识图谱实战:从零构建企业级知识库的完整技术路线

1. 知识图谱的工业级应用场景 第一次接触知识图谱是在2016年,当时参与一个金融风控项目,需要从海量非结构化数据中挖掘企业关联关系。传统的关系型数据库在处理多层股权穿透查询时,性能急剧下降,而改用图数据库后,查询…...

LIN诊断---传输层协议数据单元(PDU)详解与应用

1. LIN诊断传输层PDU基础解析 第一次接触LIN诊断时,我也被各种缩写搞得晕头转向。后来在实际项目中调试车窗控制器才发现,理解PDU(Protocol Data Unit)就像拆解快递包裹——外包装标注了收件人、包裹类型和内容物信息。LIN总线上的…...

深入解析3-8译码器:从原理到实践应用

1. 3-8译码器基础原理 第一次接触3-8译码器时,我完全被那一堆输入输出线搞晕了。后来才发现,它的核心逻辑其实特别简单——就像小区里的快递柜,输入三位取件码(比如101),对应的5号柜门就会自动打开&#xf…...

Docker命令实战指南:从入门到精通的必备操作手册

1. Docker基础命令:从零开始上手 第一次接触Docker时,我完全被各种命令搞晕了。后来发现只要掌握几个核心命令,就能完成80%的日常操作。先来看看最基础的几个命令: docker version这个命令会显示你安装的Docker客户端和服务端版本…...

金融学考研笔记三

第三讲 国际收支与国际资本流动第一节 国际收支一、国际收支国际收支是在一定时期内一个国家或地区与其他国家或地区之间进行的全部经济交易的系统记录。国际收支记录的是对外的交往,即一国居民与非居民之间的交往。居民是指在一个国家经济领土内具有经济利益的经济…...

STM32H743+Radxa CM3异构架构3D打印机主控设计

1. 项目概述本项目是一款面向FDM型3D打印机的高性能主控系统,核心控制器采用意法半导体(STMicroelectronics)推出的STM32H743IIT6微控制器。该芯片基于ARM Cortex-M7内核,主频高达480 MHz,具备1 MB片上Flash与1 MB SRA…...

Kotaemon使用技巧:如何优化文档切片策略提升问答准确率?

Kotaemon使用技巧:如何优化文档切片策略提升问答准确率? 你是不是遇到过这种情况:用Kotaemon搭建了一个文档问答系统,上传了公司几十份产品手册,满怀期待地问它“我们的旗舰产品支持哪些操作系统?”&#…...

Bitwarden自建指南:用Cpolar实现内网穿透,打造个人密码管理服务器(群晖版)

Bitwarden私有化部署全攻略:基于群晖NAS与Cpolar的零门槛解决方案 在数字化生存成为常态的今天,密码管理已从可选项变为刚需。当LastPass连续发生安全事件、1Password被私募股权收购时,技术敏感型用户开始寻找更自主的数据管控方案。Bitwarde…...

Podman国内镜像加速终极指南:阿里云镜像源配置详解(2023最新版)

Podman国内镜像加速终极指南:阿里云镜像源配置详解(2023最新版) 如果你在使用Podman时遇到过镜像拉取缓慢的问题,那么这篇文章正是为你准备的。作为一款轻量级的容器引擎,Podman在开发者和DevOps工程师中越来越受欢迎。…...