检索用的什么方案
P0 · rag · 🏢 字节
🏷 标签:retrieval, vector-search, bm25
1️⃣ 考察意图
面试官想看你是否真正理解检索方案在RAG中的核心地位,而非只会背“向量检索”三个字。这是典型的工程取舍考察:你能否根据业务场景(数据量、延迟、精度)选择方案,并解释为什么。刁钻点在于:很多人只会说“我用向量检索”,但说不出Embedding模型选型依据、混合检索的权重设计、以及召回率评估的坑。答好了能展示你对检索整条链路的工程直觉和落地经验。
2️⃣ 标准答
检索方案不是单选题,而是组合拳。我通常按以下三层决策:
第一层:基础方案选型
- 向量检索:用Embedding模型(如BGE-large-zh-v1.5,维度1024)将query和文档转为向量,通过余弦相似度或内积检索。适合语义匹配,但冷启动时对罕见词不敏感。
- 关键词检索:BM25(默认k1=1.5, b=0.75)做词频-逆文档频率匹配。适合精确匹配(如产品型号、人名),但无法处理同义词。
- 混合检索:向量+BM25加权融合,权重通常设为0.7:0.3(经验值,需调参)。这是工业界主流,兼顾语义和精确性。
第二层:工程落地细节
- 索引构建:向量索引用HNSW(efConstruction=200, M=16),召回率比暴力搜索低1-2%,但延迟从秒级降到10ms内。BM25索引用倒排表,内存占用约原始文档的1.5倍。
- Embedding模型选型:BGE系列(如BAAI/bge-large-zh-v1.5)在中文场景比text-embedding-ada-002好5-10%的Recall@10,但参数量大(326M),推理需GPU。若用CPU,选bge-small-zh(24M),召回率降3-5%但延迟降10倍。
- 实际落地的坑:向量检索对长文档(>512 tokens)效果差,因为Embedding模型截断后丢失尾部信息。解法:用滑动窗口分块(chunk_size=256, overlap=50),每块独立编码,检索时取Top-K块再合并。另一个坑:BM25对停用词敏感,需自定义停用词表(如“的”“了”),否则召回率降15%。
第三层:评估与调优
- 离线评估:用Recall@K(K=10)和MRR(Mean Reciprocal Rank)。基线:纯向量检索Recall@10约75%,混合检索可到85%+。
- 在线A/B测试:关注用户点击率(CTR)和首条回复满意度。若CTR提升5%以上,说明检索质量改善。
- 为什么这么做:混合检索的trade-off是延迟增加(向量+BM25并行检索,再rerank,总延迟约50ms vs 纯向量20ms),但召回率提升10%+,对问答质量至关重要。若业务对延迟敏感(如实时对话),可降级为纯向量+rerank(用Cross-Encoder,如BGE-reranker-v2-m3,延迟约30ms)。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从方案选型、工程落地、评估调优三个层面回答。方案上,我通常用混合检索(向量+BM25),向量用BGE-large-zh-v1.5做语义匹配,BM25做精确召回。工程上,向量索引用HNSW,文档分块用滑动窗口避免截断。评估上,离线用Recall@K,在线看CTR。总结一句:检索方案没有银弹,必须根据数据特性和延迟预算做取舍。”
4️⃣ 高频追问 & 应对
追问 1:你的混合检索权重怎么调的?为什么是0.7:0.3?
权重不是拍脑袋,而是基于离线实验。我通常用网格搜索(grid search),在验证集上遍历权重组合(0.5:0.5, 0.6:0.4, 0.7:0.3, 0.8:0.2),选Recall@10最高的。0.7:0.3是通用经验值,因为语义匹配通常更重要。但若业务是产品搜索(精确匹配多),我会调到0.5:0.5。注意:权重归一化前需对向量和BM25分数做min-max归一化,否则量纲不同(向量分数范围[-1,1],BM25分数范围[0,10])。
追问 2:如果数据量到1亿条,你的方案还能用吗?
1亿条时,纯向量检索用HNSW索引,内存约1亿1024维4字节=400GB,单机扛不住。解法:用分片索引(sharding),按文档ID哈希分到4-8个节点,每个节点建HNSW。BM25索引用Elasticsearch集群,分片数=节点数*2。延迟会从10ms升到30-50ms,但可接受。若预算有限,降级为量化索引(如PQ,Product Quantization),将向量压缩到128维,内存降8倍,召回率降3-5%。
追问 3:Embedding模型更新后,旧索引怎么处理?
这是常见坑。解法:双索引策略。旧索引保留,新索引用新模型建,检索时并行查两个索引,结果合并去重。等新索引覆盖所有文档后,再下线旧索引。注意:新旧模型向量空间不同,不能直接比较相似度,所以必须独立检索。若文档量小(<100万),可全量重建索引,耗时约2小时。
5️⃣ 避坑 · 常见错误答法
- ❌ “我用向量检索,Embedding模型是BGE,效果不错。” → ✅ “我根据业务场景选型:语义匹配用BGE-large-zh-v1.5,精确匹配用BM25,最终用混合检索加权融合,权重通过离线实验调优。”
- ❌ “检索效果用Recall评估,达到80%。” → ✅ “Recall@K要指定K值,比如Recall@10=85%。同时要关注MRR,因为首条结果更重要。离线评估后还需在线A/B测试,看CTR是否提升。”
6️⃣ 简历呼应
- 如果你有RAG项目:从“混合检索权重调优”切入,讲你如何用网格搜索找到最优权重,以及分块策略对召回率的影响(如chunk_size从512降到256,Recall@10提升5%)。
- 如果你只做过传统NLP:用“文本分类中的特征选择”类比,说检索就是“特征匹配”,BM25类似TF-IDF,向量检索类似语义相似度,强调工程取舍(精度vs延迟)。
- 如果你是校招无项目:聚焦“BGE模型对比实验”,说你复现过bge-small-zh和bge-large-zh在公开数据集(如C-MRC)上的Recall差异,并分析参数量对推理速度的影响。
- 《Dense Passage Retrieval for Open-Domain Question Answering》(Karpukhin et al., 2020)——DPR论文,向量检索基础
- 《Efficient Estimation of Word Representations in Vector Space》(Mikolov et al., 2013)——Word2Vec,理解Embedding起源
- 《BGE: A High-Performance Chinese Text Embedding Model》(BAAI, 2023)——BGE技术报告,含模型选型指南
- 《HNSW: Hierarchical Navigable Small World Graphs》(Malkov & Yashunin, 2016)——HNSW算法,向量索引核心
- 《Elasticsearch: The Definitive Guide》(Clinton Gormley & Zachary Tong)——BM25和ES集群实践