分享嘉宾:羲农、里熙 @ 阿里飞猪

编辑整理:刘金鑫

出品平台:DataFunTalk、AI启蒙者

导读: 在飞猪推荐场景中,除了对单一商品的推荐外,还包括对以主题形式组织的商品集合的推荐。飞猪旅行主题是一款兼具个性化和发现性心智的产品,在信息流中不但承担着精确匹配用户需求的作用,还扮演着挖掘用户潜在需求、提升用户体感的角色。本次分享介绍飞猪在商品集合推荐的算法应用。

相比于feeds场景的自然下滑无感推荐模式,交互式推荐通过”提问-反馈”的显式交互模式,一方面可以增加用户在App使用中的参与感,另一方面也有助于系统更实时地捕获到用户即时偏好,从而进一步提升推荐效果。我们在飞猪App瀑布流场景中,基于端智能推荐框架,也进行了一些交互式推荐的实践。

今天要分享的主题包括两个子主题,一个是交互式推荐的应用实践,另外一个是旅行主题场景里的深度学习算法的实践。

01飞猪场景交互式推荐背景介绍

交互式推荐的概念最早在2018年Youtube的一篇论文《Q&R: A Two-Stage Approach toward Interactive Recommendation》中提出来,它是一种采用和QA系统类似的推荐方式,系统针对不同的用户生成问题来探测(询问)用户偏好,然后根据用户的行为反馈(比如点击或选择项)进行视频推荐,循环往复。

在飞猪App推荐瀑布流场景中,这种显式地反馈交互也提供了一种实时捕获用户意图的方式。

上图是飞猪首页瀑布流场景中交互式推荐的示意,例如用户A点击了“丽江自由行“商品,点击位置下方会推荐出包含“丽江”目的地攻略聚合卡片;用户B点击了”重庆4天3晚自由行”,点击位置附近会推荐重庆酒店和玩乐项目相关的query聚合卡片进一步探索用户兴趣;用户C点击了阿坝自由行,下方可能会推荐出包含该商品的榜单供用户参考。

飞猪app作为一种偏工具化的产品,用户的行为是比较稀疏的,大多数用户只有在有出行需求的情况下,才会来到我们的app,用户购买交通类的商品(机票/火车票)比较多,度假玩乐商品相对较少,而飞猪瀑布流主要是以度假玩乐商品的推荐为主,稀疏的行为数据通常不太能准确地学习到用户意图。例如用户的前一次访问可能是半年前,我们基于这种稀疏久远的历史记录来刻画用户当前的意图,可能是不够准确的。在当前的这种双列的分页批量推荐的瀑布流场景下,用户在当前瀑布流产生点击行为之后,如果我们不能及时地捕获到用户的实时意图并进行相应的承接,用户很可能在浏览了第一页后就流失掉,这也是我们需要解决的问题。交互式推荐可以通过实时的操作方式去承接用户需求,另外也可以将用户的意图通过query的方式去进行探索和细化。

02 交互式推荐VS瀑布流常规推荐

对于常规Top-N推荐来说的话,一般我们是会基于用户的各种维度的行为数据进行意图建模。在实际环境中,客户端用户产生点击行为,通过常规的日志链路(通常是批量上报)进行数据上报,通过日志服务器采集下来,然后给到服务端计算用户偏好,这里的链路的耗时通常是分钟级的。在实际场景下用户在往下滑的过程中,例如从第一页下滑到第二页,第二页的推荐结果返回到客户端时,可能第一页的行为还没有同步到用户偏好计算模块,这里就存在实时的兴趣偏好捕捉不到的情况。

而在实时交互式推荐中,我们会将用户点击数据通过一个高速通路的方式传给服务器,包括可以通过参数的方式直接传给服务器,行为数据随请求实时传回用户偏好模块进行计算。整个来讲,对比瀑布流推荐Top-N的全局最优的方式来说,这是一种轻量级的局部最优的推荐。另外,相对来说这是一种主动的对话式推荐,可以显示告诉用户我们推荐瀑布流的内容,给用户一种比较好的互动性体验。

03 用户需求分类及承接

交互式推荐场景下,我们对各种基础物料(比如度假商品/酒店/景点/目的地/query词等)进行重新组织,用以承接处于不同旅行状态周期的用户的需求。

① 决策期用户:兴趣比较集中,用户知道自己要找什么商品,这类用户一般是会选择一些相似的商品进行比价。对于这种场景,比如用户点击了一个酒店套餐,会给他推荐同目的地下的酒店套餐。点击酒店之后会给他推荐同地域同级别的类似酒店等。

