检索模式
先说结论
检索模式决定了 RAG 系统如何从知识库中找到与查询相关的文档片段,是影响 RAG 端到端质量的关键环节,主要包含稀疏检索、稠密检索、混合检索和递归检索四大类。
QUESTION 面试高频:常见的检索策略有哪些?各有什么优缺点?
检索策略对比
| 策略 | 原理 | 优势 | 劣势 | 代表方法 |
|---|---|---|---|---|
| 稀疏检索 | 基于词频的精确匹配 | 关键词匹配精确、无需训练 | 缺乏语义理解 | BM25, TF-IDF |
| 稠密检索 | 用嵌入向量相似度检索 | 语义理解好、跨语言 | 对关键词匹配弱、需训练 | DPR, BGE, OpenAI Embedding |
| 混合检索 | Dense + Sparse 融合 | 兼顾语义和关键词 | 需要调参融合权重 | Hybrid Search |
| 多向量检索 | 文档生成多个向量表示 | 覆盖多角度 | 存储开销大 | MultiVector Retriever |
| 递归检索 | 先检索摘要再检索原文 | 处理长文档效果好 | 多步检索延迟高 | Parent-Child Retriever |
稀疏检索(BM25)
QUESTION 面试高频:BM25 的核心公式是什么?
BM25 是基于词频的经典检索算法,核心思想:词频越高越相关,但边际递减;文档越长惩罚越大。
其中:
- :查询词 在文档 中的词频
- :文档长度,:平均文档长度
- :词频饱和参数(通常 1.2-2.0),控制词频的边际递减
- :长度归一化参数(通常 0.75), 忽略文档长度
- :逆文档频率,衡量词的稀有程度
BM25 的优势场景:关键词精确匹配(如产品编号、人名、术语)、低资源语言、无需 GPU。
稠密检索(Dense Retrieval)
工作原理
查询 → Embedding Model → 查询向量 q
文档 → Embedding Model → 文档向量 d
相似度 = cos(q, d) 或 IP(q, d)
对比学习训练
稠密检索模型通常通过对比学习训练:
其中 是正样本(相关文档), 包含负样本(不相关文档), 是温度参数。
常用嵌入模型对比
| 模型 | MTEB 排名 | 中文支持 | 维度 | 特点 |
|---|---|---|---|---|
| OpenAI text-embedding-3-large | 顶级 | 良好 | 3072 | 效果好,API 付费 |
| BGE-M3 | 顶级 | 优秀 | 1024 | 多语言多粒度,开源 |
| GTE-Qwen2-7B | 顶级 | 优秀 | 3584 | 开源最强中文 |
| Cohere embed-v3 | 顶级 | 良好 | 1024 | 支持不同任务类型 |
| Jina-embeddings-v3 | 高 | 良好 | 2048 | 长文本支持好 |
QUESTION 面试高频:稠密检索的「查询-文档不对称」问题怎么解决? 查询通常很短(几个词),文档很长(数百词),二者语义空间分布不同。解决方案:**双编码器(Bi-Encoder)**为查询和文档使用不同编码器或不同前缀;硬负样本挖掘训练时加入难区分的负样本;**查询扩展(HyDE)**先让 LLM 生成假设性答案来丰富查询语义。
混合检索(Hybrid Search)
QUESTION 面试高频:为什么 Hybrid Search 应该是默认选择?
核心原因:稀疏检索和稠密检索互补性强——稀疏检索擅长关键词精确匹配(产品号、人名、术语),稠密检索擅长语义理解(同义词、释义、跨语言)。实际场景中用户查询可能包含任意组合,单一策略总有盲区。
融合策略
| 方法 | 原理 | 特点 |
|---|---|---|
| Reciprocal Rank Fusion (RRF) | 无需归一化,简单有效 | |
| 加权融合 | 需调参 | |
| 级联 | 先稀疏粗筛,再稠密精排 | 减少计算量 |
RRF 公式详解
其中 是所有检索器集合, 是平滑常数(通常取 60)。RRF 的优势:不需要对分数做归一化,直接用排名即可融合,非常鲁棒。
高级检索技巧
HyDE(假设性文档嵌入)
用户查询 → LLM 生成假设性回答 → 假设回答的嵌入 → 用于检索
核心思想:用户的查询通常很短、很模糊,而文档很长、很具体。假设性回答的嵌入比原始查询的嵌入更接近真实文档的嵌入空间。
Contextual Retrieval(Anthropic)
解决 Chunk 的"上下文丢失"问题:
Chunk → LLM 生成上下文描述 → "此片段讨论了 2024 年 Q3 季度收入"
↓
上下文描述 + 原始 Chunk → 一起嵌入
递归检索(Parent-Child)
查询 → 检索子 Chunk(小块,精确) → 映射到父 Chunk(大块,完整上下文)
↓
将父 Chunk 送入 LLM
适用于需要精确检索但生成时需要完整上下文的场景。
Self-RAG 自适应检索
模型自行决定是否需要检索,并评估检索结果的相关性和生成结果的忠实度:
查询 → [需要检索吗?] → 是 → 检索 → [结果相关吗?] → 是 → 生成 → [有证据支持吗?] → 回答
↓ 否 ↓ 否 ↓ 否
直接生成 重新检索 重新生成
特殊 token:[Retrieve]、[IsRel]、[IsSup]、[IsUse] 控制自反思流程。
CRAG(纠错式 RAG)
检索结果 → 质量评估 → 高质量 → 正常使用
↓ 低质量
触发纠正(如 Web 搜索)→ 替换/补充检索结果
设计时真正要权衡什么
- 单一 vs 混合检索:混合检索几乎总是优于单一策略,但增加系统复杂度
- 检索精度 vs 召回率:Top-K 小精度高但可能遗漏;Top-K 大覆盖广但噪声多
- 延迟 vs 质量:多步检索(递归检索、Self-RAG)质量好但延迟高
- 在线 vs 离线计算:HyDE、Query Rewriting 增加在线延迟但提升检索质量
如果要对外讲,可以怎么概括
"检索是 RAG 的核心环节。我的首选策略是**Hybrid Search(BM25 + Dense Retrieval + RRF 融合)**作为标配,因为它兼顾了关键词精确匹配和语义理解。在具体场景中,我会根据查询特点选择高级策略:短查询用 HyDE 丰富语义,长文档用 Parent-Child 递归检索保留上下文,高精度场景用 Cross-Encoder 重排。关键是要先搭基线,用评估数据驱动优化决策。"
最后记几条
- Hybrid Search 是默认选择:Dense + Sparse + RRF 融合,无需调参
- BM25 仍有价值:关键词精确匹配场景不可替代,不是"过时技术"
- 嵌入模型选型看 MTEB 排行榜:中文场景优先选 BGE/GTE 系列
- HyDE 是短查询的利器:用假设性回答的嵌入替代原始查询
- 检索和重排分工:粗检索用快速模型,重排用高精度模型
参考资料
- Robertson, S. et al. "The Probabilistic Relevance Framework: BM25 and Beyond" (2009)
- Karpukhin, V. et al. "Dense Passage Retrieval for Open-Domain Question Answering" (EMNLP 2020)
- Gao, L. et al. "Precise Zero-Shot Dense Retrieval without Relevance Labels" — HyDE
- Asai, A. et al. "Self-RAG" (ICLR 2024)
- Anthropic Blog: "Contextual Retrieval" (2024)