早期的Feed流主要是把用户关注的内容以Timeline的形式展开。但是随着用户场景的丰富,Feed流也有了更多的变种。本篇文章主要讨论如何设计一个Feed流,以及Feed流背后的设计逻辑。
一个Feed流永远是在解决两个核心问题:
排序
Timeline
Timeline,一般而言,不对用户主动要求获取的内容进行筛选,同时所有的内容按照时间排序。最经典的案例就是朋友圈。关于Feed流设计的两个核心问题,微信朋友圈的回答是这样的:
应该展示给用户什么内容:用户好友发的内容
这些内容该怎么排序:按照时间先后顺序
Timeline简单的内容选取和排序非常易于用户理解,充满了极简主义的哲学:随时更新,吸引用户随时打开使用,而每次更新的部分都有限也保证了大部分用户不会错过任何消息。微信也用这个设计,获取了用户大量的时间。
既然Timeline有这么多优点,那么Feed流为什么还会迭代衍生出来其他的设计?
其实这里也牵扯到一个问题,Timeline有一个致命的缺点——内容呈现效率最为低下。需要内容提供方非常克制,同时也需要用户对这些内容足够关注。
微信朋友圈的内容是用户自己的个人展示,注定不会大量更新;同时选择都是基于熟人关系,能引起用户足够的关注。正是这两个原因,保证了朋友圈内容虽然效率低下,但是还是极具吸引力。如果动辄每天上千条陌生人更新的内容,使用Timeline的形式呈现出来,想见一下,这是一个多么缺乏思考的设计。
重力排序算法——兼顾热度和更新时间
如果每天有更新量很大的Feed流,同时大部分内容没有太大用户价值,这种情况下我们该怎么排序?这个场景其实也很常见,也是一些PM在实际工作中遇到的棘手问题。答案就是重力排序算法。
重力排序算法中,对于一个在Feed流中的内容而言,有两种力量:重力和拉力。重力是持续让内容往下掉的力,这个重力就是时间,因为新的内容会把老的内容刷下去;同时拉力则是让内容排序往前的力,比如知乎的赞,贴吧的回复。
这样的排序算法实现方式有很多,这里可以简单介绍一种,也是来自Reddit的核心排序算法:
score\left( H,T \right) =logH+ \frac{T-T_{0} }{A}
其中:
H表示能代表内容热度的值:比如说收到的赞,比如说浏览量,也可以是综合类似的指标,加权求和得到的值。
T代表内容发布的时间,T{0} 代表一个时间的起始值,只要比最早发布的内容早就行了(比如用公司创立时间)。T-T{0} 用来衡量一个内容的新旧程度,单位为秒,T-T_{0} 越大,则代表内容越新。
A也是设立的参数,A越大,T-T_{0} 的影响力越小,则内容更新的越慢。一般而言初始值可以用36000,10个小时的秒数,后续不断迭代。
关于Feed流设计的两个核心问题,重力排序算法的回答是这样的:
应该展示给用户什么内容:用户表现出喜好的内容都推给用户,虽然用户不一定看得见后面的。
这些内容该怎么排序:按照时间衰减因素和内容受欢迎程度综合排序。
智能排序——双刃剑
Facebook使用智能排序之后据称效果拔群,于是我们看到越来越多的社交网络放弃使用Timeline排序,转入智能排序的阵营,国外的Twitter,国内的微博和知乎。
智能排序牵扯到复杂的模型构建和机器学习,这里只阐述下简单的原理。
首先,系统需要知道什么是一个内容被展示的目标值。比如微博,一个内容被展示的目标值是转发,评论,点赞的次数。那么通过大量的样本的机器学习,系统对于什么是好的内容会有一个预测。这个对于一个内容的预测,则是的智能排序的基础。
接下来,系统会屏蔽掉一些违规的内容,比如Facebook处罚标题党,知乎处罚抱团点赞。
其次,为了用户内容的质量,系统会在用户的Feed中增加一些热门的内容。
最后,考虑内容和用户的亲密度、系统认为内容受欢迎的程度、内容时间衰减性等因素后,系统进行综合排序。
听起来智能排序是一个很好的主意。但是,智能排序也是一把双刃剑。
算法质量的高要求,导致一些技术比较差的公司,使用智能排序效果不佳。另一方面,因为智能排序的不透明性和扩展性,过度的商业化更是成为了用户体验的头号凶手。
有的内容因为用户买了粉丝头条而可以排在Feed流前面,有的内容只要有足够的推广费,可以绕过关注关系,呈现在用户面前。智能排序如果被过度商业化,那么Feed流的用户体验也会越来越差。