Q963RAG 检索增强真题解析RAG(检索增强生成)AgentAlpha 社区真题库约 7 分钟更新 2026-09-29

你的 RAG 系统检索用的什么方案

你的 RAG 系统检索用的什么方案

P0 · rag · 🏢 蚂蚁

🏷 标签:rag, retrieval, rerank, hybrid-search

1️⃣ 考察意图

面试官想验证你对 RAG 检索环节的工程理解深度,而非背诵“混合检索+重排序”的套路。考察类型是工程取舍+系统设计。刁钻点在于:候选人常只提“用了向量检索”,但说不出为什么选稠密/稀疏、如何平衡召回与精度、以及实际落地的坑(如延迟、分块策略)。答好了能展示你对检索整条链路的掌控力:从索引构建、检索策略到精排优化,并具备处理长尾查询和噪声数据的实战经验。

2️⃣ 标准答

我的 RAG 检索方案采用混合检索 + 两阶段精排,核心目标是平衡召回率与精度,同时控制延迟在 200ms 以内。具体分为三部分:

  • 索引构建:对文档按 256-512 token 分块(基于语义边界,如段落或句子),使用重叠 10% 的滑动窗口避免信息断裂。对每个块生成:稀疏向量:BM25(默认 k1=1.5, b=0.75),用于精确关键词匹配,尤其处理专有名词(如“GPT-4”)或罕见实体。
  • 稠密向量:使用 bge-large-en-v1.5 或 e5-mistral-7b-instruct 生成 1024 维 embedding,用于语义相似度检索。索引采用 HNSW(ef_construction=200, M=16),内存占用约 2GB/百万文档。 检索阶段:用户查询先经 BM25 和向量检索并行执行,分别返回 top-50 结果。然后通过加权融合(权重 0.3 BM25 + 0.7 向量)合并为候选集,去重后保留 top-100。为什么这么做?BM25 擅长精确匹配但语义泛化弱,向量检索反之;融合能覆盖长尾查询(如“2023年财报中的风险提示”),但代价是增加 10-20ms 延迟。精排阶段:对 top-100 候选使用交叉编码器(如 BGE-reranker-v2-m3 或 Cohere rerank-v3.5)进行重排序,输出 top-5 给生成模块。交叉编码器直接计算查询-文档对的交互分数,精度比双编码器高 5-10%【通用知识】,但计算成本高(单次推理约 50ms)。因此只对 top-100 执行,而非全量。

实际落地的坑与解法:

  • 坑1:分块策略不当导致召回丢失。例如,长文档中关键信息跨块分布。解法:采用语义分块(如基于句子嵌入的聚类),而非固定 token 数;同时引入块级摘要,将每个块的摘要作为额外检索入口。
  • 坑2:混合检索权重敏感。固定权重(如 0.3/0.7)在特定场景(如法律文档)失效。解法:使用动态权重,根据查询类型(如关键词占比)调整,或通过小样本学习(如 100 条标注数据)训练线性回归模型预测权重。
  • 坑3:精排延迟过高。交叉编码器在 100 个候选上耗时 500ms,超出 SLA。解法:采用级联精排——先用轻量模型(如 MiniLM-L6)过滤到 top-20,再用大模型精排,总延迟降至 150ms。

为什么不用单一方案?纯向量检索在“2024年Q3营收”这类精确查询上召回率低(约 60%),而纯 BM25 对同义词(如“汽车” vs “车辆”)无效。混合检索是工程上的必要取舍。

3️⃣ 答题模板(30 秒电梯版)

“这个问题我从索引构建、检索策略和精排优化三个层面回答。索引层面,我用语义分块加 BM25 和稠密向量双索引;检索层面,并行执行混合检索,加权融合后取 top-100;精排层面,用交叉编码器重排序到 top-5。总结一句:核心是通过稀疏与稠密互补、两阶段级联,在召回率和精度间取得平衡,同时控制延迟在 200ms 内。”

4️⃣ 高频追问 & 应对

追问 1:你如何评估检索效果?具体指标和阈值是多少?

评估分离线与在线。离线用 Recall@k(k=5/10/20)和 MRR(Mean Reciprocal Rank),目标 Recall@10 > 0.85。在线用用户反馈(如点击率、答案采纳率)和 A/B 测试。阈值设置:BM25 的 IDF 过滤掉低于 0.5 的项,向量检索的余弦相似度阈值设为 0.6,避免噪声。注意:Recall 高但精度低时,需调整精排阈值或增加负样本训练。

追问 2:如果查询是“2023年财报中的风险提示”,你的系统如何保证召回?

这种长尾查询依赖混合检索的互补性。BM25 会匹配“2023年财报”和“风险提示”关键词,向量检索则捕捉“财报”的语义变体(如“年报”“财务报告”)。但若文档中“风险提示”被表述为“不确定性因素”,BM25 可能漏掉。解法:在索引阶段对文档做查询扩展(如用 LLM 生成同义词),或引入查询改写模块(如用 T5 将用户查询转为更规范的表述)。实际中,我曾在金融场景用此方法将 Recall@10 从 0.72 提升至 0.88。

追问 3:你的精排模型如何训练?数据来源是什么?

精排模型基于交叉编码器,使用对比学习训练。数据来源:正样本来自用户点击或人工标注的查询-文档对,负样本通过 BM25 检索的 top-100 中随机采样(hard negative)。训练时,损失函数用交叉熵,batch size 32,学习率 2e-5。关键取舍:负样本需包含“语义相似但答案错误”的案例(如“2023年营收” vs “2022年营收”),否则模型无法区分细粒度差异。数据量至少 10 万对才能收敛。

5️⃣ 避坑 · 常见错误答法

  • ❌ 说“我用向量检索,因为语义理解好,不需要 BM25” → ✅ 正确切入:强调混合检索的必要性,并给出具体场景(如专有名词匹配)说明 BM25 不可替代。
  • ❌ 说“精排用 GPT-4 直接 rerank,效果最好” → ✅ 正确切入:指出 GPT-4 延迟高(单次 1-2 秒)且成本高,实际用轻量交叉编码器(如 BGE-reranker)更经济,且可通过级联优化。
  • ❌ 说“分块固定 512 token,简单高效” → ✅ 正确切入:说明固定分块会导致语义断裂,需用语义分块或重叠窗口,并给出具体 token 数和重叠比例。

6️⃣ 简历呼应

  • 如果你有 RAG 项目:从项目中的检索瓶颈切入,例如“在金融文档检索中,我发现 BM25 对‘风险提示’这类短语召回不足,因此引入了动态权重混合检索,将 Recall@10 从 0.75 提升至 0.88”。
  • 如果你只做过传统 NLP:用信息检索类比,例如“传统 NLP 中,关键词提取类似 BM25,语义相似度类似向量检索;我迁移了这种互补思路,在文本分类任务中通过融合 TF-IDF 和 BERT embedding 提升了 F1 分数”。
  • 如果你是校招无项目:聚焦论文复现,例如“我复现了 ColBERT 的后期交互机制,并对比了 BM25 和 DPR 在 MS MARCO 上的表现,发现混合检索能提升 5% 的 MRR,这让我理解了检索的工程取舍”。
  • “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks” (Lewis et al., 2020)
  • “BGE: A Family of Embedding Models for General-Purpose Retrieval” (BAAI, 2023)
  • “ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction” (Khattab & Zaharia, 2020)
  • “HNSW: Efficient and Robust Approximate Nearest Neighbor Search” (Malkov & Yashunin, 2016)
  • “Reranking with Cross-Encoders: A Practical Guide” (Cohere Blog, 2023)

—— 本场面试完 ——