来自推特的软件工程师 Gary Lam 在 2017 London QCon 上谈论了个性化推送功能。他总体概览了推特的个性化及推荐算法,并解释了这些算法是如何在推特的大数据量及二元特征下进行大规模运行的。
个性化分列(personalized fanout)是指只将推送发给感兴趣的用户。Lam 给出的例子是埃隆马斯克所发表的关于电动汽车的推文。不是他所有的粉丝都收到了该推送通知,而只有那些对电动汽车感兴趣的粉丝才会收到。
Lam 解释到,个性化分列算法是通过跟踪两个指标来实现的:
1. 最近参与的对象:这是指用户对特定对象,如话题或用户,进行的点赞、回复及其他用户交互操作。Lam 强调这些数据需要保证实时性,因为用户往往只会对他们最近互动过的内容感兴趣。
2. 首要关注:虽然一个用户可能关注数百名其他用户,但其中只有某几个是其首要关注的,这些用户发送的内容才是其最感兴趣的。
当使用这个算法时,首先要做的是从推文中提炼出各个对象。然后,对每位关注者,查看最近是否有与该对象产生过互动,再检查该推文是否来自于其首要关注的对象。如果同时满足这两个条件,该用户就会收到这条通知,因为从中可以推测该用户对这条推文感兴趣。
Lam 解释到,该个性化分列算法的主要问题是其不对称性。如果一个用户被数以百万用户所关注,那么每当他们发布一条推文,这个算法就必须对每个关注者进行计算。而另一方面,有的用户却可能只有几位关注者。
Lam 解释了他们是如何利用数据协同定位来解决这个问题的。用户群首先被进行了分片处理,他们最近的互动以及首要关注会被和分片保存在一起。这就意味着在算法运行时,不会有网络访问发生,这大大减少了延迟。
Lam 指出,鉴于最近互动的数据本身是有时效性的,计算出的数据并不需要保存很久,所以可以将它们保存在内存中。
在数据分片时,数据的重建被尽早地大幅优化,以确保用户可以收到他们的通知。这是通过在队列中重放前一天所有的推文来进行的,然后将消息打包并删除冗余数据,再将它们传入到分片中。这个过程被称为“涓涓细流(slim firehose)”。
同时通过用户之间的历史交互,利用离线机器学习算法计算出首要的关注目标。由于这些是预先计算好的,它们可以在启动时被复制到分片所在的硬盘上,并在需要的时候进行延迟加载。
Lam 也谈到了推荐算法。这与个性化分列算法略有不同。在这种情况下,用户不需要是数据来源的关注者,只要他们对内容存在潜在的兴趣。
在这种情况下,每个用户都会被循环到,而不只是事件数据中的部分用户。Lam 解释说,这样可以更方便地利用资源,因为可以方便地预测用户的数量,从而执行加载操作。此过程会触发以下几个步骤:
1. 过滤:如果用户对该通知不感兴趣或没有与通知进行过交互,就不会再向该用户进行推送。
2. 候选来源:潜在用户账号被传送以便进行通知。其中使用到两个技术, GraphJet ,推特的实时图处理库,和 Scalding ,推特的离线 map-reduce 算法。
3. 排名:利用机器学习来为用户挑选最佳通知。
4. 推送:将通知推送到用户的设备上。
演讲的详细资料可以在线获得。其中还包含了Saurabh Pathak 关于实时发送通知的演讲,这在另一篇文章中做了总结。
评论