惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
O
OpenAI News
D
Docker
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
人人都是产品经理
人人都是产品经理
Y
Y Combinator Blog
M
MIT News - Artificial intelligence
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 司徒正美
C
CXSECURITY Database RSS Feed - CXSecurity.com
阮一峰的网络日志
阮一峰的网络日志
K
Kaspersky official blog
Security Latest
Security Latest
T
Tailwind CSS Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
W
WeLiveSecurity
N
News and Events Feed by Topic
aimingoo的专栏
aimingoo的专栏
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
Help Net Security
Help Net Security
爱范儿
爱范儿
宝玉的分享
宝玉的分享
腾讯CDC
H
Heimdal Security Blog
Webroot Blog
Webroot Blog
AI
AI
WordPress大学
WordPress大学
Recorded Future
Recorded Future
SecWiki News
SecWiki News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Security Archives - TechRepublic
Security Archives - TechRepublic
Google Online Security Blog
Google Online Security Blog
C
Check Point Blog
TaoSecurity Blog
TaoSecurity Blog
Cisco Talos Blog
Cisco Talos Blog
The Cloudflare Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - Franky
云风的 BLOG
云风的 BLOG

InfoQ - 促进软件开发领域知识与创新的传播

Meta 收购 Manus 这事儿泡汤了 5.5万 Star 开源项目 Ghostty 被迫出走,GitHub 正在终结一代技术人的乌托邦 Slack 长时运行多智能体系统的上下文管理方案 从 T+1 到分钟级:金城银行基于 Apache Doris 构建高可靠、强一致的实时数据平台 谷歌云推出 Agents CLI,简化 AI 智能体开发全流程 Claude官方击穿高薪、高学历的安全防线!Anthropic点名10大高危职业,但有群人暂时稳了 亚马逊云科技终止 WorkMail 服务,并将 App Runner 转入维护模式 OPPO小布记忆:全模态碎片化内容的理解与智能整理实践|AICon上海 模力工场038周AI应用周榜:工具在消失,工作流在出现 Akamai CEO Tom Leighton:Agent 时代来临,云基础设施正从“中心化”转向“分布式边缘” 日均数百亿入库背后:从“人肉调度”到K8s弹性架构,度小满金融基于OceanBase重构入库架构实践 百度文库网盘发布GenFlow 4.0:月活用户超1亿,要把网盘变成全端AI工作台 Altman 投的 Agent 终端 Warp 开源了!斩获3.5万star 哪些客户需要拒, 敢让龙虾决定吗?_AI&大模型_InfoQ 中文站_InfoQ精选视频 从开发到生产:为什么越来越多的机器学习团队纷纷迁移到 Snowflake | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 探索多智能体工作流:LangGraph Snowflake Cortex AI | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 腾讯云分布式缓存数据库:AI Agent - 从提示词工程到 Harness 工程 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 基于 Streamlit 为 CSV 数据构建分析智能体 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 AI 智能体:告别文档缺漏 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 构建 AI 驱动的数据管道:深度探讨 Snowflake Openflow 与非结构化数据 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 云端太贵、本地不够聪明,英特尔押注“端云混合AI”:智能体PC会替人完成工作 不到10%的存储投入,可能拖垮90%的GPU投资!IBM把AI Agent塞进存储系统,算清企业最容易忽略的一笔账 Snowpark 上手实战 | BUILD 2025_大数据_王玮_InfoQ精选视频 ClickHouse + Langfuse,构建 Agent 可观测基石 腾讯云分布式缓存数据库:Cluster Proxy 共享连接架构深度解析 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 AI 写代码太烧钱了:Copilot、Claude 一起涨价,不如把程序员请回来? 英特尔发布至强600系列工作站处理器与锐炫Pro B70 GPU,全新AI工作站来了 腾讯云分布式缓存数据库:从 Redis 到 Valkey - 开源社区如何快速创新 | 腾讯云数据库 DBTalk_腾讯_凌敏_InfoQ精选视频 印奇这次要“从0重做”智驾模型!首谈阶跃和千里双公司布局:中国AI商业闭环要靠车跑出来 从Cursor返聘归来,90后华裔女高管带Claude开启日更模式:token成本比工程师工资低多了! 从 Coding 到 Agent:QCon 北京 2026 全景复盘,优秀出品人 & 明星讲师名单揭晓 全链路支撑大模型国产化“Day 0适配”,商汤大装置构建全栈能力底座 凌晨,OpenAI 与亚马逊云科技史上最大联合发布来了 HashiCorp Vault 2.0 发布:引入新身份联邦机制,迈入 IBM 生命周期体系 Yelp 实现超 1,000 个 Cassandra 节点零停机升级 写了 17 年开源代码,我为什么认为 Coding Agents 堆功能是在瞎折腾? 基于 Apache Camel 编排智能体与多模态 AI 管道 面向智能体与人类用户的AI记忆系统:架构设计与核心场景实践|AICon上海 Anthropic 推出 Managed Agents,简化 AI 代理部署流程 阿里HappyHorse开启灰测,720P视频生成低至0.44元/秒 讯飞联合清华团队押注量子AI:不看营收、不设KPI,一群“无人区”科学家,抢夺下代AI算力入口 小米万亿模型全面开源:MIT 协议、1M 上下文,但还是打不过 DeepSeek Cortex Code 入门指南:面向数据工程师的实践路径 | 技术实践 openJiuwen社区首发Team Skills,定义Coordination Engineering新范式 用 Snowflake Cortex Agents 释放结构化数据的最大价值 | 技术实践 Grafana 利用 Kafka 对 Loki 进行了架构重构,并发布了一款命令行工具,旨在将可观测性引入编码代理 ClickHouse重构全文索引:对象存储上跑出高性能 Full-Text Search 可观测性和遥测技术如何提升软件工程实践 Dropbox 与 GitHub 合作,将单体库大小从 87GB 缩减至 20GB Agent 的下一站:基于长期记忆系统 EverOS 的自我演进|AICon上海 同一赛道,四种收费:Agent 控制层(Harness)开始分裂 Cloudflare Sandboxes 正式发布,为 AI 代理提供持久化隔离环境 Agent 的“记忆断片”困局,该怎么破?_AI&大模型_AICon 全球人工智能开发与应用大会_InfoQ精选视频 数据分析师如何快速建立在 AI 时代最值钱的能力:一份可落地的行动路线图 摩尔线程最新财报:研发占比超86%,万卡级大规模智算集群落地 当云区域失效:地缘动荡环境下的高可用重构 Slack 重构通知系统,设置参与度提升 5 倍 智能体工程的隐性技术债务 “我把所有模型都换成了DeepSeek V4”:月账单将降 90%,效果还更好 阿里云智能集团高级技术专家刘少伟已确认出席AICon上海站,并分享如何构建企业 Agent 的自动化行动架构 构建生产就绪的 tRPC API:Apollo Federation 的 TypeScript 替代方案 Anthropic推出面向Claude Code的基于智能体的代码审查功能 北京车展直击:斑马智能甩出车载Agent短剧,比亚迪率先落地,AI让智能座舱又热起来了 Snowflake 作为智能体运行时:从静态管道迈向自主数据系统 | 技术实践 Snowflake 上的本体体系:基于 Cortex Code 能力实现从架构到部署 | 技术实践 Cloudflare 公布 MCP 架构方案,应对企业面临的安全与治理风险 复杂的项目管理怎么做到「AI 友好」?飞书项目用「开放」给出答案 Snowflake Cortex Code 的规范驱动开发:将 SDLC 方法论引入 AI 辅助工作流 | 技术实践 Copilot 不让注册了:从“随便用”到“全面限”,agent 把原有订价模型顶穿了 当互联网用AI卷效率时,这家公司先问了一连串“能不能” Meta 开始记录员工每一次点击:AI 要接管工作,先监控会工作的人 Meta“Token榜”逼疯打工人,一夜烧掉公司几万刀!AI时代Token焦虑越来越离谱 智源FlagOS完成DeepSeek-V4-Flash在八款芯片Day0适配,实现三重技术突破 DeepSeek V4 重磅开源!首次打通华为Ascend,也没丢掉英伟达,百万上下文夺回国产模型话语权 李志飞的“新实验”:当超级个体撞上真实组织 GPT-5.5 登顶时刻,Anthropic 亲口承认 Claude 变笨了!网友群嘲:太敷衍 那些没空写的小需求,龙虾真能做吗?_AI&大模型_InfoQ 中文站_InfoQ精选视频 从 Pandas 到生产:使用任意 IDE 进行可扩展的 ML 数据管道与分布式处理 | BUILD 2025_AI&大模型_王玮_InfoQ精选视频 pnpm 11 候选版本发布,带来 ESM 分发、供应链默认设置以及新的存储格式 银行业PDF表格提取方案重构:基于Java的分层方案 GPT-5.5 赢了 Opus 4.7 和 Mythos?奥特曼晒黄仁勋内部信:英伟达全员用上 Codex! Cloudflare 推出 Think:一款面向 AI 代理的持久化运行时 1850亿美元天价支出、75%代码由AI生成!谷歌正式宣告:全面转向智能体工作流 xAI落后太多,马斯克“开大”重金求购Cursor,100亿美金“分手费”都敢签! Pulumi 新增对 Bun 运行时的全面支持 姚顺雨腾讯模型首秀!不卷参数只做 “听话打工人”,Hy3 preview登场 | 附实测 老板让你“忽悠”投资人,你敢发给龙虾吗?_AI&大模型_InfoQ 中文站_InfoQ精选视频 Gemini CLI 引入子代理机制,实现任务委派与并行代理工作流 清华系团队星工聚将完成数千万天使轮融资,轮式机器人拿下头部制造企业亿级大单 Pretext.js 绕过 DOM 布局重排,实现 120 FPS 的高级交互体验 靠“AI 云”爆红的 Vercel,栽在一个第三方AI工具手里!IPO前夕遭黑,200万美元赎金谈崩? 高能研讨会|端侧 AI 正在重写实时感知效率上限_AI&大模型_王玮_InfoQ精选视频 2050大会看这篇就够了|报名、交通食宿指引大全 Java 近期资讯:OpenJDK JEP、Jakarta EE 12、Spring Framework、Micrometer、Camel、JBang 金融智能的架构编排:基于 Snowflake Cortex Agents 实现结构化与非结构化数据统一分析 | 技术实践 在AK大神爆火的任务里,摸清国产AI真实水平 百灵Ling-2.6-flash 正式发布:高 Token 效率,以 1/10 消耗实现 SOTA 级 Agent 能力 当 PM 懂AI,当技术懂产品:AI 时代产品力的双向进化|PM x AI产品力领航者大会即将开幕 为 AI 智能体设计记忆机制:揭秘 LinkedIn 的认知记忆智能体 获奖名单公布|2026主题征文第一期|分享你最有价值的龙虾场景与核心 Skill_热门活动_InfoQ写作社区官方_InfoQ写作社区
打破向量检索的局限:RAG 混合检索实践
作者:Aaditya Chauhan明知山 · 2026-06-12 · via InfoQ - 促进软件开发领域知识与创新的传播

