推荐系统三阶段协同作战:从海量候选到精准触达的工程实践
每次打开一个内容或电商应用,首页上那些“猜你喜欢”的内容,背后都藏着一套精密运转的推荐引擎。这套引擎并非一个单一的“黑盒”模型,而是一条由多个专业环节紧密咬合而成的工业流水线。对于希望深入理解推荐系统如何从数亿候选中,最终筛选出呈现在你眼前那几十个结果的开发者和产品经理而言,理清这条流水线上 召回(Recall)、粗排(Coarse Ranking)、精排(Fine Ranking) 这三个核心阶段的协作逻辑,是构建和优化推荐系统的关键第一步。
这就像一场漏斗式的筛选比赛:召回是海选,负责从茫茫人海中快速找出有潜力的选手;粗排是初赛,用相对简单的标准进行快速筛选,缩小决赛圈范围;精排则是终极决赛,动用最专业的评委和最复杂的评分体系,决出最终的冠军排名。每个阶段都有其独特的使命、技术选型和性能权衡。理解它们如何协同,不仅能帮你诊断推荐效果不佳时问题出在哪个环节,更能指导你在资源有限的情况下,做出最明智的技术投资决策。接下来,我们将通过一个电商场景的完整案例,拆解这三个阶段是如何接力完成一次个性化推荐的。
1. 召回阶段:从亿级候选池中快速“大海捞针”
召回是推荐链路的第一道闸门,它的核心任务只有一个:快而全。在一个拥有数亿甚至数十亿商品、视频或文章的平台上,精排模型不可能对每一个候选物品都进行复杂的计算,那将带来无法承受的计算成本和响应延迟。因此,召回阶段必须像一个高效的侦察兵,在极短的时间内(通常要求在几十毫秒内),从整个候选池中筛选出几千个与用户潜在兴趣相关的物品,交给后续环节处理。
这个阶段的挑战在于,如何在保证速度的前提下,尽可能减少“漏网之鱼”——即不让用户真正感兴趣的内容在第一步就被错误地过滤掉。为了实现这一目标,现代工业级推荐系统普遍采用 “多路召回” 策略。这意味着同时运行多种不同的召回策略或模型,每路召回从不同角度捕捉用户兴趣,最后将各路结果合并去重,形成一个丰富的候选集合。
1.1 主流召回策略与技术实现
多路召回的设计,本质上是对用户兴趣和物品特性的多维度覆盖。常见的召回路径包括:
- 热门/趋势召回:基于全局或分群体的实时热度统计(如点击率、播放量、销量),召回当前最受欢迎的物品。这保证了推荐的时效性和基础体验,尤其对新用户或行为稀疏的用户有效。
- 协同过滤召回:这是经典的个性化召回方法。基于物品的协同过滤(Item-CF) 根据“喜欢A物品的用户也喜欢B物品”的逻辑进行推荐;基于用户的协同过滤(User-CF) 则寻找相似用户,推荐他们喜欢过的物品。Item-CF由于物品向量相对稳定且数量少于用户,在工程上更易实现,是更主流的选择。
- 基于内容的召回:利用物品的元数据(标签、类别、描述文本)和用户画像(显式兴趣标签、历史交互物品的内容特征)进行匹配。例如,用户最近常看科幻电影,系统就召回所有带有“科幻”标签的电影。这种方法对冷启动物品(新上架、缺少交互数据)非常友好。
- 向量化召回(Embedding-Based Retrieval, EBR):这是当前的主流技术方向。通过深度学习模型(如双塔模型),将用户和物品分别映射到同一个低维向量空间。用户的向量由其历史行为序列、画像特征等生成,物品向量则由其自身特征生成。召回时,通过近似最近邻搜索(ANN)技术,快速找出与用户向量最相似的物品向量。这种方法能捕捉非线性的复杂关系,效果通常优于传统方法。
在实际系统中,这些召回路径是并行计算的。一个典型的电商用户“小明”的召回过程可能是这样的:系统同时启动四路召回——一路基于他最近浏览的“机械键盘”和“电竞鼠标”进行Item-CF召回;一路基于他的用户画像(男性,25-30岁,数码爱好者)进行标签匹配的内容召回;一路召回当前全站热销的数码产品;还有一路用双塔模型根据他近期的行为序列生成用户向量,进行向量化召回。最终,这四路结果合并,得到一个包含约5000个商品的初始候选集。
注意:召回阶段并不追求极致的排序准确性。它的目标是“宁可错杀一千,不可放过一个”,即召回率(Recall)是更关键的指标。只要用户感兴趣的商品大概率在这个5000的集合里,召回的任务就算成功。排序的精度问题,留给后面的阶段去解决。
1.2 工程挑战与优化方向
召回的工程实现面临巨大挑战。以向量化召回为例,如何在毫秒级时间内,从数亿物品向量中找出最相似的几千个?直接计算两两相似度是天文数字般的计算量。业界通常采用近似最近邻搜索技术来解决,例如:
- 局部敏感哈希(LSH):将高维空间中的向量哈希到桶中,相似向量有很大概率落入同一个桶,大幅缩小搜索范围。
- 基于图的索引(如HNSW):在向量空间中构建层次化导航图,搜索时沿着边快速逼近目标区域,在精度和效率间取得很好平衡。
- 基于量化的方法(如PQ/IVFPQ):将高维向量压缩成短编码,在压缩空间中进行快速计算。
这些技术的选择,需要在内存占用、查询速度、召回精度三者之间进行权衡。一个常见的优化是建立两级索引:先用较粗的聚类(如IVF)将全量向量划分到若干粗聚类中心,召回时先找到距离用户向量最近的几个聚类,再在这些聚类内部进行精细搜索。
2. 粗排阶段:效率与精度的第一次平衡
经过召回,我们得到了一个几千量级的候选集。如果直接将这些候选全部送入精排模型,计算成本依然非常高。精排模型通常非常复杂,特征维度可达数千甚至上万,对几千个物品逐一进行精排打分,延迟可能达到几百毫秒,无法满足在线服务的实时性要求(通常要求整体在100-200毫秒内响应)。
这时,粗排就扮演了“中场裁判”的角色。它的目标是在计算成本和排序精度之间取得一个可行的平衡,用一个相对轻量级的模型,对几千个候选进行快速打分和排序,筛选出几百个(例如500个)最有可能进入最终推荐列表的候选,送给精排。粗排模型不能太复杂,否则失去了过滤的意义;也不能太简单,否则过滤效果差,会把很多优质候选过早淘汰,或者让大量劣质候选进入精排,浪费计算资源。
2.1 粗排模型的技术选型
粗排模型的设计哲学是“轻量高效”。它使用的特征数量通常远少于精排,模型结构也更为简单。常见的技术方案包括:
- 轻量级机器学习模型:如逻辑回归(LR)、梯度提升决策树(GBDT)等。这些模型训练和预测速度快,可解释性强,在特征工程得当时能取得不错的效果。GBDT尤其擅长处理连续特征和进行特征组合。
- 浅层神经网络:例如简单的多层感知机(MLP),层数较少(如2-3层),神经元数量也有限。相比LR和GBDT,神经网络能自动学习特征间的非线性交互,但需要更多的数据来训练。
- 知识蒸馏:这是一个越来越流行的思路。用训练好的、复杂的精排模型(教师模型)的输出作为监督信号,来训练一个结构简单得多的粗排模型(学生模型)。这样,粗排模型能在保持轻量的同时,一定程度上模仿精排模型的判断能力,提升筛选质量。
在特征方面,粗排通常使用用户和物品的核心特征,例如用户的基础画像(性别、年龄)、近期行为统计(点击率、品类偏好),以及物品的基础属性(类别、价格、历史CTR)。它可能不会使用非常细粒度的特征(如用户长达百页的行为序列ID)或需要复杂实时计算的特征。
2.2 粗排的业务价值与冷启动处理
粗排的存在,使得精排可以专注于对几百个高质量候选进行“精益求精”的排序,从而让整个系统在有限的算力下,实现整体效果的最优。我们可以用一个简单的表格来对比三个阶段的核心差异:
| 阶段 | 输入规模 | 输出规模 | 核心目标 | 模型复杂度 | 特征数量 | 延迟要求 |
|---|---|---|---|---|---|---|
| 召回 | 亿级 | 几千级 | 高召回率,不漏掉好内容 | 低到中(侧重检索效率) | 少 | 极低(<50ms) |
| 粗排 | 几千级 | 几百级 | 效率与精度的平衡,高质量初筛 | 中(轻量级排序模型) | 中(核心特征) | 低(<20ms) |
| 精排 | 几百级 | 几十级 | 极致排序精度,决定最终列表 | 高(复杂深度模型) | 多(千维以上) | 中(<100ms) |
粗排还承担着一个重要任务:处理冷启动问题。对于新上线的物品或新用户,精排模型可能因为缺乏历史数据而难以准确评估。粗排可以通过一些规则或简单模型(如基于内容相似度的打分),给这些新候选一个“入场券”,避免它们被完全排除在精排之外,为系统注入新鲜血液。
在我们的电商案例中,小明的5000个召回商品进入粗排。粗排模型可能是一个小型的GBDT模型,它快速读取每个商品的品类匹配度、近7天销量、价格区间是否符合小明消费水平、以及小明对该品类历史点击率等几十个特征,在10毫秒内为5000个商品打出初步分数,并选出排名前500的商品,送入精排环节。
3. 精排阶段:复杂模型下的终极对决
精排是推荐系统的“皇冠”,直接决定了最终呈现在用户面前的列表顺序。到了这个阶段,候选集已经缩小到几百个,计算资源可以“奢侈”地用在每个候选上。精排的目标是极致的个性化排序精度,它需要综合所有可用的信息,预测用户对每个候选的偏好程度(如点击率、转化率、观看时长等)。
精排模型是整个系统中最复杂、最耗计算资源的部分,也是算法工程师们投入研究最多的领域。它的发展历程,可以说是机器学习,特别是深度学习在工业界应用的缩影。
3.1 精排模型的技术演进与核心架构
早期的精排模型以逻辑回归(LR) 和 因子分解机(FM) 为主,它们擅长处理大规模稀疏特征,但模型表达能力有限,需要大量人工特征工程来挖掘特征交叉信息。
随着深度学习的发展,深度神经网络成为精排的绝对主流。其基本架构是一个“宽深”结合的网络:
- 输入层与嵌入层:处理海量的稀疏ID类特征(如用户ID、物品ID、历史点击物品ID序列)。每个ID被映射为一个低维稠密向量(Embedding),这是模型学习表征的关键。
- 特征交互层:这是模型的核心。如何让不同特征(如“用户性别”和“物品类别”)进行有效的交互,决定了模型的表达能力。从简单的多层感知机(MLP) 自动学习非线性交互,到专门为特征交叉设计的 Deep & Cross Network (DCN)、xDeepFM 等模型,再到引入注意力机制(如 AutoInt)让模型动态关注更重要的特征交互,技术不断演进。
- 多任务学习:在实际业务中,我们往往不只关心一个指标。电商可能同时关注点击率和转化率,视频平台关注点击率和完播率。多任务学习(MTL) 模型(如 MMOE、PLE)通过共享底层特征表示,同时优化多个目标,既能提升模型效率,也能缓解不同任务间的跷跷板现象。
一个现代精排模型的训练和预测流程非常复杂。它依赖于庞大的特征平台提供实时和离线的特征(例如,用户过去1小时对某品类的点击次数),以及高效的样本拼接系统,将正负样本(点击/未点击)与对应的特征准确关联起来。
3.2 精排中的实战细节与挑战
在实际部署精排模型时,工程师们需要面对诸多挑战:
- 特征实时性:用户的兴趣瞬息万变。一个刚搜索了“旅行箱”的用户,接下来几分钟内对旅行用品的推荐权重应该显著提高。这就要求特征系统能够近乎实时地(秒级)更新用户的最新行为特征,并注入到正在进行的精排推理中。这通常通过流式计算平台(如Flink)和高速特征存储(如Redis)来实现。
- 在线服务性能:尽管候选只有几百个,但精排模型参数量大、计算图复杂,一次推理仍需要几十毫秒。为了满足整体延迟要求,工程师需要采用各种优化手段,如模型剪枝、量化、使用高性能推理框架(如TensorRT, ONNX Runtime),甚至将模型部署到专用AI芯片上。
- 探索与利用:如果模型只推荐它认为“概率最高”的物品,很容易陷入信息茧房,并且无法发现用户潜在的新兴趣。因此,需要在精排结果中引入一定的探索机制。例如,使用汤普森采样或上置信界算法,对一些预估分数不确定但有一定潜力的物品给予曝光机会,收集反馈数据,用于模型的持续迭代。
回到小明的例子,精排模型拿到了粗排筛选出的500个商品。模型会动用上千维特征:包括小明的详细画像、实时行为序列(最近30次点击、搜索词)、这500个商品的详细属性、以及它们与小明历史行为的交叉特征(如“小明过去买过该品牌几次”)。一个复杂的深度网络对这些特征进行层层计算,最终为每个商品输出一个精细的点击率预估分数。系统根据这个分数进行排序,生成最终的Top 50推荐列表。
4. 超越排序:重排与系统联调
经过精排,我们得到了一个按预估分数严格降序排列的列表。然而,直接将这个列表展示给用户,体验可能并非最优。因此,在精排之后,通常还有一个 “重排” 阶段。重排不再聚焦于单个物品的得分,而是从列表整体的角度进行优化,考虑更多业务规则和用户体验因素。
重排的主要目标包括:
- 多样性:避免连续推荐同质化内容。例如,在推荐了“机械键盘”后,接下来的几个位置可以插入“电竞椅”、“游戏耳机”或“办公软件”,打破品类垄断,提升探索性。
- 新鲜度:适当注入一些新内容、新商品,避免列表陈旧。
- 业务规则:满足运营需求,如保证某些战略品类或广告的固定曝光位。
- 上下文感知:考虑物品在列表中的相互影响。例如,一个非常吸引眼球的视频如果放在第一个,可能会大幅降低后续视频的点击概率,需要适当调整位置。
重排的实现可以是基于规则的,也可以是基于模型的。基于模型的方法,如使用强化学习来学习列表级的优化策略,是当前的研究热点。
4.1 三阶段协同的评估与迭代
召回、粗排、精排作为一个整体,其效果需要通过一套完整的评估体系来衡量。评估分为离线评估和在线A/B测试。
离线评估主要看各环节的中间指标:
- 召回:关注召回率。给定一批用户和其交互过的正样本物品,看召回环节能否将这些正样本物品找回来。
- 粗排/精排:关注排序质量。常用 NDCG、MAP 等排序指标,评估模型输出的排序列表与真实用户偏好顺序的吻合度。
然而,离线指标再高,也不能完全代表线上业务效果。最终的黄金标准是在线A/B测试。通过将用户流量随机分成实验组和对照组,实验组使用新的召回/粗排/精排策略,对照组使用旧策略,对比核心业务指标(如点击率、人均观看时长、GMV等)的变化。只有在线实验证明正向收益,新策略才会全量上线。
4.2 全链路优化:从孤立到协同
传统的做法是三个阶段独立优化,但这可能导致局部最优而非全局最优。例如,召回一味追求高召回率,可能给粗排输入了大量难以区分的候选,增加了粗排的负担。最新的趋势是进行全链路联合优化。
一种思路是端到端训练的探索,尽管工程难度极大。更实际的是反馈信号传导:精排模型可以将其学到的“知识”(例如,哪些特征组合更重要)通过知识蒸馏的方式教给粗排模型;同样,粗排和精排的样本和信号也可以用于指导召回模型(尤其是向量化召回模型)的训练,让召回出的候选集质量更高,更符合下游排序的“口味”。这种协同优化,使得三个环节不再是孤立的漏斗,而是一个有机的整体,共同朝着提升最终用户体验的目标前进。
在我经历的一个电商推荐系统升级项目中,我们最初独立优化精排模型,AUC提升了0.5%,但线上GMV纹丝不动。后来通过分析链路数据发现,是粗排环节成为了瓶颈——它过于保守,过滤掉了很多精排模型会打高分的“差异化”商品。当我们采用知识蒸馏技术,让粗排模型学习精排的排序模式后,虽然粗排自身的AUC只提升了0.2%,但整个链路的线上GMV却提升了1.5%。这个案例深刻说明,推荐系统的效能瓶颈往往不在单个模块的精度,而在于模块间协同的流畅度。盯着一个环节猛攻,不如审视整个链条的衔接与平衡。
3913



被折叠的 条评论
为什么被折叠?



