news 2026/8/17 15:07:45

工业级推荐系统排序架构:粗排与精排的协同设计与工程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工业级推荐系统排序架构:粗排与精排的协同设计与工程实践

1. 从一次线上事故说起:为什么我们需要“粗排”和“精排”?

去年我们团队经历了一次不大不小的线上事故。当时,广告主反馈某个核心品类的广告消耗突然暴跌,但后台数据显示广告的点击率(CTR)和转化率(CVR)模型预估一切正常。排查了半天,最后定位到一个让人哭笑不得的问题:我们的“精排”模型,也就是最终决定哪个广告展示给用户的那个最复杂的模型,它“太努力”了。

事情是这样的。为了追求极致的预估准确性,精排模型引入了大量精细的特征,包括用户过去72小时在这个品类下的行为序列、广告素材的视觉特征向量、甚至是一些实时上下文信息。模型复杂度上去了,预估精度也确实高了几个千分点。但问题随之而来:模型的计算开销变得极其庞大。在流量高峰时段,系统为了给每一个可能的候选广告都跑一遍这个“庞然大物”,整体延迟飙升,触发了系统的保护机制——自动降级。降级策略是直接按出价高低来排序,结果就是一批出价高但实际转化潜力一般的广告霸占了流量,而那些出价中等、但模型预估转化率极高的“潜力股”广告,因为计算不过来,根本没机会进入最终排序,导致整体大盘的投放效率(如GMV)反而下降了。

这次事故给我们上了生动的一课:在广告、搜索、推荐这类需要从海量候选(动辄成千上万甚至百万级)中筛选出极少数(几十个)展示给用户的系统里,“把所有候选都用一个最复杂的模型评估一遍”在工程上和效率上都是不可行的。这就像你要从全国海选10个最优秀的运动员参加奥运会,你不会让全国所有报名的人都来北京参加全套体检、心理测试和专项考核,那成本和时间都无法承受。更合理的做法是:先让各地市进行初选(粗排),筛选出几百名有潜力的苗子;再把这些苗子集中到省队进行更专业的评估(精排),最终确定国家队名单。

“粗排”和“精排”,正是为了解决这个“效率与精度”的矛盾而诞生的、在工业级系统中最核心的两级排序模块。今天,我就结合自己趟过的坑,来详细拆解一下这两个模块到底在干什么、怎么干、以及它们之间那些微妙的配合关系。

2. 精排:追求极致的“狙击手”,它的核心任务与挑战

精排,全称精细排序,是决定最终展示顺序的“临门一脚”。你可以把它想象成奥运决赛的裁判,或者公司最终轮的面试官。它的核心任务非常明确:对经过前面环节(召回、粗排)筛选后的少量候选(通常是几十到几百个)进行极其精准的效用预估,并按照预估分数进行严格排序,得分最高的Top N(比如1个或10个)最终胜出,展示给用户。

2.1 精排模型的“武器库”:特征、样本与结构

精排模型之所以“精”,体现在三个方面:

第一,特征维度极尽丰富与实时。这是精排与粗排最显著的区别之一。精排模型的特征可以包括:

  • 用户侧特征:不仅仅是基础画像(年龄、性别、地域),更重要的是深度兴趣标签、长期和短期的行为序列(例如,用户最近点击了哪些商品、搜索了哪些关键词)、实时意图(当前搜索词、正在浏览的页面内容)。
  • 广告/物品侧特征:广告主信息、广告创意本身的文本和多媒体特征(通过NLP、CV模型提取的向量)、历史统计指标(过去一段时间的CTR、CVR)。
  • 上下文特征:当前时间、星期几、用户设备、网络环境、所在页面位置等。
  • 交叉特征:通过模型自动学习或人工设计的,能够刻画用户与广告特定组合关系的特征,例如“年轻女性用户”与“某品牌口红广告”的组合特征。

第二,样本构建更加“纯净”与“精准”。精排模型的训练样本通常只来自精排层曝光的数据。为什么?因为召回和粗排环节已经过滤掉了大量明显不相关的候选,到达精排层的候选集合已经是相对高质量的。用这个层面的曝光和反馈(点击、转化)数据来训练模型,能让模型更专注于学习“高手过招”时的细微差别。样本的实时性要求也极高,往往需要近实时的数据流(如Flink)进行更新,以捕捉最新的用户兴趣变化。