你的公司最近上线了一个内部全能搜索系统,这是一个单体系统,采用检索增强生成(RAG)技术构建,可检索公司的待办事项、设计文档、发布文档、运维手册和纠错文档(COE)。工程师、产品经理和经理通过基于大语言模型的聊天界面进行查询,各团队还将其封装为 MCP 工具,让他们的 AI 编程助手可以直接获取上下文。

然后,生产支持组的一名值班人员输入:”在生产环境中启用 payment_v2_enforce 功能标志的运维手册“,聊天助手却提示应禁用该功能。在系统内部,文档根据嵌入相似度进行排名。

对于嵌入模型来说,这两份运维手册看起来几乎完全相同。它们有相同的功能标志名称、相同的服务、相同的词汇和相似的上下文。但值班工程师看不到这个排名,他们看到的是聊天助手根据检索器返回的前 K 条内容生成的回答(有时正确的运维手册甚至不在前 K 个结果里)。这类回答轻则信息失真,重则看似笃定却完全错误。

如果你构建过基于嵌入的搜索系统,对这类情况想必并不陌生。系统能把握整体方向,却忽略了关键的细节信息。

上述查询需要两样东西:对”功能标志运维手册“的语义理解,以及对操作(启用与禁用)的精确匹配。向量搜索只处理了前者。

