[控场AI]
· 11 分钟阅读· 5,724 字

生产环境中的10大排序算法:从规则到Learning-to-Rank

生产环境中的10大排序算法:从规则到Learning-to-Rank

生产级排序系统不靠单一算法,而是用多阶段级联组合规则、统计与学习模型。

文章系统梳理了十类排序算法——从基于规则、加权线性评分、流行度、BM25、基于内容、协同过滤、矩阵分解,到梯度提升树、深度神经网络和 Learning-to-Rank,并指出真正的问题不是哪种算法最好,而是哪种架构匹配你的数据量、延迟预算、产品成熟度与目标。核心观点是:生产排序系统通常是多阶段级联,廉价模型或启发式规则先对候选集粗筛,昂贵模型只在最强候选上运行。LinkedIn 的第一轮/第二轮/重排序三层结构和 Vespa 的分阶段排序都印证了这一点。文章还强调规则只适合硬约束、LTR 需警惕位置偏差、成熟系统会组合多种算法。

大多数排序系统的起点并不是机器学习,而是一个手写的评分公式。

score = freshness + popularity

然后产品开始增长:用户行为变了,库存扩大了,冷启动问题出现了,业务规则不断堆积,个性化变得重要,商业化也挤进了同一个界面。最终,单一的手调评分不再够用。

**核心结论:**生产级排序系统通常组合多种方法,而不是依赖单一算法。一个廉价的模型或启发式规则先对候选集进行粗筛和打分,再由更昂贵的模型或重排序逻辑优化最终顺序。

排序算法生产环境应用

Google 公开的 YouTube 架构将候选生成与专门的深度排序模型分离;LinkedIn 采用第一轮排序器输出给第二轮排序器、再经过重排序层的结构;Vespa 明确支持第一阶段、第二阶段和全局排序,让昂贵模型只运行在最强候选集上。这个区分对于设计信息流、市场、推荐系统、招聘板、约会应用或发现类产品的团队至关重要。

排序算法速览

方法最适合场景个性化程度复杂度
基于规则策略与简单产品低低
加权线性评分早期生产排序中低
流行度与趋势冷启动与发现低低
BM25搜索相关性低低
基于内容交互数据稀疏中中
协同过滤行为推荐高中
矩阵分解用户-物品亲和力高中
梯度提升树结构化排序特征高中
深度神经网络排序大规模复杂数据高高
Learning-to-Rank优化有序结果高高

真正有用的问题不是哪种算法"最好",而是哪种排序架构匹配你的数据、延迟预算、产品成熟度和目标。

1. 基于规则的排序

基于规则的排序是最简单的生产方法,例如:最新优先、排除不可用库存、提升认证卖家、限制同一创作者的帖子数量、优先用户地理范围内的物品。

规则是确定性的且易于解释,这使它们即使在高阶 ML 系统中也极其适合处理硬约束。错误在于用规则做所有事情。随着需求增加,团队往往积累出几十个相互纠缠的条件:

if premium_user && recent_item && category_match && seller_score > X...

最终没人能自信预测改变一个权重会对整个系统产生什么影响。规则最适合资格判定、安全、合规和不可协商的产品约束;当问题变成"哪个合格物品对此用户最有价值"时,学习系统更合适。

2. 加权线性评分

加权评分通常是创业公司构建的第一个真正的排序引擎:

score = 0.40 * relevance + 0.25 * freshness + 0.20 * popularity + 0.15 * quality

与单一排序字段不同,它组合多个信号,同时保持快速和可解释。Vespa 的文档展示了将 BM25 相关性与流行度结合的排序表达式,并支持文档、查询和计算排序特征的任意数学组合。

加权评分在信号数量可控、工程师理解相对重要性、训练数据有限、可解释性重要、延迟需要保持可预测时效果尤其好。弱点在于手动校准——随着产品演进,必须有人决定新鲜度应该是 0.25 还是 0.31。

3. 流行度与趋势排序

流行度排序使用浏览量、点击、购买、收藏或互动等聚合行为对物品排序。它简单但极其有用。Amazon Personalize 甚至将 Popular Items 配方与个性化推荐和排序配方并列提供。

流行度在冷启动时尤其有价值。如果对新用户几乎一无所知,"相似访客中当前流行什么"可能是比随机排序好得多的回退方案。

趋势排序加入时间组件,不是统计生命周期互动,而是测量近期参与度与预期参与度的比值,或应用指数衰减让昨天的活动比上个月更重要。主要风险是反馈循环:高排名物品获得更多曝光,产生更多互动,从而排名更高。因此生产系统很少单独使用流行度。

4. BM25 与词汇相关性

对于搜索界面,BM25 仍是重要基线。它主要基于词频、文档长度和匹配词在语料库中的稀有程度来评分文档与查询的匹配度。