② 冲刺期用户:对于冲刺期用户来说,已经有相关的订单或者一些很明确的交通信息。这种情况下,如用户买了自由行商品之后,去到目的地后可能会需要一些门票,一些需要逛的景点;或者他并没有买机票,那我们可能就会给他推荐特价票务信息等。

③ 种草期用户:这里旨在探索用户需求,通过返回一些关键词,包括类目、目的地、主题这种卡片形式让用户去选择,从而判断确定用户的需求是什么。

04 用户实时兴趣捕捉和细化

这里通过图示的方式展现交互式推荐如何实时更新用户偏好。T-1时刻用户有一些长短期行为计算得到的偏好目的地、类目、主题、玩法等维度用户画像数据。然后,我们会给他推荐一个目的地的探索卡片,比如包含成都/重庆/上海的卡片,因为这里是动画操作效果,大部分情况下用户是可以感知到这些实时插入瀑布流的卡片的存在的,如果用户对于卡片里的目的地都没有点击反馈,那么可以视作用户对这里的目的地是不感兴趣的,那么下一时刻,我们会把这些数据给融合进用户画像中,作为一个负反馈的数据放进去,如果用户在此前的画像偏好中是有成都的,那么可能会削减之前的权重。反之,如果有点击行为,则会强化对应trigger的权重。

1. 找相似召回

对于决策期用户来讲的话,用户实际上是更多地是一种找相似的需求,对应的召回主要是基于高相关召回的方式进行的。在前一期的分享里,我们有些环节也提到了CF和Swing,或者是基于Session based Swing的方式的召回方式,这种计算访问相关性的方式,可以保证商品的高相关性。在Session based这种相似计算的方式里面,我们增加一些限定条件,比如在找相似的情况下,实际上用户的需求大部分情况下是找同目的地的相关商品,我们会加上目的地的条件进行相关性约束,这种情况下基于协同过滤的召回结果里面,可以很好地避免目的地不一致这种badcase的存在,用户体验会好很多。

2. 搭配相关性召回

对于相关性召回来说,这里主要考虑搭配性召回。例如用户点击了自由行商品(通常部分或全部包含交通/酒店/玩乐等元素),我们推荐的酒店,机票,当地玩乐商品实际上是需要跟这个自由行去搭配的。对于搭配召回来说的话,目前也是基于用户的行为数据来计算搭配类目。比如给定自由行的trigger,然后在指定目的地相同的情况下,进行相关性的计算,得到不同类目下的相关性召回结果。

3. 探索性召回

在探索性召回方面,目前主要通过query和目的地卡片的方式进行推荐。其中query主要是来自于用户在飞猪的搜索栏等场景里输入的查询词。整体上来说,仅使用用户搜索query后进行点击的宝贝作关联获取的样本量是比较小的,对此,我们进行了一些扩充,将query2item2item这类二跳关联的商品query对加入候选,提高召回覆盖。

举个例子,湖州和千岛湖的自由行都是在江浙地区,我们计算出它们间有很高的相关性,如果用户之前有过湖州相关的行为,那么会给用户推荐千岛湖这样的query去探索其兴趣。同样地,还会基于人群用户偏好的方式产生一些query给用户以进行探索,比如在杭州很多人会去搜索迪斯尼这样的一个query关键词,假如这个用户是杭州人,那么我们也会把迪斯尼这样的一个搜索热词推荐给用户进行探索发现,目的地词的推荐也是类似的计算逻辑。

4. 推荐理由生成

交互形态上,除了前面介绍的多种形态的卡片外,我们还会在推荐的卡片上固定的坑位给用户显式地提示出推荐理由的,一般会如下几种方式生成:

1)基于用户行为,如浏览/加购/收藏等;

2)基于用户所属人群:同好人群相关信息;如“xxx海岛控也在逛”;

3)被点击商品所属的主题榜单排名等。

5. 交互卡片选择

如前所述,我们有丰富的卡片类型(9种)去满足不同用户的需求,在底层的物料选择上,我们会基于通用的Match/Rank模块得到各类基础物料的点击率top50,然后基于基础物料候选池,组装生成待推荐的卡片的候选池(部分卡片为聚合类卡片),在此基础上通过卡片选择模型预估ctr得到top1。这里主要是使用了一个三层的全连接网络,使用的主要特征如下:

  • 用户侧特征,User Profile特征,长期/短期目的地/类目/主题等偏好。
  • 实时Trigger特征,Trigger类型,类目、目的地、关联POI、tag等。
  • 卡片相关特征,Card类型,Card关联商品/酒店/POI;Card关联主目的地、类目等。飞猪的实时交互的方式对比自然瀑布流推荐是有明显的优势的,在有点击行为的session下,实时推荐卡片的坑位ctr明显高于自然瀑布流的坑位平均ctr。

