30秒快速回答: 混合检索 = 稀疏检索(BM25 关键词匹配)+ 稠密检索(向量语义匹配)同时查询、结果合并;重排序 = 用 Cross-encoder 对候选结果逐条精排,把最相关的排到最前。两者叠加,是 2026 年 RAG 检索质量优化的核心组合拳,能显著减少”答非所问”。
核心价值一句话: 只用向量检索的 RAG 会漏掉精确关键词,只用 BM25 的 RAG 不懂语义——混合检索 + 重排序让两者互补,检索准确率可提升 20%-40%。
一、为什么单独一种检索不够?
稀疏检索(BM25)与稠密检索(向量)的对比
| 维度 | BM25 稀疏检索 | 向量稠密检索 |
|---|---|---|
| 匹配原理 | 关键词词频/逆文档频率 | 语义向量余弦相似度 |
| 擅长场景 | 精确术语、代码、ID、人名 | 同义改写、口语化表达 |
| 弱点 | 同义词”汽车/轿车”匹配不上 | 精确数字、专有名词易漂移 |
| 典型代表 | Elasticsearch、Whoosh | FAISS、Milvus、pgvector |
典型失败案例: 用户问”苹果公司 2025 年营收”,向量检索可能把”苹果”匹配到水果种植文档;而 BM25 能精确命中”苹果公司”这个专有名词。反过来,用户问”怎么给车加油”,BM25 匹配不到”汽车 补能”,向量检索却能理解语义。
二、混合检索:两种检索并行,结果合并
核心思路
同时跑 BM25 和向量检索,把两路结果合并去重,再按分数融合排序。最常用的是 RRF(Reciprocal Rank Fusion,倒数排名融合):不看原始分数,只看排名位置,天然规避两种检索分数量纲不一致的问题。
可运行示例(Python + RRF)
def rrf_fuse(ranked_lists, k=60):
"""ranked_lists: 多路检索结果的文档ID排名列表"""
scores = {}
for ranked in ranked_lists:
for rank, doc_id in enumerate(ranked):
scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank + 1)
return sorted(scores.items(), key=lambda x: x[1], reverse=True)
bm25_top = ["doc3", "doc1", "doc7"] # BM25 检索结果
vector_top = ["doc1", "doc5", "doc3"] # 向量检索结果
print(rrf_fuse([bm25_top, vector_top]))
# 输出: [('doc1', 0.0328), ('doc3', 0.0328), ('doc5', 0.0164), ('doc7', 0.0164)]
RRF 的优势: 两路都排前面的文档分数叠加,天然靠前;单路命中的文档也不会被丢弃,召回更全。
三、重排序:用 Cross-encoder 精排候选
为什么需要重排序?
混合检索后可能还有几十上百条候选,但真正相关的只有几条。Bi-encoder(向量检索用的模型) 把问题和文档分别编码,速度快但精度有限;Cross-encoder 把问题和文档拼在一起输入模型,逐条打分,精度高但慢。所以标准做法是:先粗排(快)→ 再精排(准)。
可运行示例(sentence-transformers)
from sentence_transformers import CrossEncoder
model = CrossEncoder("BAAI/bge-reranker-base") # 中文重排序模型
query = "苹果公司2025年营收"
candidates = [
"苹果是一种常见水果,富含维生素C。",
"苹果公司2025财年营收达3910亿美元,创历史新高。",
"如何种植苹果树?春季修剪是关键。",
]
pairs = [(query, doc) for doc in candidates]
scores = model.predict(pairs)
print(scores) # 输出: [0.02, 0.95, 0.01] —— 正确把最相关的排到最前
粗排 vs 精排对比
| 阶段 | 模型 | 速度 | 精度 | 用途 |
|---|---|---|---|---|
| 粗排 | Bi-encoder / BM25 | 毫秒级 | 中 | 从百万级召回 Top 50 |
| 精排 | Cross-encoder | 秒级 | 高 | 从 Top 50 精排到 Top 5 |
四、完整落地流程与工程建议
标准流水线
用户问题 → 混合检索(BM25 + 向量) → RRF 融合 → 粗排 Top 50
→ Cross-encoder 重排序 → 精排 Top 5 → 送入 LLM 生成答案
工程实践要点
- 重排序只对 Top 50 做:Cross-encoder 逐条推理成本高,先粗排缩小范围再精排,兼顾速度与精度。
- 中文场景选对模型:重排序用
bge-reranker-base,向量用bge-m3等中文友好模型,效果远好于通用英文模型。 - 保留元数据过滤:混合检索前先用时间、来源、权限等元数据过滤,减少无效候选。
- 评估先行:用
RAGAS等工具量化检索命中率(Recall)与答案准确率(Faithfulness),用数据验证优化效果。
五、总结与延伸阅读
要点回顾
- 混合检索:BM25 管精确关键词,向量管语义理解,RRF 融合两路结果,召回更全。
- 重排序:Cross-encoder 对候选逐条精排,把最相关的文档送到 LLM 面前,答案更准。
- 组合拳:粗排 + 精排是 2026 年 RAG 检索质量优化的标准范式,工程上先粗后精、控制成本。
延伸阅读建议
- 本站《什么是 RAG?一文搞懂检索增强生成》——打好基础
- 本站《什么是 Embedding?AI 理解语义的数学基础全解析》——理解向量检索原理
- 本站《什么是 Agentic RAG?AI 自主检索增强生成技术全解析》——进阶:让检索更智能
- 论文推荐:“Is ChatGPT a Good Recommender?” 与 “RAGAS: Automated Evaluation of Retrieval Augmented Generation”