这并非嵌入模型的缺陷,而是向量相似度的固有特性。嵌入机制会检索出和查询内容相似的结果,而非完全匹配的内容。由于检索将前 K 个结果作为上下文输入大语言模型,排名与召回同样重要。

即便正确答案在前 K 条结果里,若错误答案排序更靠前,依然无法解决问题。修复方案并不是要替换嵌入技术,而是将其与传统文本关键词匹配相结合,让概念相关性和精准术语匹配共同作用于最终的排序。

纯向量检索 RAG 流程的短板

想要理解为什么会出现这个问题,不妨放眼审视一下完整的流程。如图 1 所示,RAG 流程共分为三个阶段。

图 1. 典型的 RAG 管道有三个阶段:分块、检索和生成。(来源:作者创建)

图 1 中的元素定义如下:

  • 分块:将原始语料库拆分为可用于索引的单元。

  • 检索:接收用户查询,在分块内容中检索并返回相关性最高的前 K 个块。

  • 生成:将这些分块内容作为上下文输入大语言模型,由模型生成答案。

假设第一、第三阶段均正常运行:文档按合理边界完成拆分,大语言模型根据提供的上下文生成答案,且不会产生幻觉。问题出在前文提及的检索阶段。检索器先对查询做嵌入处理,再将其与已建立索引的文档向量比对,返回嵌入空间距离最近的文档。嵌入空间距离相近,表示语义相似,而非内容完全一致。针对同一功能标志的两份运维手册,一份说明启用操作、一份说明禁用操作,二者在嵌入空间中距离极近。两份文本仅个别词汇存在差异,嵌入模型会为这类高度相似的文本生成近乎一致的向量,导致检索器难以精准区分。因此,当用户查询启用功能标志的运维手册时,禁用相关的手册有时反而距离更近,检索器会以同等置信度推送这份错误文档。这便是问题所在:依靠同一向量空间与评分机制,最终排在前面的却是错误的文档。