05 旅行主题推荐介绍

接下来,给大家介绍一下旅行主题是如何在我们飞猪的信息流中进行个性化推荐的。

1. 背景介绍

主题是具有一定共性的度假商品组成的集合,是基于用户兴趣点为中心的一种更为复杂的商品组织形式,旅行主题在我们的信息流中不但承担着精确匹配用户需求的作用,还扮演着挖掘用户的潜在需求、提升用户体感的一个角色。比如,对于一个有交通类订单并且有明确度假意图的用户,我们可以给他推荐一些目的地玩乐的主题清单;对于没有任何行为或者度假意图不明确的用户,我们可以基于用户的LBS定位或者根据当前的时令节假日等维度给用户推荐一些当季的周边游主题,所以旅行主题在我们的飞猪信息流中是一款兼具个性化性质和发现性性质的产品。

主题入口通过个性化引流引导用户进入到主题承接页,主题承接页的样式是多种多样的,根据承接页的商品排序方式大致可以把旅行主题分为两类:一类是千人千面的主题清单,一类是千人一面的主题榜单。

2. 旅行主题推荐的特性

我们的主题有两个特性:

  • 所见即所得,即用户在主题入口看到的图片是用户进入承接页看到的第一个商品的图片
  • 商品和主题之间是多对多的关系,一个主题下面会有很多的商品,同时一个商品也会归属于多个主题

3. 旅行主题的组织方式

如上图所示,旅行主题的组织方式是多种多样的,以此来满足用户不同层次和粒度的需求,这些旅行主题是算法基于商品的标签和用户的行为自动聚合出来的,也有一些是运营同学人工整合的。

在飞猪的各个推荐场景中,我们几乎都可以看到旅行主题卡片的身影,最典型的两个场景:一个是双十一等大促场景中的榜单会场入口,另一个是飞猪首页猜你喜欢信息流中与其他商品或者酒店进行混排的卡片。无论是主题入口的个性化推荐还是主题承接页的排序、甚至到主题的生产都离不开算法的参与。接下来我们会着重介绍一下主题入口的个性化排序算法。

06 主题推荐算法

1. 主题推荐流程

主题推荐的流程和单个商品的类似,大致也是分为召回和排序两个阶段,在召回之后和排序之前,我们会加入很多人群属性和时空属性做一些规则性的过滤,比如:对于非亲子类的人群,我们会把亲子类主题过滤掉。最后的业务逻辑部分,我们会做一些简单的业务加权之类的操作。下面我们会详细介绍主题的召回和排序这两部分。

2. 主题召回

主题召回的个性化包含首图个性化和文案个性化

首图个性化:

HOW:将商品的图片直接曝光给用户,来实现主题首图的个性化

WHY:

① 通过商品的图片吸引用户进入承接页(商品相关性)

② 降低过度曝光对用户造成的视觉疲劳度(商品新颖性)

文案个性化:

HOW: 主题本身的个性化

由于我们的主题入口是由商品和主题本身共同决定的,商品的个性化实现了主题首图的个性化,而主题本身的个性化则实现了包装这个商品的主题卡片的个性化。所以,在我们做主题召回的时候,天然的就会分为两层,一层是商品的召回,一层是主题的召回。我们既可以先召回商品再召回商品所归属的主题,也可以直接召回主题,然后召回主题下挂载的商品。针对不同的用户状态,我们会有不同的召回通道。

静默用户:

对于长期无任何行为的静默用户,我们可以基于用户的LBS定位信息和当前的时令节假日等客观因素,然后关联主题的标签,直接召回相关的主题,再召回主题下的商品。

种草期用户:

对于有行为的种草期用户,我们可以基于用户的机票、火车票、酒店、度假商品等行为,分析出用户偏好的目的地、类目、玩法等,然后基于X2I、I2I等通道去召回商品,同时召回商品所归属的主题。

决策期用户:

对于有行程的决策期用户,我们会做一些搭配性召回。例如,对于有机票订单的用户,会给他召回一些机场的接送清单。

行中用户:

对于行程中的用户,我们会根据用户的LBS定位召回当前目的地附近的一些玩乐、景点类的清单。

3. 主题排序

在召回商品和主题之后,因为一个商品是可以挂载多个主题的,在对商品进行排序后,我们就要给每个商品选择一