召回和粗排为什么不能跳过?
推荐系统架构中精排直接处理全量候选集的瓶颈分析
原题:在推荐系统架构中,召回和粗排模块分别承担什么功能?为什么不能跳过这些阶段而直接使用精排模型对全量候选集进行打分排序?
重排与优化 · 哔哩哔哩真题
回答与解析
三阶段分工
| 阶段 | 核心功能 | 候选集规模 | 模型特点 |
|---|---|---|---|
| 召回 | 从百万/亿级池子中快速筛选千级候选 | 10⁶~10⁸ → 10³ | 轻量模型(双塔、向量检索)、用户兴趣粗粒度匹配 |
| 粗排 | 对召回结果快速预筛选,为精排减负 | 10³ → 10² | 轻量精排模型或排序模型,平衡效率与效果 |
| 精排 | 精细打分,决定最终展示顺序 | 10² → 10¹ | 复杂深度模型,特征交叉、实时性要求高 |
为什么不能跳过?
1. 计算复杂度不可承受
- 精排模型通常涉及高维特征交叉、复杂网络结构,单次推理延迟10-100ms级
- 对百万候选集全量打分:延迟从百毫秒级→百秒级,完全无法满足在线 serving 要求
2. 特征获取成本
- 精排依赖实时特征(用户实时行为、上下文),全量候选的特征拼接和存储成本极高
- 召回/粗排可用离线预计算特征(如用户向量、物品向量)
3. 样本选择偏差与训练效率
- 精排训练数据来自曝光样本(即经过召回/粗排筛选后的"被看见"样本)
- 若直接用精排全量打分,训练分布与推理分布严重错位,模型学偏
4. 系统解耦与稳定性
- 分层设计实现计算资源隔离:召回失败可降级,精排超时可用粗排结果兜底
- 全链路单一模型风险集中,不符合工业级高可用设计
一句话总结
漏斗设计是计算资源、模型复杂度、业务效果三者权衡的工程最优解,非不能为,实不可为。
学习建议
深入理解数据分布变化与系统耦合问题,结合实际项目练习特征监控与AB测试设计。
口语版讲法(约4分钟)
- 本质是计算资源与模型复杂度的权衡
- 召回:从海量池子快速粗筛
- 粗排:在召回和精排之间做缓冲
- 为什么不能跳过:延迟、特征成本、训练分布错位
- 实际落地中的风险与权衡
这道题其实问的是推荐系统为什么非要用漏斗式架构,而不是一个模型打天下。本质是计算资源、模型复杂度和业务效果三者之间的工程取舍。
先说召回。召回的目标是从百万甚至亿级的物品池里,快速捞出一千个左右候选。它用的模型很轻量,比如双塔或者向量检索,特征也简单,基本是用户和物品的静态属性或者离线算好的向量。召回不追求准,追求快和全,宁可多捞一些不相关的,也不能漏掉用户可能感兴趣的。
然后粗排。粗排夹在召回和精排之间,是个容易被忽视但很关键的角色。它拿到召回的一千个候选,再用一个稍微复杂一点的模型快速筛到一两百个。粗排的模型可能是个轻量级的深度网络,或者一个简单的GBDT,特征是离线计算加少量在线拼接。它的目标是平衡效率和效果,比召回准,但比精排快得多。
最后精排。精排拿到粗排筛出来的一两百个,用最复杂的模型,比如深度神经网络加各种特征交叉,精细打分,决定最终展示顺序。精排单次推理可能要10到100毫秒,而且依赖大量实时特征,比如用户刚点的商品、页面停留时间。
那为什么不能跳过召回和粗排,直接用精排对全量候选打分?这里有个关键的计算复杂度问题。假设全量候选是一亿,精排单次推理50毫秒,那全量打分需要50亿毫秒,相当于500万秒,也就是将近60天。在线服务要求百毫秒级响应,完全不可行。
再说特征成本。精排依赖实时特征,如果对全量候选都去拼特征,存储和计算开销会爆炸。而召回和粗排可以用离线预计算的特征,比如用户向量、物品向量,在线只做向量检索,成本低很多。
还有一个容易被忽略的点是训练分布。精排模型的训练数据来自曝光样本,也就是经过了召回和粗排筛选之后用户实际看到的那些物品。如果直接拿精排去给全量候选打分,模型的推理分布和训练分布严重错位,模型会学偏,效果反而更差。
举个例子,电商推荐系统里,用户搜索“运动鞋”,召回先通过向量检索从一亿商品里捞出一千双鞋,粗排再用点击率预估模型筛到两百双,最后精排结合用户历史购买、实时行为、商品详情等复杂特征,排好顺序。如果跳过召回和粗排,精排直接对一亿商品打分,不仅计算来不及,而且那些从来没被用户看到过的商品,特征拼不全,模型也没见过,打分根本不准。
不过这里有一个值得深入的点:粗排模型的训练数据其实存在选择性偏差,因为它只能看到召回送过来的候选,而召回可能已经丢掉了一些长尾但用户真正感兴趣的商品。所以实际落地时,我会特别关注召回和粗排的召回率监控,以及做全量回放来评估是否有系统性漏报。
所以说,漏斗设计不是不能跳过,而是不可为。它是在计算资源、模型复杂度、业务效果之间找到的最优工程解。我更倾向于把召回、粗排、精排看作一个整体系统,每一层都有自己的边界和职责,而且层与层之间要留有缓冲和降级策略。比如粗排超时,可以用召回结果直接兜底;精排挂了,可以用粗排的排序临时顶上。这种解耦设计才是工业级系统的关键。
关键一句:粗排模型训练存在选择性偏差,因为它的训练数据只来自召回筛选后的候选,可能遗漏长尾兴趣,需要做全量回放和召回率监控。
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做电商首页推荐,用户一进来,候选商品池有几百万,但精排模型很重,你打算让精排对所有商品都算一遍分数吗?实际上我们一般不会这么干,那中间会加什么阶段,各自负责什么?
- 问法 2 · 层层追问
推荐系统里,候选集很大吧,你是怎么快速缩小范围的?……那缩小到千级别之后呢,是不是直接上精排?……其实中间还有个粗排,它和召回、精排比,到底在解决什么问题?
- 问法 3 · 直球架构
请解释推荐系统中召回和粗排各自的功能定位,以及为什么不能跳过它们,直接用精排模型对全量候选集打分排序。主要从计算开销、特征工程和系统稳定性几个角度说。