问题在于嵌入的本质是近似计算

BERT 这样的嵌入模型将文本转换为固定维度的数值向量,并捕捉文本的语义信息。语义相似的文本生成相似的向量。”功能标志“、”终止开关“、”发布门“和”配置切换“在向量空间中紧密聚集。这种聚类在用户检索相关概念时能发挥很大作用,但当用户需要查找精确实体、特定功能标志名称、特定错误代码或特定部署版本时,问题就转到了检索精度层面。

相似的表现同样存在于各类不同失效模式中。当某人搜索 ERR_PAYMENT_GATEWAY_TIMEOUT 时,相关代码如 ERR_PAYMENT_GATEWAY_REJECTEDERR_PAYMENT_GATEWAY_UNAUTHORIZED 等相关代码最终都会与查询向量趋近,因为它们有相同的 ERR_PAYMENT_GATEWAY 前缀并出现在同类故障排查文档中。区分它们尾部词汇的权重占比很低。嵌入模型的行为完全符合设计初衷,它的作用是检索相似内容,而非精准匹配完全一致的内容。当区分特征在文本中占比过低时,嵌入会抹平这种区别。

图 2 展示了嵌入空间的特征:语义相近的内容会聚集在一起。在同一个聚类内部,想要区分不同具体实体(比如介绍功能标志启用、禁用操作的运维手册)就会变得困难。而混合搜索,正是为了解决这类精度不足的问题。