第三,模型结构复杂而先进。精排模型是算法工程师的“主战场”,各类前沿的深度学习模型在这里轮番上阵。从早期的Wide&Deep、DeepFM,到后来的DIN(Deep Interest Network)系列、Transformer-based的模型(如BST),再到如今结合多任务学习(MTL)同时优化点击率、转化率、停留时长等多个目标的模型。这些复杂结构的核心目的,就是为了更好地建模用户兴趣的动态性、以及特征间复杂的高阶非线性关系。

2.2 精排的“阿喀琉斯之踵”:延迟与开销

然而,能力越大,责任(和负担)也越大。精排模型面临的最大挑战就是计算延迟和资源消耗

一个复杂的深度模型,对几百个候选进行逐一推理,所需的计算量是惊人的。这直接导致了我在开头提到的事故:延迟过高,系统吞吐量下降。为了解决这个问题,除了在硬件上投入(使用GPU/专用AI芯片),在工程和算法上也有诸多优化:

  • 模型压缩与蒸馏:将庞大复杂的“教师模型”的知识,迁移到一个更小、更快的“学生模型”中,用于线上推理。
  • 特征工程优化:并非特征越多越好,需要持续进行特征重要性分析,剔除贡献度低的特征,减少计算和传输开销。
  • 缓存策略:对于某些变化不频繁的特征(如用户长期兴趣)或计算结果进行多级缓存,避免重复计算。

注意:精排模型的优化是一个永无止境的过程。一个常见的误区是盲目追求模型AUC(曲线下面积)指标的提升,而忽略了线上服务延迟。在实际工作中,我们经常需要在“模型精度提升0.1%”和“延迟降低5ms”之间做艰难的权衡。我的经验是,在精排阶段,将延迟稳定在一个可接受的阈值内,其优先级往往高于微小的精度提升,因为延迟影响的是整个系统的吞吐和稳定性。

3. 粗排:高效初筛的“守门员”,它的定位与演进

如果说精排是追求极致的狙击手,那么粗排就是负责高效初筛的守门员。它的核心任务不是做到绝对精准,而是快速、高效地从召回环节提供的成千上万个候选(例如1万)中,筛选出几百个最有可能被精排青睐的候选,送给精排做最终裁决。粗排的核心价值在于“性价比”:用相对较小的计算成本,过滤掉绝大部分“炮灰”,保证精排的资源只用在“刀刃”上。

3.1 粗排的经典实现:双塔模型与它的局限性

长期以来,粗排的标配架构是双塔模型。顾名思义,模型分为两个“塔”:一个用户塔,一个广告(物品)塔。两个塔分别对用户特征和广告特征进行编码,输出一个固定长度的向量(即embedding)。线上服务时,用户的向量可以预先计算好并缓存,当请求到来时,只需要实时计算所有候选广告的向量,然后通过简单的向量内积(或余弦相似度)计算用户与每个广告的匹配分数,再进行排序。

双塔模型的优势非常突出:

  • 极致的性能:用户向量预计算,线上只需做简单的点积运算,速度极快,毫秒级响应上万候选。
  • 服务化友好:广告塔可以预先计算好所有广告的向量并建立索引,实现高效的向量检索。

但它的劣势也同样明显:

  • 特征交互不足:这是最大的硬伤。用户和广告的特征在塔内各自编码,只在最后的点积处发生交互,无法建模复杂的非线性交叉特征(比如“一线城市白领”与“奢侈品广告”这种组合关系)。这严重限制了其预估精度。
  • 表达能力有限:点积运算是一种相对简单的相关性度量,难以拟合精排复杂模型所刻画的精细决策边界。

3.2 粗排的进化:从“快而糙”到“快而准”

随着业务对效率要求的不断提升,粗排不能再满足于当一个简单的“过滤器”,它需要承担更多的责任,更接近精排的决策。因此,粗排模型也在持续演进:

