项目深挖:你在项目里有没有做过 RAG 里的「召回-过滤-生成「三段式 pipeline?能不能细讲一下
1️⃣ 考察意图
这道题考察的是你对 RAG 系统整条链路的工程落地能力,而非仅背诵概念。面试官想看你是否真正踩过坑,知道每个环节的取舍点(比如召回率 vs 精度、延迟 vs 效果)。刁钻点在于:很多人只会说“用向量检索+LLM生成”,但讲不清为什么召回后要过滤、过滤和重排序的区别、以及生成阶段如何避免幻觉。答好了能展示你对 RAG 的系统级理解和调优方法论,这是 P1 级别区分“会用”和“能优化”的关键。
2️⃣ 标准答
我做过一个金融 QA 系统,核心是“召回-过滤-生成”三段式 pipeline。下面按阶段拆解。
召回阶段:混合检索保证高召回
- 方法:同时跑 BM25(关键词匹配)和向量检索(语义匹配)。BM25 用默认 k1=1.5, b=0.75,向量用 bge-large-zh-v1.5 模型,索引用 HNSW(ef_construction=200, M=16)。
- 为什么这么做:纯向量检索对罕见术语(如“可转债转股价”)召回差,BM25 能补上;但 BM25 对同义词(如“股票” vs “股权”)无效。混合后 Recall@20 从 78% 提到 92%。
- 坑:两路检索的 top-k 要调。一开始各取 20 个,结果去重后只剩 30 个,但很多是噪声。后来改成各取 10 个,合并后取 top-15,效果更好。
过滤阶段:重排序 + 规则去噪
- 重排序:用 bge-reranker-v2-m3(Cross-encoder),输入 query 和每个候选文档,输出相关性分数。只保留分数 > 0.3 的文档,最多 5 个。
- 规则过滤:① 去重:用 MinHash 去重相似 chunk(Jaccard 相似度 > 0.8 的只留一个)。② 时间过滤:金融数据有时效性,只保留 30 天内的新闻。
- 为什么先召回再重排序:召回阶段用 Bi-encoder 算 embedding,速度快(100ms 内);重排序用 Cross-encoder 精度高但慢(每个 pair 要 50ms),所以只对 top-20 重排,延迟可控。
- 坑:重排序阈值设 0.3 太低,会混入不相关文档;设 0.7 太高,可能漏掉正确答案。我们通过 500 条标注数据调优,发现 0.5 是 F1 最优值。
生成阶段:结构化 prompt + 指令约束
- Prompt 模板:包含“背景:{过滤后的文档}”、“问题:{query}”、“要求:只基于背景回答,如果背景不足,回答‘无法确定’”。
- 为什么这样设计:不加约束时,LLM 会脑补(幻觉)。明确“无法确定”选项,让模型有退路,减少幻觉率。
- 坑:背景文档太长会超 token 限制。我们限制每个文档 512 token,最多 5 个文档,总 token 控制在 3000 以内(用 GPT-4 的 8k 上下文)。如果文档超长,用滑动窗口截取最相关段落。
整体效果:在金融 QA 测试集上,准确率从 75%(无重排序)提升到 88%,延迟从 1.2s 降到 0.8s(因为重排序后输入更少)。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从召回、过滤、生成三个层面回答。召回阶段用 BM25+向量检索混合,保证高召回;过滤阶段用 Cross-encoder 重排序加规则去重,提升精度;生成阶段用结构化 prompt 约束,避免幻觉。总结一句:RAG 的核心不是堆模型,而是每个环节的取舍——召回要全、过滤要准、生成要稳。”
4️⃣ 高频追问 & 应对
追问 1:你提到混合检索,那 BM25 和向量检索的权重怎么调?有没有试过学习式融合?
权重调优分两步:先离线调,用验证集算 Recall@k,看哪种组合最优。我们试过固定权重(BM25:0.3, 向量:0.7)和动态权重(根据 query 长度,短 query 偏向 BM25,长 query 偏向向量)。学习式融合(如 RRF 或 DPR 的 score 归一化)也试过,但提升不大(<1%),反而增加复杂度。最终用简单加权,因为工程上更稳定。
追问 2:重排序模型怎么选?为什么用 bge-reranker 而不是 Cohere?
选型看三点:精度、延迟、部署成本。bge-reranker-v2-m3 在中文金融数据上比 Cohere rerank-v2 高 2% 的 NDCG@10,且开源可本地部署(延迟 50ms/pair)。Cohere 是 API 调用,延迟 200ms 且按量收费。如果场景对延迟敏感(如实时问答),bge 更优;如果数据量小且不想维护模型,Cohere 更方便。
追问 3:生成阶段怎么评估幻觉?有没有用 RAGAS 之类的框架?
用 RAGAS 的 faithfulness 指标,计算生成答案和背景文档的语义一致性。我们内部还加了规则:如果答案中出现背景中没有的实体(如公司名、数字),标记为潜在幻觉。实测 RAGAS 的 faithfulness 从 0.82 提升到 0.91(加入 prompt 约束后)。但 RAGAS 对短答案(如“是/否”)不敏感,所以还用了人工抽检。
5️⃣ 避坑 · 常见错误答法
- ❌ 说“召回阶段只用向量检索,因为语义理解好” → ✅ 应该提混合检索,因为向量检索对低频词和专有名词召回差,BM25 能互补。
- ❌ 说“过滤阶段就是重排序,直接取 top-5” → ✅ 应该区分重排序和规则过滤,重排序解决相关性,规则解决去重和时效性,两者互补。
- ❌ 说“生成阶段把全部文档塞进 prompt” → ✅ 应该控制 token 数,用滑动窗口或摘要压缩,否则 LLM 会丢失关键信息或超上下文限制。
6️⃣ 简历呼应
- 如果你有 RAG 项目:从你项目中的具体数据切入,比如“在金融 QA 中,我通过混合检索把 Recall@20 从 78% 提到 92%”,然后对比我的调优方法。
- 如果你只做过传统 NLP:用“检索-排序-生成”类比“搜索-排序-摘要”,强调 RAG 是搜索系统的升级版,核心是召回和排序的 trade-off。
- 如果你是校招无项目:聚焦论文复现,比如“我复现了 DPR 的检索部分,在 Natural Questions 上 Recall@20 达到 85%”,然后讨论重排序的必要性。
- 《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》(Lewis et al., 2020)
- 《Dense Passage Retrieval for Open-Domain Question Answering》(Karpukhin et al., 2020)
- 《ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT》(Khattab & Zaharia, 2020)
- 《RAGAS: Automated Evaluation of Retrieval Augmented Generation》(Shah et al., 2023)
- 《BGE: BAAI General Embedding》—— 开源 embedding 和 reranker 模型系列