图 2. 语义相似的项目聚集在一起。并非每个查询都有相同的问题。(来源:作者创建)

根据检索方法的适用程度,搜索查询可以被分为三种类型。

语义查询

用户的提问“当一个区域离线时,我们的协议是什么?”是概念类查询。标题为“灾难恢复架构”、“主主复制策略”、“故障转移运维手册”的文档,即便和查询没有共用词汇,也理应获得较高排名。嵌入模型能很好地应对这类场景,因为它捕捉的是语义,而非单纯匹配字面词汇。

精确匹配查询

这类查询在信息检索文献中也称为词汇查询。用户将堆栈跟踪或日志中的错误代码粘贴到搜索栏中,如 ERR_PAYMENT_GATEWAY_TIMEOUT,此时他们明确知晓自己要查找的标识。对于这些查询,语义相似性反而不是用户想要的。向量嵌入可能会推送语义相近但标识不同的文档(如包含 ERR_PAYMENT_GATEWAY_REJECTED 而非 TIMEOUT 的运维手册),影响了检索效果。关键词搜索则能高效、准确地处理这类查询。

混合查询

用户搜索 “v3.2 部署的回滚运维手册”时,既需要语义理解(即部署回滚相关的运维手册),也需要对区分标识做精确匹配:根据 “v3.2” 筛选对应版本,根据 “rollback” 区分 “rollout”。用户搜索 “Outlook 2019 同步错误 0x80004005 故障排除”,则需要对问题症状做语义匹配,同时精确匹配版本号和错误代码。这类查询同时依赖两种能力。结合我在生产级 RAG 系统的实践经验,这类查询占绝大多数。本文后续内容将围绕这类查询的处理方案展开。

BM25 为嵌入近似语义提供精度

向量搜索需要一个搭档,这个搭档就是 BM25 —— 经典信息检索领域核心的概率排名函数。它是 Elasticsearch、OpenSearch 和大多数词汇搜索引擎的默认评分器,也是三十多年来占据主导地位的关键词搜索算法。在向量搜索效果不佳的场景中,它总能精准发挥作用。它基于概率信息检索理论,提供了三个直接解决精确匹配问题的内置机制。

逆文档频率(IDF)用于衡量一个词在整个语料库中的稀有程度。常见词如 “service” 或 “deployment” 权重较低,而稀有的区分性标记如 “v3.2”、“ERR_PAYMENT_GATEWAY_TIMEOUT” 或 “payment_v2_enforce” 权重较高。这也是 BM25 在精确匹配查询中优于嵌入技术的原因。能够区分不同文档的稀有标识在 BM25 中会被赋予最高权重。

词频(TF)饱和用于控制重复术语带来的影响。术语的首次出现会显著影响得分,后续重复出现带来的增益则逐步递减。得分会趋近于一个上限,而非线性增长。这一特性能够避免文档依靠关键词堆砌来刻意操纵排名。

长度归一化用于解决文本检索中的另一种偏差。较长的文档仅仅因为包含更多词汇而倾向于获得更高分数,匹配查询术语的概率也更高。长度归一化通过在计算相关性得分时综合考虑文档长度来纠正这个问题,不仅会统计术语出现的次数,还会考虑相对于文档长度的频率。这一点在具有可变长度分块的 RAG 系统中尤为重要,如果没有这种调整,较大的分块始终会胜过较小的分块。

基于倒数排名融合的混合搜索

如图 3 所示,混合检索会并行执行 BM25 检索与向量检索,通过 RRF 融合两者的排序列表;在将前 K 个文本块输入大语言模型前,还可选用交叉编码器做二次重排序。

图 3. 混合检索(来源:作者创建)

现在我们有两个具有互补优势的检索器:向量搜索和 BM25。向量搜索捕捉语义信息,而 BM25 进行精准的词项匹配。每个产生自己的排名列表,要进行混合查询,这两个列表需要合并为一个。