BM25 不像信息流排序器那样个性化,但作为候选排序工具仍然有用,因为它便宜、可解释、对精确文本相关性很强、大规模成熟。现代系统通常将词汇排序与其他信号结合,而非取代它。Vespa 演示了第一阶段排序将 bm25(title) 与新鲜度结合,然后在后续排序阶段应用更昂贵的 XGBoost 模型——这是生产排序的典型样貌:多个模型在不同阶段做不同工作。

什么是「词汇相关性」?

「词汇相关性」(lexical relevance)指的是仅依据字面词语的匹配程度来判断文档与查询的相关性,而不理解语义。BM25 是这一范式的代表:它统计查询词在文档中出现的频次(TF)、文档的长度(长文档需做归一化惩罚),以及该词在整个语料库中的稀有程度(IDF,越罕见的词权重越高)。

与之相对的是「语义相关性」,即通过嵌入向量判断「查询」与「文档」在含义上是否接近,即使没有任何共同词。例如搜索「便宜的笔记本」时,一篇只写「廉价轻薄本推荐」的文章在词汇层面完全不匹配,但语义上高度相关。

生产系统通常两者并用:词汇检索负责精确匹配(型号、人名、专有名词),语义检索负责召回同义表达。这也解释了为什么 BM25 至今未被淘汰——它在精确匹配上的可靠性仍是向量检索难以完全替代的。

5. 基于内容的排序

基于内容的系统比较用户偏好与物品属性。新闻应用中可能包括主题、作者、语言、嵌入或发布时间;市场平台包括类别、价格、品牌、卖家属性、产品嵌入;约会产品包括兴趣、资料特征、位置、声明偏好。

当交互数据稀疏时,基于内容的排序尤其有用。新物品可能零点击,但其内容仍能告诉你谁可能想要它。现代版本通常用学习嵌入替代手动选择的类别,让语义相似的物品在向量空间中彼此靠近。

6. 协同过滤

协同过滤从跨用户模式中学习,而非完全依赖物品属性。直觉很简单:过去行为相似的用户未来可能偏好相似的物品。

当平台拥有大量交互数据时,这可以很强大,因为系统能发现从未被显式编码的关系。弱点同样熟悉:冷启动。新用户行为历史少,新物品互动少。因此协同过滤通常与内容信号、流行度或其他回退策略结合,而非单独部署。

7. 矩阵分解

矩阵分解是估计用户-物品亲和力的经典方法。想象一个巨大的矩阵:行是用户,列是物品,单元格是交互——大部分单元格是空的。矩阵分解学习用户和物品的较小潜在表示,使系统即使在没有直接交互的地方也能估计偏好。

这些隐藏因子可能间接表示类型偏好、价格敏感度、风格或内容口味等概念。矩阵分解因能捕捉简单流行度排序遗漏的行为关系而在推荐系统中广为人知。它对现代实时产品的最大局限是上下文:用户 A 可能总体上偏好科技内容,但早上 8 点在手机上想要的可能不同于周六晚上在电视上想要的。

潜在因子与嵌入的关系

矩阵分解学到的「潜在表示」在今天的术语体系里就是嵌入(embedding)。假设用户和物品分别被映射到维度为 k 的向量空间(k 通常为几十到几百),则用户向量与物品向量的点积即为预测的偏好分数。

关键点在于:这些维度并没有被预先指定含义,模型只是被要求「让观测到的交互矩阵被低秩近似」。训练完成后,某些维度可能恰好与「科幻 vs 文艺」「高价 vs 平价」等可解释概念对齐,但这属于事后解释,并非约束。本质上,矩阵分解是把一个极度稀疏、巨大的交互矩阵压缩成两个稠密小矩阵,从而对未观测的单元格做出估计。

这也解释了它的局限:它只建模「用户—物品」二维关系,无法原生纳入时间、设备、会话等上下文,因此需要矩阵分解的上下文扩展版本或与特征模型(如 GBDT)结合使用。

8. 梯度提升决策树

梯度提升树,包括 XGBoost 和 LightGBM 风格的模型,仍是高度实用的排序工具。当拥有历史 CTR、创作者质量、价格、新鲜度、用户-物品亲和力、查询相关性、库存信息、会话特征等结构化特征时,它们表现尤佳。

其吸引力在于能建模非线性交互,而无需大型神经网络的 serving 复杂性。Vespa 在排序管道中直接支持 XGBoost 和 LightGBM,包括使用廉价的第一阶段评分器,仅在最强候选上运行提升模型。这种级联很重要:在 100 个候选上运行最昂贵模型,与在 100000 个候选上运行完全不同。

9. 深度神经网络排序

