RAG 召回率优化的主路线:Hybrid + Rerank + 强 Embedding 三件套
2023 年做 RAG,大家讨论的还是"Embedding 模型选哪个"、“要不要上 ColBERT”。2024 年话题变成了"Hybrid Search 到底怎么打分融合"。到了 2026 年,画风基本定了——
生产环境的 RAG 召回优化有三件套:强 Embedding 模型 + Hybrid Search + Rerank 精排。Query 改写、HyDE 这些"技巧"不是没用,而是从"主菜"降级成了"配菜"。
上一篇文章讲了 HyDE 这种"答案侧"技巧,今天这篇文章讲 2026 年的"主路线"。
为什么是这三件套?
RAG 召回的难题从来就两个:召回率(相关文档捞没捞到)和精度(捞到的准不准)。单一手段很难两个都好:
| 手段 | 召回率 | 精度 | 短板 |
|---|---|---|---|
| BM25 关键词 | ⭐⭐ | ⭐⭐⭐ | 不懂语义 |
| 向量检索 | ⭐⭐⭐ | ⭐⭐ | 漏专有名词 |
| 强 Embedding | ⭐⭐⭐ | ⭐⭐ | 仍有 query-doc 形态鸿沟 |
| Rerank 精排 | ❌(不召回) | ⭐⭐⭐⭐⭐ | 必须有候选才能用 |
三件套的本质是分工:
- 强 Embedding 解决"语义鸿沟"——2025 年开始 Qwen3-Embedding、BGE-M3 这代模型已经能让 query 和 doc 在向量空间里对齐得不错,原始问题直接 embed 也能搜到 70-80% 相关文档
- Hybrid Search 兜底剩余 20-30%——BM25 兜底精确关键词(产品名、人名、专业术语),向量兜底语义匹配,两者 RRF 融合
- Rerank 提精度——在 100-500 条候选里挑出真正相关的 top-K,喂给 LLM
整条流水线只比"裸向量检索"多了一次 BM25 调用 + 一次精排模型推理,但召回和精度能同时涨一档。
三件套怎么搭?
第一件:强 Embedding 模型
2026 年的选型已经收敛:
| 场景 | 推荐 | 理由 |
|---|---|---|
| 英文为主 | bge-large-en-v1.5 / text-embedding-3-large | 英文榜 MTEB 头部 |
| 中文为主 | Qwen3-Embedding-0.6B | MTEB 多语言榜第一(0.6B 即可) |
| 多语言 | BGE-M3 | 一模型支持 100+ 语言、密集+稀疏双输出 |
| 资源受限 | Qwen3-Embedding-0.6B | 只需 8GB 显存,单卡能跑 |
⚠️ 别再纠结 0.6B 还是 8B。Qwen3-Embedding 系列已经证明:0.6B 在多数 RAG 场景下不输 8B,省一半部署成本。
第二件:Hybrid Search(BM25 + 向量)
# 伪代码:RRF 融合 BM25 和向量检索
def hybrid_search(query, bm25_index, vector_db, top_k=100):
bm25_results = bm25_index.search(query, top_k=top_k) # 关键词召回
vector_results = vector_db.search(embed(query), top_k=top_k) # 语义召回
# Reciprocal Rank Fusion:按排名倒数加权求和
rrf_score = {}
for rank, doc in enumerate(bm25_results):
rrf_score[doc.id] = rrf_score.get(doc.id, 0) + 1 / (60 + rank)
for rank, doc in enumerate(vector_results):
rrf_score[doc.id] = rrf_score.get(doc.id, 0) + 1 / (60 + rank)
return sorted(rrf_score.items(), key=lambda x: -x[1])[:top_k]关键点:用 RRF 融合(倒数排名加权)而不是分数直接相加——分数区间不同没法加,排名天然可加。常数 k=60 是经验值,不用调。
第三件:Rerank 精排
把 Hybrid 检索出的 100-500 条候选扔给 Cross-encoder 或 API 模型精排:
from sentence_transformers import CrossEncoder
reranker = CrossEncoder('BAAI/bge-reranker-v2-m3') # 中英双语都强
def rerank(query, candidates, top_k=8):
pairs = [[query, doc.text] for doc in candidates]
scores = reranker.predict(pairs)
ranked = sorted(zip(candidates, scores), key=lambda x: -x[1])
return ranked[:top_k]选型上:
- 自部署:
BGE-Reranker-v2/Qwen3-Reranker(开源,中英都好) - 托管 API:
Cohere Rerank 3.5/Jina Rerank(闭源但省心,英文最强)
延迟预算:50-200ms / 100 候选(CPU),5-20ms(GPU),可以接受。
三件套之上的可选增强
搭好三件套后,召回通常能从 60-70% 拉到 85%+。如果还有缺口,按场景叠:
| 缺口类型 | 叠加技巧 | 何时用 |
|---|---|---|
| 关系型查询(“X 和 Y 的区别”、“第 4 节引用的附录”) | Graph RAG / LazyGraphRAG | 文档结构化、有大量交叉引用 |
| 口语化问题、专有名词捞不到 | HyDE / Query 改写 | 客服 FAQ、内部问答 |
| 需要复杂决策(“该不该”、“如何权衡”) | Agentic RAG(LLM 自主决定检索策略) | 企业知识库、研究类问题 |
| 多模态查询 | 多模态 Embedding(CLIP、BGE-VL) | 文档含大量图表、图片 |
LazyGraphRAG 特别提一下:微软 2024 年底开源,索引成本只有 GraphRAG 的 0.1%(千分之一),但全局查询质量接近完整 GraphRAG——是 2025-2026 年最值得关注的"性价比之王"。
反过来,别叠的:
- 已经用强 Embedding + Hybrid + Rerank 还叠 HyDE → 边际收益通常 < 5%,不值得多 200ms 延迟
- 简单 FAQ 场景上 Graph RAG → 杀鸡用牛刀,成本暴涨但效果持平
- 强专业领域(医疗/法律)强行 Agentic → LLM 会"自主决策"错方向,不如规则化
2026 年做 RAG 召回优化的第一原则:
先把"强 Embedding + Hybrid Search + Rerank“三件套搭扎实(这一步能解决 80%+ 的召回问题),再按具体缺口按表叠加 HyDE / Graph / Agentic——不要反过来。
参考资料:
- Microsoft Research (2024). LazyGraphRAG: Setting a New Standard for Cost-Efficient RAG. arXiv:2411.11523 — 微软官方 LazyGraphRAG 论文。
- Qwen Team (2025). Qwen3-Embedding & Qwen3-Reranker Technical Report. — 阿里 Qwen3 嵌入系列官方报告。
- Chen, J., et al. (2024). BGE M3-Embedding: Multi-Lingual, Multi-Functionality, Multi-Granularity Text Embeddings Through Self-Knowledge Distillation. arXiv:2402.03216 — BGE-M3 论文。