吃透 RAG 检索:纯向量短板、BM25 混合检索、RRF 融合与重排序

目录

纯向量检索的短板:语义很强,但关键词很弱

场景一:精确关键词丢失

场景二:专有名词和缩写

场景三:数字和编号

向量检索和关键词检索的互补关系

[关键词检索:BM25 算法](#关键词检索:BM25 算法)

[BM25 是什么------一句话概括](#BM25 是什么——一句话概括)

[BM25 的核心思想](#BM25 的核心思想)

[2.1 词频(TF):出现越多越相关,但有上限](#2.1 词频(TF):出现越多越相关,但有上限)

[2.2 逆文档频率(IDF):越稀有的词越有区分度](#2.2 逆文档频率(IDF):越稀有的词越有区分度)

[2.3 文档长度归一化:长文档不能占便宜](#2.3 文档长度归一化:长文档不能占便宜)

[BM25 vs 向量检索:不是谁替代谁](#BM25 vs 向量检索:不是谁替代谁)

[Milvus 中的 BM25 支持](#Milvus 中的 BM25 支持)

[混合检索:向量 + 关键词,取长补短](#混合检索:向量 + 关键词,取长补短)

混合检索的基本思路

[两种架构方案:Milvus 原生 vs ES + Milvus](#两种架构方案:Milvus 原生 vs ES + Milvus)

[.1 方案一:Milvus 原生混合检索(推荐)](#.1 方案一:Milvus 原生混合检索(推荐))

[2.2 方案二:Elasticsearch + Milvus 双系统](#2.2 方案二:Elasticsearch + Milvus 双系统)

RRF(倒数排名融合):最简单有效的融合策略

[4.1 RRF 的计算方式](#4.1 RRF 的计算方式)

重排序(Reranking):对候选结果做精细化排序

为什么需要重排序

重排序的工作原理

[2.1 Bi-Encoder vs Cross-Encoder](#2.1 Bi-Encoder vs Cross-Encoder)

[2.2 为什么不直接用 Cross-Encoder 做检索](#2.2 为什么不直接用 Cross-Encoder 做检索)

常用的重排序模型

完整检索流程:从用户提问到最终结果

四种检索策略的完整对比

检索策略的选型建议

检索参数调优

[3.1 一个容易忽略的调优顺序](#3.1 一个容易忽略的调优顺序)

[3.2 线上观测指标建议](#3.2 线上观测指标建议)

一张图看完整链路

小结与下一篇预告


纯向量检索的短板:语义很强,但关键词很弱

场景一:精确关键词丢失

场景二:专有名词和缩写

场景三:数字和编号

向量检索和关键词检索的互补关系

关键词检索:BM25 算法

BM25 是什么------一句话概括

BM25(Best Matching 25)是一个经典的关键词检索算法,用来衡量一个查询词在某个文档中有多重要。它是搜索引擎(如 Elasticsearch)的默认排序算法,也是混合检索中关键词检索部分的核心。

BM25 的核心思想

BM25 不需要理解语义,它只看三个核心因素:

2.1 词频(TF):出现越多越相关,但有上限

用一句话概括:出现越多越相关,但有上限,避免长文档刷词占便宜。

2.2 逆文档频率(IDF):越稀有的词越有区分度

用一句话概括:越稀有的词越有区分度,越能帮你找到目标文档。

2.3 文档长度归一化:长文档不能占便宜

用一句话概括:长文档不能因为块头大就占便宜,要按长度归一化。

BM25 vs 向量检索:不是谁替代谁

Milvus 中的 BM25 支持

Milvus 从 2.5 版本开始内置了全文检索能力,支持 BM25 算法。你可以在创建 Collection 时指定一个 VarChar 字段用于全文检索,Milvus 会自动对这个字段做分词和倒排索引,支持 BM25 检索。

如果你用的 Milvus 版本低于 2.5,或者对中文分词有更高要求,也可以用外部方案------比如用 Elasticsearch 做关键词检索,Milvus 做向量检索,应用层把两路结果融合起来。这种方案架构复杂一些,但全文检索能力更强。

这一篇咱们用 Milvus 2.5+ 的原生方案,降低环境搭建成本。

混合检索:向量 + 关键词,取长补短

混合检索的基本思路

混合检索(Hybrid Search)的核心思路很简单:同时执行向量检索和关键词检索,把两路结果融合成一个最终排序。

用一张图来表示:

这张图展示了混合检索的基本流程:用户提问后,同时走向量检索和关键词检索两条路,最后把两路结果融合起来。

两种架构方案:Milvus 原生 vs ES + Milvus

.1 方案一:Milvus 原生混合检索(推荐)

Milvus 2.5+ 内置 BM25 全文检索能力,一个系统同时搞定向量检索和关键词检索。

优点:

  • 架构简单,不需要维护多套系统
  • 数据不用双写,避免一致性问题
  • Hybrid Search API 原生支持 RRF 融合
  • 运维成本低,只需要管理一个 Milvus 集群

缺点:

  • 全文检索能力相比 ES 偏基础
  • 中文分词能力有限,不如 ES 的 IK 分词器等插件丰富
  • 查询语法不如 ES 丰富(布尔查询、短语查询、聚合等)
2.2 方案二:Elasticsearch + Milvus 双系统

ES 负责关键词检索,Milvus 负责向量检索,应用层做结果融合。

优点:

  • ES 的全文检索能力成熟强大
  • 中文分词生态好(IK 分词器、HanLP 等)
  • 查询语法丰富,支持复杂的布尔查询、短语查询、同义词扩展等
  • 适合已有 ES 基础设施的团队

缺点:

  • 需要维护两套系统,运维复杂度高
  • 数据双写带来一致性问题(写入 Milvus 成功但写入 ES 失败怎么办?)
  • 融合逻辑需要自己实现,增加开发成本
  • 故障面扩大(任何一个系统挂了都会影响检索质量)

RRF(倒数排名融合):最简单有效的融合策略

RRF 不依赖分数本身,只看排名。核心思想:一个结果在两路检索中排名都靠前,那它大概率是最相关的。

4.1 RRF 的计算方式

对于某个 chunk d,它的 RRF 分数计算公式是:

复制代码
RRF(d) = Σ 1 / (k + rank_i(d))

这里:

  • rank_i(d) 是 chunk d 在第 i 路检索中的排名(从 1 开始)
  • k 是一个平滑常数,通常取 60
  • Σ 表示对所有检索路求和

重排序(Reranking):对候选结果做精细化排序

为什么需要重排序

混合检索已经能把相关的 chunk 召回来了,为什么还需要重排序?

因为召回阶段(向量检索 / BM25 / 混合检索)追求的是快速召回尽可能多的相关结果 ,但排序不一定精准。打个比方,你在图书馆找书,召回阶段是把可能相关的书都搬到桌子上 ,重排序是仔细翻看每本书,把最相关的几本排到最前面 。

最终给 LLM 的上下文窗口很小,真正关键的是 Top-3 或 Top-5 的排序是否正确。如果 Top-1 是不相关的 chunk,LLM 很可能被误导,生成错误的答案。重排序就是解决这一步------用更强的模型对候选集重新打分,把最相关的结果排到最前面。

重排序的工作原理

重排序的基本流程是:

  1. 初检阶段(向量检索 / 混合检索)快速召回候选集,比如 Top-20 或 Top-50
  2. 重排序模型逐个评估这个 chunk 和用户问题到底有多相关,给每个候选打分
  3. 按重排序分数重新排序,取 Top-K(比如 Top-5)作为最终结果

用一张图来表示:

2.1 Bi-Encoder vs Cross-Encoder

这里需要理解两种编码器的区别:

  • Bi-Encoder(双编码器):query 和 chunk 分别编码成向量,然后计算向量相似度。这就是 Embedding 模型的工作方式。优点是速度快,可以提前把所有 chunk 编码好存起来,查询时只需要编码 query;缺点是精度有限,因为 query 和 chunk 是独立编码的,无法捕捉它们之间的细粒度交互关系。
  • Cross-Encoder(交叉编码器):把 query 和 chunk 拼接在一起(比如 [CLS] query [SEP] chunk [SEP]),一起输入模型,模型能看到 query 和 chunk 的完整交互,输出一个相关性分数。优点是精度更高,能捕捉更细粒度的语义关系;缺点是速度慢,每个 (query, chunk) 对都要过一遍模型。

重排序通常用 Cross-Encoder,因为候选集已经很小了(比如 20~50 个),可以接受慢一点的速度,换取更高的精度。

2.2 为什么不直接用 Cross-Encoder 做检索

你可能会问:既然 Cross-Encoder 精度更高,为什么不直接用它做检索,还要搞两阶段?

因为太慢了。假设你的知识库有 100 万个 chunk,用户提问时,你需要把这 100 万个 chunk 逐个和 query 拼接起来过 Cross-Encoder,这需要 100 万次模型推理,延迟和成本都不可接受。

所以工程上一定是两阶段策略:

  1. 粗检索(Bi-Encoder):快速从 100 万个 chunk 中召回 Top-20 或 Top-50,延迟低,覆盖面广
  2. 精排序(Cross-Encoder):对这 20~50 个候选逐个打分,延迟可接受,精度高

这就是快召回 + 慢精排的核心思想。

常用的重排序模型

对比几个主流的 Reranker 模型(截至 2026 年 2 月):

完整检索流程:从用户提问到最终结果

四种检索策略的完整对比

用同一条 query:iPhone 16 Pro Max 拆封后还能退吗,分别跑四种检索策略,对比效果。

检索策略的选型建议

给出一个简单的决策表:

检索参数调优

先给一组可直接上线试跑的经验值:

3.1 一个容易忽略的调优顺序

先调召回覆盖,再调排序精度。

很多团队一上来就调 Reranker,结果其实是召回阶段已经漏掉了关键 chunk,后面怎么重排都救不回来。正确的调优顺序是:

  1. 先看召回覆盖率(Recall@20 或 Recall@50),确保相关的 chunk 都被召回了
  2. 再看排序精度(MRR、nDCG@10),优化 Top-K 的排序质量
  3. 最后看业务指标(人工标注准确率、用户追问率、答非所问率)
3.2 线上观测指标建议

至少盯这三类指标:

  • 召回指标:Recall@20(Top-20 候选集中包含相关 chunk 的比例)
  • 排序指标:MRR(Mean Reciprocal Rank,第一个相关结果的平均排名倒数)、nDCG@10(归一化折损累积增益)
  • 业务指标:人工标注准确率、用户追问率、答非所问率

一张图看完整链路

把整个检索流程串起来,从用户提问到最终答案:

小结与下一篇预告

到这里,检索策略这块可以用一句话记住:

  • 纯向量检索是基础能力,适合大多数自然语言 query
  • 混合检索解决"语义强、关键词弱"的结构性短板,是生产环境的推荐方案
  • 重排序决定最终给大模型的上下文质量上限,对答案准确率要求高的场景必备

如果你已经完成了分块、元数据、向量化、向量库、检索策略,下一步最值得讲的是生成阶段怎么控答案质量:

  • 如何设计 Prompt 模板让模型少幻觉
  • 如何做引用对齐与答案约束
  • 如何把检索链路和生成链路连成完整可观测系统
相关推荐
qq1180096171 小时前
电力预测大赛经验教训与心得总结
人工智能·深度学习·机器学习
qinyia1 小时前
AI助手基于应用集成平台9台服务器CPU与内存资源分析及重启方案制定
运维·服务器·人工智能
TENSORTEC腾视科技1 小时前
腾视科技重磅发布AD03行车记录仪DashCam!全维守护,智驭出行新生态
大数据·网络·人工智能·科技·ai·无人叉车解决方案·无人叉车及智能调度系统解决方案
孙高飞1 小时前
万字长文:如何用 harness 的理念设计一个 AI 驱动的 UI 自动化工程
人工智能·ui·自动化
容智信息1 小时前
不写SQL,不拉Excel:数据分析用“问”的
数据库·人工智能·笔记·数据分析·excel·知识图谱·知识库
XMAIPC_Robot1 小时前
180FPS AI相机模组,轻巧大算力, 高性能双目同步摄像模组+搭配RK3588
人工智能·嵌入式硬件·深度学习·数码相机·fpga开发
qq_296553271 小时前
【LeetCode】最大子数组乘积:三种解法从暴力到最优
数据结构·算法·leetcode·职场和发展·动态规划·柔性数组
海盗12341 小时前
AI新闻完整摘要与链接汇总-2026年5月8日
人工智能
程序员小白条1 小时前
AI 编程辅助,从入门到真香
java·开发语言·数据库·人工智能·面试·职场和发展