当用户、物品和上下文之间的关系过于复杂,无法手动设计交互特征时,深度排序模型变得有吸引力。Google 的 YouTube 论文描述了在全球最大推荐系统之一中用于候选生成和排序的独立深度神经网络模型。Pinterest 也记录了其 Homefeed 神经排序系统,消费用户、Pin 和上下文信号来预测用户行为,后来演变为多任务学习以建模多个参与目标。

深度模型能捕捉复杂行为关系,但代价真实:数据需求更大、调试更难、推理成本更高、训练基础设施更复杂、模型可观测性更难。神经排序器不会仅因更复杂就自动更好。

10. Learning-to-Rank

Learning-to-rank(LTR)专门为有序结果设计。它不是简单预测"用户会点击吗",而是学习候选之间应如何相对排序。三种广泛方法:

  • **Pointwise:**独立预测相关性分数
  • **Pairwise:**学习物品 A 是否应排在物品 B 之上
  • **Listwise:**优化整个列表的排序

最知名的方法之一是 LambdaMART,它结合 LambdaRank 与提升决策树。Microsoft 的工作将 LambdaMART 描述为成功的真实世界排序方法,而现代 XGBoost 为 NDCG、MAP 和成对排序实现了排序目标。

NDCG 尤其有用,因为它关心相关结果出现在哪里,而不仅仅是否出现——这比普通分类更匹配产品问题。一个主要警告:日志交互数据包含位置偏差。已经显示在顶部附近的结果仅仅因为用户先看到就获得更多点击。XGBoost 当前的 LTR 实现包含无偏 LambdaMART 选项,专门处理位置相关的点击数据。

NDCG 与位置偏差到底是什么?

NDCG(Normalized Discounted Cumulative Gain,归一化折损累计增益) 是排序任务的常用评价指标。它的核心思想有两点:一是不同相关度有不同增益(高度相关 > 部分相关 > 不相关);二是位置越靠后,增益被「折损」越多,通常按 1/log(2+位置) 衰减。最后除以理想排序下的得分做归一化,使其落在 0 到 1 之间。NDCG 关心的是「相关结果排在第几位」,而非仅仅「是否被召回」。

位置偏差(position bias) 指用户更容易点击排名靠前的结果,即使这些结果本身并不更相关。若直接用点击日志训练模型,模型会学到「排在前面的更容易被点击」,而非「更相关的更容易被点击」,形成自我强化的偏差。常见缓解手段包括:在训练时对靠后位置的点击赋予更高权重、引入随机曝光收集无偏数据、或使用无偏 LambdaMART 等专门方法。

生产排序系统通常组合多种算法

最大的误解是成熟团队最终会发现一个完美的排序器。实际上他们通常构建级联。LinkedIn 公开的信息流架构包括多个第一轮排序器、第二轮排序器和最终重排序层。Pinterest 在其 Homefeed 推荐漏斗中描述了检索、预排序、排序和重排序。

Spotify 最近在主页部署了基于上下文赌博机的校准,以动态平衡内容类型。在其报告的在线实验中,该方法相对于基线将整体曝光到播放效率提升了 3.93%,消费提升了 1.28%,主页活动提升了 1.54%。

最后一步很重要,因为生产排序器很少只优化相关性。它可能还需要平衡多样性、新鲜度、探索、创作者公平、市场供给、收入和长期满意度。一旦商业化进入信息流,最终排序可能还需要协调自然相关性与赞助库存。

你应该用哪种排序算法?

对于小产品,从比你想象更简单的方案开始。

  • **交互量低:**规则、流行度和内容信号
  • **增长中的信息流或市场:**加权评分加个性化特征
  • **强结构化行为数据:**梯度提升模型
  • **大规模推荐系统:**深度模型和多阶段排序
  • **有足够标注或交互数据直接优化排序:**Learning-to-Rank

架构与算法同样重要。一个廉价、可解释的第一阶段模型加上更强的重排序器,可能胜过试图在每一个可能候选上运行一个昂贵模型的架构。

如果排序不是你的核心基础设施优势,构建决策本身就值得质疑。托管的排序 API 可以让应用保留候选检索,同时将评分、排序、决策追踪以及最终变现放置转移到专门的决策层。

要点

排序系统通常分阶段演进。

规则告诉系统什么必须发生。

加权分数组合已知信号。

协同和基于内容的方法实现个性化。

提升和神经模型学习日益复杂的关系。

Learning-to-Rank 最终优化排序本身。

重要的工程决策不是你的技术栈是否包含最复杂的算法,而是排序系统能否在你的延迟预算内产生更好的决策,并具备足够的控制和可观测性以安全运行在生产环境中。

#排序算法#Learning-to-Rank#推荐系统#信息流排序#BM25#梯度提升树#多阶段排序
分享:

相关推荐