合并列表是一个难点。向量余弦相似度介于 -1 和 1 之间,而 BM25 得分没有上下限,很难将它们归一化到同一量纲。权重适配会随查询内容变化:对于某一个查询,BM25 的合适权重可能是 0.7,但对于另一个可能是 0.3。在生产环境中为每个查询校准权重是不切实际的,而这正是倒数排名融合(RRF)发挥作用的地方。

深入解析 RRF 如何实现分数融合

RRF 直接舍弃两个检索器的原始分数,绕过了归一化难题。它仅基于排名位置完成运算:

RRF_Score(d) = Σ 1 / (k + rank_r(d))

常数 k 通常为 60(Cormack、Clarke 和 Buettcher 2009),用于平滑不同排名位置的权重贡献。排名第 1 的文档贡献 1/61 ≈ 0.0164。排名第 10 的文档贡献 1/70 ≈ 0.0143。在检索器的前 K 个中缺失的文档贡献为 0。

该机制原理十分简单:同时在两个检索结果中排名靠前的文档,会因叠加得到非零分值,最终获得更高融合得分。即便某个文档在单个检索器中排名第一,若仅被一个检索器命中,综合得分也会被压低。RRF 本质是对检索结果一致性进行加权。

下方三张表格针对语义查询、精确匹配查询、混合查询三类查询场景,逐步演示上述情况。综合来看,表格分别展示了 RRF 表现明显占优、以微弱优势保留正确结果,以及本文核心论点所聚焦的场景。

解读排名列时需注意:两个检索器均在包含数千份文档的完整语料库中检索。表格内展示的 BM25 与向量检索排名是文档在全量检索结果中的位次,而非仅针对表格里的四份文档。因此,BM25 排名 12,表示该文档在整个语料库的检索结果中位列第 12。

下文演示的三类查询均可在本地 Elasticsearch 实例中端到端完整运行。示例应用代码与数据集可在该 GitHub 示例项目中获取。

查询:“我们的认证系统如何处理过期令牌(How Does Our Auth System Handle Expired Tokens)?”

这是一个概念性问题。对应的正确文档是名为《认证服务中的令牌刷新和过期处理》的运维手册。该文档与检索内容存在多处共用术语,包括 “token”、“expiration”/“expired”、“handling”/“handle”、“auth”,因此被 BM25 检索命中。但另一篇关联性较低的文档,因 “system” 和 “token” 两个词汇出现频次更高,最终在 BM25 排序中排在了前面。

BM25 检索到了目标文档,但置信度低于《系统令牌轮换运维手册》。后者虽然在通用术语上匹配度更高,但对应的业务操作并不相关。向量检索凭借语义层面的匹配将正确文档排在首位。RRF 算法会优先加权两个检索结果中排名均靠前的内容,因此该文档最终位列融合结果顶部。而紧随其后的两个 RRF 结果(《OAuth 流程设计文档》与《系统令牌轮换运维手册》)也都能为读取候选结果的大模型提供有效上下文信息。

精确匹配查询

查询:“ERR_PAYMENT_GATEWAY_TIMEOUT”

用户粘贴了堆栈跟踪里的错误代码。由于标识符字符串唯一且完全逐字匹配,BM25 成功检索到对应的运维手册。但向量检索效果不佳,因为查询内容除了“支付服务的错误”外几乎没有有效语义,嵌入模型难以精准区分 ERR_PAYMENT_GATEWAY_TIMEOUT 和该服务下其他同类错误码。

从逻辑合理性来看,邻近错误码对应的运维手册会出现在 BM25 检索结果中,这是因为相关手册的故障排查步骤通常会有交叉引用(例如“若出现 ERR_PAYMENT_GATEWAY_REJECTED,请参考本手册”),查询关键词恰好匹配了这类引用内容。如果没有这些交叉引用,BM25 就只会返回 TIMEOUT 对应的运维手册,邻近手册也不会出现在检索结果里。