1. 轻量级精排模型:直接使用一个结构简化、特征裁剪后的精排模型作为粗排模型。例如,减少网络层数、使用更少的特征、尤其是去掉那些计算开销大的实时序列特征。这样既能保持一定的精度,又能控制延迟。

2. 蒸馏与模仿学习:这是目前非常主流且有效的方向。核心思想是让粗排模型去“模仿”精排模型的行为。具体做法是,用精排模型对海量样本(可以是曝光样本,也可以是随机采样的未曝光样本)进行打分,生成“软标签”(即概率分数),然后用这些软标签作为监督信号来训练粗排模型。这样,粗排模型就能学习到精排模型的“判断逻辑”,实现“形不似而神似”。我们团队通过这种方式,在粗排延迟基本不变的情况下,将输送给精排的候选集整体质量提升了约15%,间接提升了最终排序效果。

3. 序列感知的粗排:尝试在粗排中引入一些轻量级的用户行为序列信息,例如通过一个简单的Attention机制聚合用户最近的点击历史,生成一个动态的用户向量,再与广告向量交互。这比经典双塔的静态用户向量更能反映实时兴趣。

实操心得:粗排模型的选择和优化,必须紧密围绕“效率”这个核心。一个重要的评估指标是**“精排一致性”**。即,粗排筛选出的Top K候选,与假设用精排模型对这上万候选全部打分后选出的Top K候选,两者的重合度有多高。重合度越高,说明粗排的“守门”质量越好,精排的决策环境越优。我们通常会定期离线计算这个指标,作为粗排模型迭代的核心依据。

4. 粗排与精排的协同:系统层面的设计与权衡

粗排和精排不是两个独立的模块,而是一个协同工作的流水线。它们之间的配合,直接影响整个系统的最终效果和稳定性。

4.1 流量分配与级联影响

一个关键的设计点是粗排筛选的数量(即粗排截断值K)。K值设得太大,则粗排过滤效果差,精排压力大,延迟高;K值设得太小,则可能把一些“黑马”候选过早过滤掉,导致精排“巧妇难为无米之炊”,系统效果上限受限。

确定K值不是一个纯技术问题,而是一个业务与技术权衡的过程。需要通过A/B实验,在保证精排延迟和服务稳定性的前提下,测试不同的K值对最终业务指标(如总GMV、广告收入)的影响,找到一个最优的平衡点。

4.2 特征与样本的一致性“陷阱”

这是实践中一个非常隐蔽的坑,我称之为“特征穿越”或“样本偏差”。举个例子:精排模型使用了一个强特征——“广告近一小时的点击率”。这个特征在精排阶段是准确的。但是,如果你在粗排模型中也试图加入这个特征,就需要非常小心。

问题在于线上服务时,粗排先于精排执行。当粗排需要计算某个广告的“近一小时点击率”时,这个统计量可能还没有包含当前这次请求本身(如果这次请求最终被展示并产生了点击)。然而,在训练粗排模型时,我们使用的训练样本是历史曝光数据,样本中的“近一小时点击率”特征,是包含了那次曝光事件之后的数据的。这就造成了训练和线上服务时特征分布的差异,模型学到的规律会失真。

解决方案通常有两种:一是粗排避免使用这类存在“未来信息”的实时特征;二是进行严格的特征工程,确保训练时构造特征的时间戳与线上推理时完全对齐,这需要非常精细的数据流水线设计。

4.3 多目标排序的协同

现代广告系统往往要同时优化多个目标:点击率(CTR)、转化率(CVR)、停留时长、广告主ROI等。精排层通常采用多任务学习(MTL)模型来同时预估多个目标,然后通过一个公式(如pCTR * bid * pCVR)计算综合得分。

那么粗排该怎么办?粗排也需要进行多目标预估吗?一种实践是,粗排也训练一个轻量级的多任务模型,预估主要的目标(如pCTR和pCVR),但公式可以更简化。另一种更常见的做法是,粗排专注于优化一个与最终目标强相关的、且易于学习的核心代理目标。例如,如果最终排序公式是pCTR * bid * pCVR,而bid是广告主出的固定价,那么可以尝试让粗排模型直接学习pCTR * pCVR这个综合值(通过蒸馏从精排模型获得),从而简化粗排任务,提升效率。

