召回策略与算法选型
召回是推荐系统的第一级漏斗,决定了候选池的质量与上限。面试官会从算法选型、实时性、多路融合策略三个维度考察你的系统设计能力和工程落地经验。本章结构化拆解高频考点与规模化场景下的关键决策点。
面试问答卡片
面试问题
请对比几种主流召回算法(如协同过滤、双塔模型、图召回、向量召回)的优缺点及适用场景。
面试官考察点
- 是否理解不同算法在稀疏性、冷启动、可解释性、工程复杂度上的本质差异
- 能否结合业务场景(如信息流、电商、短视频)给出选型依据
- 对实时性、存储、召回规模是否敏感
回答框架
- 分类对比:按是否依赖用户/物品特征、是否离线计算、能否处理冷启动分组
- 核心指标:召回率、响应延迟、内存开销、可增量更新
- 典型场景:粗排前召回用向量,近线用双塔,强实时用树检索
简短示例回答
“双塔模型适用于大规模物品的离线相似度计算,工程成熟度高;图召回能捕获高阶协同信号,适合社交关系丰富的场景;向量召回依赖优质embedding,冷启动需补充规则。我在短视频场景采用‘双塔+图+规则’三路并行,通过分层权重融合,召回率提升17%。”
可能追问
- 双塔模型如何处理用户行为序列的实时变化?
- 图召回的在线服务如何控制计算开销?
- 向量召回中HNSW的参数如何调优?
避坑提醒:不要只谈理论不谈指标;需强调线上A/B测试结果;避免将算法优劣化,应说“在XX条件下,YY更合适”。
面试问题
如何设计实时召回策略?请以用户点击行为触发为例说明。
面试官考察点
- 对实时数据流(如Kafka/Flink)的掌握程度
- 如何在延迟和召回质量之间做权衡
- 是否考虑过流量冲击、冷启动等工程问题
回答框架
- 触发时机:点击后秒级延迟,通过消息队列到达近线服务
- 计算路径:行为序列→更新用户向量→查询候选池→加入召回结果缓存
- 兜底策略:频率限制、降级到离线召回、限流开关
简短示例回答
“我们采用Flink消费点击流,每10秒更新一次用户短期兴趣向量。向量通过Faiss查询最近邻,结果与离线召回路合并。对高频点击做去重和限流,防止重复计算。上线后推荐点击率提升5.2%,系统TP999延迟控制在50ms以内。”
可能追问
- 如何保证实时召回结果与离线召回结果不重复?
- 实时召回如何对候选物品做多样性控制?
- 如果Flink任务宕机,如何恢复?
避坑提醒:避免只讲算法逻辑而不提容错和监控;必须量化延迟和收益;强调实时召回是锦上添花而非替代离线。
面试问题
多路召回结果如何进行有效融合?请设计一套融合策略。
面试官考察点
- 是否具备多路结果冲突处理的经验
- 能否平衡召回率、精排压力与体验多样性
- 是否了解预排序模型的融合方式
回答框架
- 分层融合:先合并去重,再按来源权重做预排序
- 动态权重:通过在线学习或强化学习调整各路配比
- 干预机制:业务规则(如新人保底、类目打散)后置执行
简短示例回答
“我们使用‘预排序+轻量模型’融合:先对各路召回结果取并集、去重、记录来源。用一个两层的MLP预估点击率,输入为物品在各路中的得分和特征,输出融合分。A/B测试显示,相比固定加权,召回有效点击提升8%。”
可能追问
- 如果某路召回延迟过高导致空窗,如何兜底?
- 预排序模型训练时正负样本如何构造?
- 如何防止多路融合导致多样性下降?
避坑提醒:不要只提简单加权平均;务必谈到模型化融合和在线调权;说明预处理(去重、归一化)的重要性。
项目案例:真实召回系统重构
| 项目要素 | 内容 |
|---|---|
| 项目名称 | 短视频召回系统多路融合升级 |
| 业务背景 | DAU 2亿+,原召回以协同过滤为主,冷启动差、实时性不足,推荐多样性下降 |
| 规模指标 | 候选池 500万视频,线上QPS 10万,召回层TP99 < 30ms |
| 技术栈 | Flink实时流、Faiss向量检索、GraphEmbedding、LightGBM预排序模型、Kafka |
| 核心难点 | ①用户短期行为向量秒级更新与Faiss索引重建的冲突;②多路候选结果重复率高达40%;③实时召回对离线召回的质量冲击 |
| 面试高频追问 | - 如何处理Faiss索引的实时更新与查询一致性? - 图召回训练如何利用用户行为序列? - 预排序模型的正负样本采样比例多少? - 多路融合中如何防止头部效应(只推荐热门)? |
| 可迁移回答话术 | “遇到多路召回冲突时,我首先分析各路的覆盖率和重复率,参考快手做法:采用‘预排序+轻量模型’融合,同时加入多样性打散规则。关键指标是召回率和CTR,最终通过AB实验迭代3版上线,验证了模型化融合优于固定加权。” |