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 生成答案

工程实践要点

  1. 重排序只对 Top 50 做:Cross-encoder 逐条推理成本高,先粗排缩小范围再精排,兼顾速度与精度。
  2. 中文场景选对模型:重排序用 bge-reranker-base,向量用 bge-m3 等中文友好模型,效果远好于通用英文模型。
  3. 保留元数据过滤:混合检索前先用时间、来源、权限等元数据过滤,减少无效候选。
  4. 评估先行:用 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”