5. 效果评估与迭代:如何衡量这两个“排”的功过?

如何评估粗排和精排做得好不好?不能只看单一模块的离线指标,必须结合线上业务效果进行系统化评估。

对于精排,核心离线指标是AUC、LogLoss等,衡量其预估准确性。但更重要的是线上A/B实验,观察在保证延迟的前提下,新模型对核心业务指标(如点击率、转化率、平台收入)的提升。

对于粗排,离线评估更为复杂:

  1. 自身准确性:在粗排自己的候选集上计算AUC等指标。
  2. 精排一致性:如前所述,计算粗排Top K与精排全量打分Top K的重合度(Recall@K)。
  3. 效率指标:单次推理耗时、CPU/内存消耗。

最终的审判永远是线上实验。我们会设计这样的实验组:对照组(全流量)使用现有的粗排+精排流水线。实验组则只改变其中一个模块(例如,升级了粗排模型,或调整了精排特征)。通过严格的A/B测试,观察实验组相比对照组,在全链路核心业务指标上是否有显著正向收益。只有能带来整体提升的迭代,才是有价值的迭代。

在我经历的那次事故后,我们调整了迭代策略:任何精排模型上线前,必须通过压力测试,明确其在不同流量压力下的延迟曲线和资源消耗;任何粗排模型的迭代,必须同步评估其对精排入口流量质量的影响。这让我们意识到,构建一个高效的广告排序系统,不仅仅是算法模型的比拼,更是系统设计、工程实现和业务理解三者深度融合的艺术。粗排与精排,一快一准,一守一攻,它们的精妙配合,共同支撑起了每天百亿千亿次展示背后的智能决策。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/17 15:06:42

Workfine表单设计入门:从零创建高效数据采集表单

1. 项目概述:从零到一,理解Workfine表单的核心价值 刚接触Workfine的朋友,第一反应往往是“这工具看起来挺强大,但第一步该从哪儿下手?”。我的建议是,别急着去研究复杂的流程、报表或权限,就从…

作者头像 李华
网站建设 2026/8/17 15:03:28

iPhone卡在恢复模式?从原理到实战的完整修复与数据保全指南

1. 问题现象与核心原因剖析当你心爱的iPhone屏幕上突然出现一个数据线指向iTunes的图标,并提示“连接iTunes”时,那种瞬间的慌乱感,我太懂了。这通常意味着你的设备在启动过程中遇到了严重的软件故障,系统无法正常加载&#xff0c…

作者头像 李华
网站建设 2026/8/17 15:02:01

OpenCore引导下macOS Monterey IP禁用全解析与实战

1. 项目概述:当SIP在OpenCore引导的Mac上“锁死”时 如果你正在使用OpenCore引导器(OC)来驱动一台老款Mac,或者是在非苹果认证的硬件上运行macOS Monterey 12.5,那么“系统完整性保护”(SIP)很可…

作者头像 李华
网站建设 2026/8/17 15:01:02

uni-app项目创建方式深度对比:CLI与HBuilderX如何选择

1. 项目缘起:一个看似简单却暗藏玄机的选择 最近在社区里,看到不少刚接触 uni-app 的朋友在问同一个问题:“我到底该用 cli 命令行创建项目,还是直接用 HBuilderX 的图形界面来创建?” 这个问题看似基础,…

作者头像 李华
网站建设 2026/8/17 15:00:28

现代Web开发图标方案:无需下载源码的三种主流技术实践

1. 项目概述:告别下载,拥抱现代图标方案 在网页开发中,图标是提升用户体验和界面美观度的关键元素。过去,我们常常需要从图标网站下载一整套字体文件或SVG源码,然后手动引入项目,这个过程不仅繁琐&#xff…

作者头像 李华
网站建设 2026/8/17 14:59:06

大语言模型预训练对齐新范式:从Token Zero开始的合成角色预训练

这次我们来看一个名为“Synthetic Persona Pretraining: Alignment from Token Zero”的研究项目。它不是一个可以直接下载运行的软件包或模型,而是一项关于大语言模型(LLM)预训练对齐的前沿研究。简单来说,这项研究探讨的核心问题…

作者头像 李华