3. 搜索算法基础:召回与排序
📌 章节定位:任何搜索面试的“及格线”。不问算法细节,先问概念分层。清晰区分“召回”和“排序”的职责,是面试官判断候选人是否具备工程思维的第一步。
🎯 召回 vs 排序:核心对比
| 维度 | 召回(Recall) | 排序(Ranking) |
|---|---|---|
| 目标 | 从海量候选池中快速找出“可能相关”的少量文档 | 对召回结果精确打分,输出用户最喜欢的Top-N |
| 候选集量级 | 千万→千/百 | 千/百→10 |
| 时延要求 | 毫秒级(10-100ms) | 相对宽松(几十到几百ms) |
| 常用方法 | BM25、倒排索引、向量检索 | DeepFM、DIN、Transformer-based模型 |
| 面试关注点 | 召回率和覆盖率 | 精准度和个性化 |
🧠 常用算法速览
- BM25:词频+逆文档频率的进阶版,包含文档长度归一化。面试高频:公式中
k1和b参数的意义。 - DSSM:双塔结构,Query和Doc分别过DNN,在最后一层做内积。典型用于向量化召回。面试高频:双塔离线训练 vs 在线更新的差异。
- DeepFM:用于精排。FM部分负责二阶特征交叉,深度部分负责高阶特征学习。面试高频:为什么DeepFM比Wide&Deep在特征交叉上更强?
📝 问答卡片
卡片1:召回与排序的核心区别是什么?
📌 概念辨析
- 核心差异:召回是“找”,排序是“选”。召回重覆盖和效率,排序重精度和个性化。
- 分层原因:全量排序计算量过大。优先生成百级别候选再精细排序,平衡延迟和精度。
- 协同关系:召回决定上限,排序决定下限。召回漏掉相关文档,排序再强也无效。
✅ 示例回答:“召回的目标是从千万级文档中快速筛选出百级候选,常用BM25或向量检索;排序则是利用深度模型(如DeepFM)对候选集精细打分,推送给用户。两者是漏斗关系,召回决定了系统的上限。”
卡片2:BM25有哪些关键参数和工程优化?
📌 算法深度
- 公式核心:BM25 = IDF * (fq,d * (k1+1)) / (fq,d + k1 * (1 - b + b * |d|/avgdl))
- k1:词频饱和度,通常[1.2, 2.0],越大对高频词惩罚越小。
- b:文档长度归一化,通常0.75,靠近1则长度惩罚强烈。
- 工程优化:提前算好IDF分桶、doc长度分档,避免在线重复计算。
✅ 示例回答:“BM25的k1控制词频饱和,b控制长度归一化。我在优化时,会将IDF和文档长度提前分桶索引,查询时直接查表,减少在线计算开销。”
卡片3:DSSM和DeepFM各自适合做什么?
📌 模型对比
| 维度 | DSSM | DeepFM |
|---|---|---|
| 阶段 | 召回(双塔向量化) | 排序(交叉特征) |
| 优势 | Query和Doc独立计算,离线缓存向量,在线快速近邻搜索 | 显式建模FM低阶交叉+深度网络高阶交叉 |
| 面试高频 | 双塔的temperature参数如何调? | 为什么DeepFM比单FM效果好? |
✅ 示例回答:“DSSM适合召回场景,Query和Doc分别过网络,在线只计算Query向量再近邻搜索;DeepFM适合精排,FM层处理二阶特征交叉,DNN处理高阶,两者联合训练效果优于单模型。”
🏢 公司侧重点
| 公司 | 召回侧重点 | 排序侧重点 |
|---|---|---|
| 百度 | 倒排+语义向量多路召回 | 海量用户行为特征的Wide&Deep变体 |
| 字节跳动 | 多路召回(标签、协同、向量) | 精排模型+瀑布流实时重排 |
| 阿里 | 淘宝搜索侧重向量化召回 | DIN/DIEN系列,强依赖用户行为序列 |
👤 面试官画像
- 典型画像:搜索算法专家,3-5年经验。更关注候选人对“分层逻辑”的理解,而非背诵公式。
- 考察点:是否清楚召回和排序的边界,能否结合业务举例。
- 应对策略:先给结论,再举具体场景例子,最后追问时能展开参数细节。
⚠️ 避坑指南
常见错误:
- 混淆概念:将BM25归类为排序算法。BM25是词袋模型,属于召回阶段。
- 忽略工程落地:面试官问“向量召回怎么实现”只回答理论,不提Faiss或HNSW等工程化方案。
- 不对比模型:只说DeepFM好,不说为什么比FM好、比Wide&Deep好。
正确示范:“我选DeepFM是因为它同时建模低阶和高阶交叉,相比Wide&Deep无需手动设计交叉特征,训练起来更省人力。”
📚 项目案例模板
项目名称:电商搜索多路召回优化
| 业务背景 | 用户搜索商品时,原有BM25召回覆盖率低,长尾商品容易漏掉 |
| 规模指标 | 商品库10亿+,日常请求峰值5000QPS,召回率提升15% |
| 技术栈 | BM25(Elasticsearch)、双塔模型(DSSM)、向量检索(Faiss) |
核心难点:
- 多路召回结果如何合并去重,保证最终list多样性和相关性。
- 向量召回延迟高,需把向量量化+分段索引,满足5ms要求。
面试高频追问:
- 多路召回融合时,你用什么策略?加权平均?交叉排序?
- 向量召回训练数据怎么构造?正负样本怎么选?
- Faiss的IVFPQ和HNSW分别适合什么场景?
可迁移回答话术:“在这个项目中,我们采用了两阶段融合:第一层用规则过滤掉强无关结果,第二层用一个轻量排序模型学习各路的权重。这比固定权重方式提升了5%的NDCG。”