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

RAG 系列(十):混合检索——让召回更全面

向量检索的一个盲区假设你的知识库里有一篇文档内容包含这样一句话“中文场景推荐使用BAAI/bge-large-zh-v1.5向量维度为 1024。”用户问“BAAI/bge-large-zh-v1.5 的向量维度是多少”你以为这是送分题——完全一样的词向量检索应该能轻松找到。实际上不一定。向量检索依赖语义相似度当查询和文档的用词高度重叠时它并不比 BM25 更有优势有时甚至更差。BM25 算法是专门为精确词频匹配设计的处理这类问题是它的主场。真正的问题是你的 RAG 系统一定会同时遇到两类查询关键词查询包含精确的型号、参数、公式、人名——“BAAI/bge-large-zh-v1.5 维度”语义查询换了一种说法的概念性问题——“AI 助手总是给出过时答案怎么解决”纯向量检索擅长后者但对前者力不从心。纯 BM25 恰好相反。混合检索Hybrid Search的思路很简单两个都用再融合结果。BM25 原理速览BM25Best Match 25是搜索引擎领域的经典排名算法Elasticsearch、Lucene 都在用它。核心公式score(D, Q) Σ IDF(qi) × (f(qi, D) × (k1 1)) / (f(qi, D) k1 × (1 - b b × |D|/avgdl))人话版本IDF逆文档频率一个词在所有文档里越罕见它在匹配时越有价值。的不值钱“BGE-large-zh-v1.5” 非常值钱。TF词频这个词在文档中出现越多分数越高但收益递减。文档长度惩罚长文档不因词数多而自动获得高分。BM25 的优势完全基于词汇查询词和文档词只要有重叠就能精准命中。精确型号、产品名、函数名——这是它的主场。BM25 的劣势不理解语义。知识截止问题和AI 不知道最新信息在 BM25 看来毫无关系尽管它们说的是同一件事。RRF 融合算法有了 BM25 和向量检索两份结果怎么合并最简单的思路是把两个分数加权平均但两种算法的分数尺度完全不同直接相加没有意义。RRFReciprocal Rank Fusion的做法更优雅只看排名不看分数。公式RRF_score(d) Σ 1 / (k rank(d))rank(d)文档 d 在某个检索器中的排名第 1 名、第 2 名…k常数通常取 60防止最高排名的文档独占分数对每个检索器的排名求和举例文档BM25 排名Vector 排名RRF 分数k60doc-006131/(601) 1/(603) 0.0164 0.0159 0.0323doc-003311/(603) 1/(601) 0.0323doc-002241/(602) 1/(604) 0.0161 0.0156 0.0317RRF 的好处无论两个检索器的分数范围差多少都能公平地基于排名融合不需要手动对齐分数。实验设计6 条测试查询覆盖两种场景类型查询期望文档测试点关键词BAAI/bge-large-zh-v1.5 维度doc-003精确模型名匹配关键词RRF score sum 1/(krank) 公式doc-006精确公式字符串关键词chunk_size 256 1024 overlap 推荐doc-004精确参数值语义AI 助手总是给出过时的答案有什么方法让它了解最新信息doc-001没提 RAG语义多个团队共用一套问答系统怎么保证不同团队的资料互相看不到doc-008没提多租户语义换一种问法检索结果就完全不同怎么解决这种不稳定性doc-007没提 Multi-Query评估指标MRRMean Reciprocal RankRR 1/rank正确文档排在第几位 MRR 所有查询的 RR 均值每次都排第一 → MRR 1.0平均排第二 → MRR 0.5全部未命中 → MRR 0.0三种检索器实现BM25 检索器中文要先做分词用 jiebaimportjiebafromlangchain_community.retrieversimportBM25Retrieverdefchinese_tokenizer(text:str)-list[str]:returnlist(jieba.cut(text))bm25_retrieverBM25Retriever.from_documents(docs,k3,preprocess_funcchinese_tokenizer,)向量检索器fromlangchain_chromaimportChromafromlangchain_openaiimportOpenAIEmbeddings embeddingsOpenAIEmbeddings(modelBAAI/bge-large-zh-v1.5,api_keyos.getenv(EMBEDDING_API_KEY),base_urlhttps://api.siliconflow.cn/v1,)vectorstoreChroma.from_documents(docs,embeddingembeddings)vector_retrievervectorstore.as_retriever(search_kwargs{k:3})混合检索器EnsembleRetriever RRFfromlangchain_classic.retrieversimportEnsembleRetriever hybrid_retrieverEnsembleRetriever(retrievers[bm25_retriever,vector_retriever],weights[0.5,0.5],# 两者权重相同内部用 RRF 融合排名)EnsembleRetriever的weights参数控制的是各检索器在 RRF 中的权重不是直接加权分数。实际实现里它会对每个检索器的结果排名做加权 RRF 融合。实验结果 逐条查询结果 (RR Reciprocal RankHit1 正确文档是否排第一) [KEYWORD ] BAAI/bge-large-zh-v1.5 维度 期望文档: doc-003 BM25 [H1✓] RR1.00 | rank1 | 召回: [doc-003, doc-006, doc-004] Vector [H1✓] RR1.00 | rank1 | 召回: [doc-003, doc-005, doc-002] Hybrid [H1✓] RR1.00 | rank1 | 召回: [doc-003, doc-006, doc-004] [KEYWORD ] RRF score sum 1/(krank) 公式 期望文档: doc-006 BM25 [H1✓] RR1.00 | rank1 | 召回: [doc-006, doc-002, doc-004] Vector [H1✗] RR0.50 | rank2 | 召回: [doc-004, doc-006, doc-003] Hybrid [H1✓] RR1.00 | rank1 | 召回: [doc-006, doc-004, doc-003] [KEYWORD ] chunk_size 256 1024 overlap 推荐 期望文档: doc-004 BM25 [H1✓] RR1.00 | rank1 | 召回: [doc-004, doc-003, doc-006] Vector [H1✗] RR0.50 | rank2 | 召回: [doc-006, doc-004, doc-003] Hybrid [H1✓] RR1.00 | rank1 | 召回: [doc-004, doc-006, doc-003] [SEMANTIC] AI 助手总是给出过时的答案有什么方法让它了解最新信息 期望文档: doc-001 BM25 [H1✗] RR0.33 | rank3 | 召回: [doc-007, doc-005, doc-001] Vector [H1✓] RR1.00 | rank1 | 召回: [doc-001, doc-005, doc-007] Hybrid [H1✓] RR1.00 | rank1 | 召回: [doc-001, doc-007, doc-005] [SEMANTIC] 多个团队共用一套问答系统怎么保证不同团队的资料互相看不到 期望文档: doc-008 BM25 [H1✗] RR0.33 | rank3 | 召回: [doc-002, doc-007, doc-008] Vector [H1✓] RR1.00 | rank1 | 召回: [doc-008, doc-001, doc-002] Hybrid [H1✓] RR1.00 | rank1 | 召回: [doc-008, doc-002, doc-007] [SEMANTIC] 换一种问法检索结果就完全不同怎么解决这种不稳定性 期望文档: doc-007 BM25 [H1✗] RR0.00 | rankmiss | 召回: [doc-005, doc-001, doc-003] Vector [H1✓] RR1.00 | rank1 | 召回: [doc-007, doc-001, doc-005] Hybrid [H1✓] RR1.00 | rank1 | 召回: [doc-007, doc-001, doc-005]MRR 汇总 MRR 汇总对比 MRR1.0 → 每次都排第一MRR0.5 → 平均排第二MRR0.0 → 全未命中 查询类型 BM25 Vector Hybrid 最佳 ──────────────────────────────────────────────────────── 关键词查询 1.000 0.667 1.000 BM25 语义查询 0.222 1.000 1.000 Vector 总体 0.611 0.833 1.000 Hybrid 结论 ✓ 关键词查询BM25 MRR 更高精确词匹配优势 ✓ 语义查询Vector MRR 更高语义理解优势 ✓ 混合检索总体 MRR 最高兼顾两类查询数字解读BM25 在关键词查询上达到满分 1.000但在语义查询上只有 0.222——第三条语义查询“换一种问法”完全 miss排名都没有进前三。向量检索在语义查询上完美1.000但在关键词查询上只有 0.667——有两条 RRF 公式和 chunk_size 的查询排到了第二名而非第一。混合检索全类型满分 1.000不仅继承了 BM25 的关键词优势语义查询也不弱于纯向量。关键认知BM25 和向量检索的边界维度BM25向量检索擅长精确词匹配型号、公式、参数语义理解同义词、换一种说法失效场景查询和文档用词不同精确术语的向量表示不够区分性典型查询“BERT-base-uncased 层数”“为什么预训练模型需要微调”适合语言英文效果更好中文需分词中英文均可计算成本低无需 GPU无 API 调用较高需要 Embedding 调用什么时候一定要上混合检索知识库里包含产品型号、API 名、参数名、缩写等精确术语用户查询行为多样技术用户问精确术语普通用户问概念要求高召回率不能漏掉任何相关文档什么时候可以只用向量知识库全是自然语言文本没有精确术语查询都是语义性的概念问题资源有限不想引入额外依赖完整代码代码已开源https://github.com/chendongqi/llm-in-action/tree/main/10-hybrid-search核心文件hybrid_search.py— 三种检索策略的完整对比实验运行方式gitclone https://github.com/chendongqi/llm-in-actioncd10-hybrid-searchcp.env.example .env# 填入 Embedding API Keypipinstall-rrequirements.txt python hybrid_search.py小结本文通过代码实验对比了三种检索策略纯 BM25——关键词精确匹配的专家精确术语场景无敌但不懂语义纯向量检索——语义理解的专家概念性问法场景强但精确术语不如 BM25混合检索RRF——两者融合MRR 全场景最高RRF 算法的核心思路值得记住不比分数只比排名。这使它能够无缝融合任何两个评分体系完全不同的检索器。生产环境中混合检索已经是 RAG 系统的标配。Elasticsearch、Qdrant、Weaviate 都原生支持混合检索模式——向量检索BM25 不再是可选项而是默认推荐配置。参考资料LangChain EnsembleRetriever 文档BM25 算法论文Okapi BM25RRF 论文Reciprocal Rank FusionQdrant 混合检索文档

相关文章:

RAG 系列(十):混合检索——让召回更全面

向量检索的一个盲区 假设你的知识库里有一篇文档,内容包含这样一句话: “中文场景推荐使用 BAAI/bge-large-zh-v1.5,向量维度为 1024。” 用户问:“BAAI/bge-large-zh-v1.5 的向量维度是多少?” 你以为这是送分题——…...

魔兽争霸3终极兼容指南:5分钟解决所有现代系统问题

魔兽争霸3终极兼容指南:5分钟解决所有现代系统问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑上的各种&qu…...

Windows系统RacEngn.dll文件丢失无法启动程序解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...

三步解锁网易云音乐NCM格式转换的完整技术方案

三步解锁网易云音乐NCM格式转换的完整技术方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾遇到过这样的困境:在网易云音乐下载的歌曲只…...

Git提交记录人性化工具:从代码日志到开发故事的转变

1. 项目概述:从代码到“人”的转变最近在折腾一个很有意思的GitHub项目,叫jehna/humanify。光看名字,你可能会有点摸不着头脑——“Humanify”,让人性化?这到底是个啥玩意儿?简单来说,这是一个能…...

ncmToMp3:打破音乐平台枷锁,让你的网易云音乐真正自由播放

ncmToMp3:打破音乐平台枷锁,让你的网易云音乐真正自由播放 【免费下载链接】ncmToMp3 网易云vip的ncm文件转mp3/flac - ncm file to mp3 or flac 项目地址: https://gitcode.com/gh_mirrors/nc/ncmToMp3 你是否曾为下载的网易云VIP音乐只能在特定…...

Windows PDF处理终极指南:Poppler预编译包零配置解决方案

Windows PDF处理终极指南:Poppler预编译包零配置解决方案 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows上的PDF处理工具…...

基于Groq LPU与Llama 3.1的极速AI聊天工具全解析

1. 项目概述:一个跑在浏览器里的极速AI聊天工具 最近在折腾AI应用的时候,发现了一个挺有意思的开源项目,叫 Groq Chat 。这玩意儿本质上是一个基于浏览器的聊天界面,但它背后用的不是我们常见的OpenAI API或者本地部署的大模型…...

AetherFloat浮点架构:AI加速器的硬件革新与优化

1. AetherFloat浮点架构:AI加速器的硬件革新在AI加速器设计中,浮点计算单元一直是性能与能效的关键瓶颈。传统IEEE 754浮点标准虽然已成为通用计算的基石,但其在神经网络处理器(NPU)中的实现却面临诸多挑战:深层的对数移位器消耗大…...

GHelper:华硕笔记本性能调控的终极解决方案

GHelper:华硕笔记本性能调控的终极解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertbook, …...

基于PyAutoGUI的Cursor IDE自动化:解放重复操作,提升编程效率

1. 项目概述:当Cursor遇到AutoGUI,一场效率革命如果你是一名开发者,或者经常和代码打交道,那么Cursor这款AI编程工具大概率已经躺在你的电脑里了。它确实强大,能理解上下文、生成代码、甚至重构函数。但不知道你有没有…...

Xbox成就解锁器终极指南:免费开源工具轻松获取全游戏成就

Xbox成就解锁器终极指南:免费开源工具轻松获取全游戏成就 【免费下载链接】Xbox-Achievement-Unlocker Achievement unlocker for xbox games (barely works but it does) 项目地址: https://gitcode.com/gh_mirrors/xb/Xbox-Achievement-Unlocker 还在为Xbo…...

别再死记硬背了!用XMind搞定数据库绪论,这份保姆级思维导图笔记请收好

用XMind重构数据库绪论:视觉化学习的高效方法论 第一次翻开数据库教材时,那些"三级模式"、"E-R模型"的术语像一堵密不透风的墙。直到我把它们拆解成彩色节点,在XMind里连成知识网络,才发现抽象概念背后清晰的…...

翻转课堂在工程教育中的应用:从理论到实践的范式转变

1. 翻转课堂:工程教育的一场静默革命作为一名在工程领域摸爬滚打了十几年的从业者,我亲眼见证了技术迭代的速度如何让传统的教育模式显得力不从心。最近几年,一个词在工程教育圈里被反复提及——“翻转课堂”。这听起来像是个时髦的新概念&am…...

深度解析NHSE:揭秘《动物森友会》存档编辑器的核心技术架构

深度解析NHSE:揭秘《动物森友会》存档编辑器的核心技术架构 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE NHSE(Animal Crossing: New Horizons Save Editor)是…...

5分钟实践指南:用MiGPT将小爱音箱升级为AI语音助手深度配置

5分钟实践指南:用MiGPT将小爱音箱升级为AI语音助手深度配置 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 智能家居设备正从简单的指…...

3秒解锁百度网盘资源:baidupankey智能提取码获取终极指南

3秒解锁百度网盘资源:baidupankey智能提取码获取终极指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘分享链接的提取码而烦恼吗?每次遇到需要密码的资源,你是否也在各大论…...

如何在Mac上解锁QQ音乐加密文件:QMCDecode终极解决方案

如何在Mac上解锁QQ音乐加密文件:QMCDecode终极解决方案 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认…...

别再只用Gazebo了!用ADAMS 2020和Solidworks给你的机器人做个‘物理体检’(附四旋翼模型)

超越Gazebo:ADAMS 2020与Solidworks构建高精度机器人动力学仿真工作流 当我们在Gazebo中调试四旋翼无人机时,常常会遇到这样的困惑:为什么仿真中的飞行姿态与实物测试差异如此明显?问题的核心在于大多数机器人仿真平台对物理交互的…...

AArch64指针认证机制与QARMA算法解析

1. AArch64指针认证机制概述指针认证(Pointer Authentication,简称PAC)是Armv8.3-A架构引入的关键安全特性,旨在防御内存破坏攻击如ROP(Return-Oriented Programming)和JOP(Jump-Oriented Progr…...

Icepick:TypeScript AI智能体持久化执行库,解决生产级应用工程难题

1. 项目概述:Icepick,一个为规模化AI智能体而生的TypeScript库如果你正在用TypeScript构建AI智能体应用,并且已经受够了在分布式环境、错误恢复、任务调度这些“脏活累活”上耗费大量精力,那么Icepick很可能就是你一直在找的那个工…...

CM311-1A刷Armbian避坑全记录:从安卓TV到Linux服务器的完整指南

CM311-1A变身Linux服务器实战手册:零基础保姆级刷机指南 手里这台闲置的CM311-1A电视盒子,原本只是吃灰的电子垃圾,经过Armbian系统的改造,现在成了我书房里24小时不间断运行的Linux服务器——跑着Nextcloud私有云、Home Assistan…...

Chrome升级后网页错乱?别慌!手把手教你回退到稳定版本(Windows/Mac/Linux全平台指南)

Chrome升级后网页错乱?全平台降级指南与深度解决方案 早上打开电脑,发现Chrome自动更新后最常访问的网站排版全乱了,插件图标变成灰色,工作效率瞬间归零——这种场景对现代办公族来说简直是噩梦。浏览器作为数字生活的枢纽&#…...

Driver Store Explorer:3步快速清理Windows驱动垃圾,释放数十GB磁盘空间终极指南

Driver Store Explorer:3步快速清理Windows驱动垃圾,释放数十GB磁盘空间终极指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否经常发现Windows系统盘空…...

在卡西欧计算器上集成ChatGPT:串口通信与AI边缘应用实践

1. 项目概述:当计算器遇上AI,一场硬核的跨界实验最近在折腾一个特别有意思的项目,一个叫“ChatGPT-mod-for-casio-calculators”的开源项目。简单来说,它的目标是把ChatGPT这样的现代AI对话能力,“塞进”卡西欧&#x…...

ACE-Guard限制器终极指南:3分钟解决腾讯游戏卡顿问题

ACE-Guard限制器终极指南:3分钟解决腾讯游戏卡顿问题 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源,支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 你是否在玩《英雄联盟》、《穿越火线》或…...

ncmdump终极指南:3步解锁网易云音乐加密格式,实现音乐播放自由

ncmdump终极指南:3步解锁网易云音乐加密格式,实现音乐播放自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾遇到过从网易云音乐下载的歌曲只能在特定应用播放的困扰?当你想要在车载音响…...

基于MCP协议构建Statcast棒球数据AI智能体:从原理到实践

1. 项目概述:当棒球数据遇上AI智能体如果你是一个棒球数据分析师、体育科技开发者,或者只是一个对棒球数据科学充满好奇的爱好者,那么你很可能已经对Statcast这个数据宝库垂涎已久。Statcast系统通过遍布球场的雷达和摄像头,捕捉了…...

智慧树全自动刷课神器:Autovisor三步实现无人值守学习

智慧树全自动刷课神器:Autovisor三步实现无人值守学习 【免费下载链接】Autovisor 2025智慧树刷课脚本 基于Python Playwright的自动化程序 [有免安装版] 项目地址: https://gitcode.com/gh_mirrors/au/Autovisor 还在为智慧树网课而烦恼吗?每天需…...

Arm Compiler嵌入式安全功能解析与实践

1. Arm Compiler嵌入式安全功能深度解析在物联网设备爆炸式增长的今天,嵌入式系统安全已成为产品设计的核心考量。作为Arm生态的核心工具链,Arm Compiler for Embedded提供了一套完整的安全解决方案,从硬件架构支持到编译器级别的防护机制&am…...