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

发布时间:2026/8/17 15:07:59
工业级推荐系统排序架构:粗排与精排的协同设计与工程实践 1. 从一次线上事故说起为什么我们需要“粗排”和“精排”去年我们团队经历了一次不大不小的线上事故。当时广告主反馈某个核心品类的广告消耗突然暴跌但后台数据显示广告的点击率CTR和转化率CVR模型预估一切正常。排查了半天最后定位到一个让人哭笑不得的问题我们的“精排”模型也就是最终决定哪个广告展示给用户的那个最复杂的模型它“太努力”了。事情是这样的。为了追求极致的预估准确性精排模型引入了大量精细的特征包括用户过去72小时在这个品类下的行为序列、广告素材的视觉特征向量、甚至是一些实时上下文信息。模型复杂度上去了预估精度也确实高了几个千分点。但问题随之而来模型的计算开销变得极其庞大。在流量高峰时段系统为了给每一个可能的候选广告都跑一遍这个“庞然大物”整体延迟飙升触发了系统的保护机制——自动降级。降级策略是直接按出价高低来排序结果就是一批出价高但实际转化潜力一般的广告霸占了流量而那些出价中等、但模型预估转化率极高的“潜力股”广告因为计算不过来根本没机会进入最终排序导致整体大盘的投放效率如GMV反而下降了。这次事故给我们上了生动的一课在广告、搜索、推荐这类需要从海量候选动辄成千上万甚至百万级中筛选出极少数几十个展示给用户的系统里“把所有候选都用一个最复杂的模型评估一遍”在工程上和效率上都是不可行的。这就像你要从全国海选10个最优秀的运动员参加奥运会你不会让全国所有报名的人都来北京参加全套体检、心理测试和专项考核那成本和时间都无法承受。更合理的做法是先让各地市进行初选粗排筛选出几百名有潜力的苗子再把这些苗子集中到省队进行更专业的评估精排最终确定国家队名单。“粗排”和“精排”正是为了解决这个“效率与精度”的矛盾而诞生的、在工业级系统中最核心的两级排序模块。今天我就结合自己趟过的坑来详细拆解一下这两个模块到底在干什么、怎么干、以及它们之间那些微妙的配合关系。2. 精排追求极致的“狙击手”它的核心任务与挑战精排全称精细排序是决定最终展示顺序的“临门一脚”。你可以把它想象成奥运决赛的裁判或者公司最终轮的面试官。它的核心任务非常明确对经过前面环节召回、粗排筛选后的少量候选通常是几十到几百个进行极其精准的效用预估并按照预估分数进行严格排序得分最高的Top N比如1个或10个最终胜出展示给用户。2.1 精排模型的“武器库”特征、样本与结构精排模型之所以“精”体现在三个方面第一特征维度极尽丰富与实时。这是精排与粗排最显著的区别之一。精排模型的特征可以包括用户侧特征不仅仅是基础画像年龄、性别、地域更重要的是深度兴趣标签、长期和短期的行为序列例如用户最近点击了哪些商品、搜索了哪些关键词、实时意图当前搜索词、正在浏览的页面内容。广告/物品侧特征广告主信息、广告创意本身的文本和多媒体特征通过NLP、CV模型提取的向量、历史统计指标过去一段时间的CTR、CVR。上下文特征当前时间、星期几、用户设备、网络环境、所在页面位置等。交叉特征通过模型自动学习或人工设计的能够刻画用户与广告特定组合关系的特征例如“年轻女性用户”与“某品牌口红广告”的组合特征。第二样本构建更加“纯净”与“精准”。精排模型的训练样本通常只来自精排层曝光的数据。为什么因为召回和粗排环节已经过滤掉了大量明显不相关的候选到达精排层的候选集合已经是相对高质量的。用这个层面的曝光和反馈点击、转化数据来训练模型能让模型更专注于学习“高手过招”时的细微差别。样本的实时性要求也极高往往需要近实时的数据流如Flink进行更新以捕捉最新的用户兴趣变化。第三模型结构复杂而先进。精排模型是算法工程师的“主战场”各类前沿的深度学习模型在这里轮番上阵。从早期的WideDeep、DeepFM到后来的DINDeep 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实验观察在保证延迟的前提下新模型对核心业务指标如点击率、转化率、平台收入的提升。对于粗排离线评估更为复杂自身准确性在粗排自己的候选集上计算AUC等指标。精排一致性如前所述计算粗排Top K与精排全量打分Top K的重合度RecallK。效率指标单次推理耗时、CPU/内存消耗。最终的审判永远是线上实验。我们会设计这样的实验组对照组全流量使用现有的粗排精排流水线。实验组则只改变其中一个模块例如升级了粗排模型或调整了精排特征。通过严格的A/B测试观察实验组相比对照组在全链路核心业务指标上是否有显著正向收益。只有能带来整体提升的迭代才是有价值的迭代。在我经历的那次事故后我们调整了迭代策略任何精排模型上线前必须通过压力测试明确其在不同流量压力下的延迟曲线和资源消耗任何粗排模型的迭代必须同步评估其对精排入口流量质量的影响。这让我们意识到构建一个高效的广告排序系统不仅仅是算法模型的比拼更是系统设计、工程实现和业务理解三者深度融合的艺术。粗排与精排一快一准一守一攻它们的精妙配合共同支撑起了每天百亿千亿次展示背后的智能决策。