RRF 将目标运维手册排在首位,但它与另一篇对应拒绝类错误码的手册得分差距很小,第二、第三名结果均为其他错误码对应的手册。针对这类纯标识符类查询,仅使用 BM25 检索得到的候选结果集质量反而优于混合检索。BM25 结果里的第二、第三位是明显无关的文档,大模型可直接过滤;但 RRF 排在第二、第三位的是内容相近的运维手册,容易让大模型误判用户实际提供的错误码。这也客观说明,混合检索的优势体现在整体数据分布层面,并不能对每一条查询都实现优化。

混合查询

查询:“v3.2 部署的回滚运维手册(Rollback Runbook for v3.2 Deployment)”

BM25 将目标文档排在首位,原因是文本中的 “rollback”、“v3.2”、“deployment”、“runbook” 全部精准匹配。向量检索则把 v3.2 版本的发布运维手册放在第一位,这并非因为嵌入模型判定发布内容比回滚内容与查询更相关,而是该查询与两份运维手册的余弦相似度差值仅在 0.01 至 0.02 之间。向量检索的这一排序结果更偏向随机噪声,不具备实际参考价值。再次运行查询或更换嵌入模型,二者的排名都可能发生颠倒。

这类因噪声导致核心操作意图无法区分的问题,正是混合检索所要解决的检索失效场景。BM25 倾向于匹配回滚相关的运维手册,打破了两项操作的排名胶着状态。RRF 会对两个检索器均位列前三的文档加权提权,最终将目标的 v3.2 版本回滚运维手册推至靠前位置。

三种查询综合分析

三种查询的整体运行逻辑是一致的。对于语义查询,向量搜索能够定位到目标文档,RRF 会将这类结果置顶,同时添加 BM25 提供的匹配特征。对于精确匹配查询,BM25 可精准召回目标文档,RRF 同样将其保留在首位,只是第二名结果相比单独使用 BM25 时干扰信息会更多。对于混合查询,两类检索器各自存在不同的检索缺陷:BM25 的首位结果正确,但第二名返回了错误版本;向量搜索的首位结果则完全匹配错误。经过 RRF 融合后,最终首位结果准确,第二名虽存在偏差但具备相关性,也是三组结果中质量最优的一组。

根据我的经验,生产环境中的查询以第三种类型为主。大多数真实世界的查询将语义意图与特定标识符、版本号、错误代码或其他需要精确匹配的标记相结合,混合检索正是针对这类查询分布设计的工程解决方案。

生产环境中的混合检索

目前业内主流的生产级 RAG 系统均普遍采用混合检索方案。Perplexity 在 Vespa 上结合了百亿级的 URL 词法检索与向量打分,并通过交叉编码器完成多阶段重排。Glean 则在企业搜索专属知识图谱之上叠加词法检索与稠密向量检索。二者应用场景不同,却采用了相同的架构思路。

Elasticsearch 的生产实现

Elasticsearch 和 OpenSearch 都通过检索器 API 原生支持混合检索(Elasticsearch 8.13 及以上版本率先实现,OpenSearch 紧随其后)。原生支持意味着检索融合已在搜索引擎内部单次查询中完成,无需在应用层额外做结果合并。下面的示例使用了 Elasticsearch 语法,OpenSearch 语法与之基本一致。

索引映射

你的索引需同时配置用于 BM25 检索的标准文本字段和用于向量检索的稠密向量字段:

PUT /rag_knowledge_base{  "mappings": {    "properties": {      "title":   { "type": "text" },      "content": { "type": "text", "analyzer": "standard" },      "content_vector": {        "type": "dense_vector",        "dims": 768,        "index": true,        "similarity": "cosine"      }    }  }}

复制代码

图 4. Elasticsearch 索引映射,同时定义了用于 BM25 的文本字段以及用于语义检索的 768 维密集向量字段。

带 RRF 的混合查询

在单次请求中同时调用两类检索器,并完成结果融合:

