综合模拟面试 2 · 检索与工程质量#
面试官画像: 搜索推荐方向 Senior Engineer 时长: 45-50 分钟 · 难度: ★★★★☆ 覆盖方向: 向量召回管道 → RAG 知识库 → 数据清洗 → 评测体系 → 延迟优化
第一阶段 · 召回管道(15 分钟)#
面试官: 介绍一下你的召回管道。
候选人: 三阶段:BGE-M3 dense 编码 → Qdrant 向量搜索 + 多维 payload filter → BGE-Reranker cross-encoder 精排。经历三次选型修订:Faiss → Qdrant hybrid → dense+filter+精排。核心洞察:exact-match 是 filter 问题不是打分问题。
面试官: 为什么删掉 sparse 腿?
候选人: 品牌/型号是结构化字段,payload filter 直接解决。sparse 增加复杂度还踩了融合查询 filter 静默失效的坑。
面试官: 跨语言怎么做的?
候选人: BGE-M3 原生多语言,中文 query 和英文商品同一向量空间。实测有效。
面试官: 精排为什么不总是开?
候选人: 本地 Jaccard 回退是 stub,跨语言零重叠空转。只在配了真 reranker 时重排。
第二阶段 · RAG 知识库(10 分钟)#
面试官: 两段式检索怎么做的?
候选人: 一次性语义搜索”旅行包”混进”旅行杯""旅行枕”。拆成 resolve_category 品类投票 + fetch_cards 精确取卡。Recall@10=0.983。
面试官: 卡片怎么生成?
候选人: 5 类卡片确定性规则聚合真实商品数据。LLM 只用于属性分布。后加 aliases + Shopify 属性骨架桥接。
第三阶段 · 延迟优化(10 分钟)#
面试官: 83s 怎么压到 40s?
候选人: ~96% 是 LLM 解码。四刀:子关 reasoning(50s→5s)、planner 预置省一轮、收尾不逐件重写、追问轮不开 reasoning。结果 83.2s→39.7s,9轮→5轮。
面试官: 收尾流式?
候选人: items_preview 先推商品卡,summary_delta 逐 token 推文案。先出货后出文案。
第四阶段 · 评测体系(10 分钟)#
面试官: Rubric 评测?
候选人: P0 一票否决 / P1 扣分 / P2 质量打分。judge 两刀(定制细则 + 逐条打分)。核心:先校准 judge——三类假阳性校准后 +61%。
面试官: 18 条 query 统计意义?
候选人: 弱。但回归基线:改完跑分数跌就是退步。大规模需线上 A/B。