POST /rag_knowledge_base/_search{  "retriever": {    "rrf": {      "retrievers": [        {          "standard": {            "query": { "match": { "content": "rollback runbook for v3.2 deployment" } }          }        },        {          "knn": {            "field": "content_vector",            "query_vector": [0.12, -0.45, ...],            "k": 50,            "num_candidates": 100          }        }      ],      "rank_constant": 60    }  }}

复制代码

图 5. 使用 Elasticsearch 的 RRF 检索器进行混合检索查询,并行运行 BM25 和 kNN 搜索,并在单个请求中融合排名。

生产调优

上述的默认配置可以作为合理的参考,但生产系统几乎总是需要进一步调优。其中的三个核心参数基本决定了检索相关性与查询延迟之间的取舍关系。

排名常数(k)

排名常数是 RRF 公式中的平滑参数,用于控制排名权重的衰减速率。排名为 r 的文档,其权重按 1/(k + r) 计入融合得分。该参数默认值为 60,适用于通用检索场景。若将数值调至 2030,会强化高排名结果的权重,当 BM25 对错误码、版本号、功能标识等内容实现精准匹配时,该设置效果更佳。若调高至 80100,排名权重曲线会趋于平缓,更倾向于选取在两类检索结果中同时出现的文档,而非仅在单一列表里排名靠前的内容。参数取值需根据业务需求选择:追求高精度则选用较小的 k 值,侧重召回率则选用较大的 k 值。

kNN 候选

num_candidates 参数用于设定 HNSW 图遍历过程中获取前 K 个结果前需要检索的向量数量,控制近似最近邻搜索在召回率与查询延迟之间的权衡。将 k 设为 50、num_candidates 设为 100 效果较好。若发现向量搜索召回率偏低,即相关文档频繁排在前 50 名之外,可将 num_candidates 调至 200~300。该操作通常能在延迟小幅增加的前提下提升召回率,因为额外计算仅在向量索引内部完成,不会产生额外网络请求。

使用交叉编码器重新排序

基于 RRF 的混合检索能获得优质的候选结果,而交叉编码器重排可进一步显著提升最终检索相关性。双编码器会分别为查询和文档生成嵌入向量,交叉编码器则将完整的查询-文档对输入 Transformer 进行联合处理,实现查询词与文档内容的细粒度标记交互。正是这一架构差异让交叉编码器的检索效果始终优于双编码器——它能够捕捉到独立嵌入无法识别的语义细节和关联关系。

在实践中,常规方案是先通过 RRF 筛选出 20 至 50 条候选结果,再使用 ms-marco-MiniLM-L-6-v2 这类交叉编码器完成最终重排。交叉编码器并不适合用于首轮检索,因为它需要对每一组查询-文档对执行前向计算,耗时较长;但对小规模候选集做重排时延迟完全可控,在 GPU 环境下处理 50 条候选结果通常耗时不足 100 毫秒。在 BEIR 等主流检索基准测试中,交叉编码器的表现始终优于双编码器:大模型在跨领域查询场景下提升尤为明显,轻量模型则能在同领域场景下带来可观效果增益。对于每一点检索相关性都至关重要的生产系统而言,这一重排环节很有价值。

结论

稠密向量嵌入可解决检索的泛化问题,即便查询词与文档用词不一致,也能匹配到概念相关的内容。BM25 则解决了基于稀有、区分性标记找到精确匹配的精度问题。但二者单独使用都无法满足生产环境下 RAG 系统的需求。

向量嵌入属于近似检索,这既是它的优势,也带来了固有局限。基于 RRF 的混合搜索并非弥补模型性能短板的临时方案,而是面向同时兼容语义查询与精确匹配查询的系统,在架构层面的最优选择。

若 RAG 流程仅依靠向量嵌入完成检索,会损失检索效果。建议加入 BM25 检索,通过 RRF 融合结果,并使用交叉编码器实现重排。

查看英文原文:https://www.infoq.com/articles/vector-search-hybrid-retrieval-rag/