实时推荐系统的技术实现

Published: 03 Jul 2020 Category: arch

一个简单的实时推荐系统

大概分三部分:

1,标签系统

2,数据流处理系统

3,根据用户标签筛选出要推荐的内容

下面系统架构,其中绿色实线部分是在线的实时流,蓝色虚线部分是离线计算的非实时部分。

作为示例,我们这里把问题简化一下,对这个实时推荐系统的业务需求做一个描述:用户最近点击了什么样的内容,我就把类似的内容推荐给他。

abc

1.1 标签系统

标签系统就是俗称的用户画像。从属性变化性质来分,标签系统可分为静态标签和动态标签:

  • 静态标签:短时间内变化不大的标签,比如性别、地域、职业、生活习惯等;
  • 动态标签:不断变化的行为标签,比如关注的产品类别、产品偏好、内容偏好等

从更新时间的频率上来说,又可以分为短期兴趣标签和长期用户标签:

  • 短期标签的更新频率是分钟级或秒级;
  • 长期标签的更新频率是天级或小时级;

在这个简化的推荐系统里,我们只考虑实时部分(绿色实线部分)是可以满足需求的。所以只考虑短期兴趣标签的计算,还是出于简化问题的考虑,我们假设现在只有四个标签,描述用户对内容类别的感兴趣程度:美妆、汽车、衣服、电子产品。

对一个用户来说,可以用0-1的浮点值来描述其感兴趣程度(也可以更简化,大于某个阈值为1,小于某个阈值为0)

1.2 数据流处理系统(实时)

主要是绿色实线部分,针对系统推荐的内容。

用户有两种行为,点击或不点击,这个事件推送到流计算(其实是两个流,一个是点击流,一个是曝光流,这两个流根据用户id、内容id做join)。

流计算实时计算过去N秒(N可以根据业务需求取值,比如60,这就是一个事件窗口)内每个用户针对四种内容类别的点击率,然后把这个点击率作为用户的短期兴趣标签。比如用户a:{美妆:0.2,汽车:0.1,衣服:0.02,电子产品:0.5}

其实这里涉及到数据的采集和处理,常用的实时数据采集系统有Flume。然后将数据放在Kafka这种适合流式计算的中间件里。再进行后续的内容筛选和推荐的环节。

1.3 内容筛选系统

内容筛选系统就是根据用户的短期兴趣标签去筛选内容。假设所有的内容都存储到某个数据库里,并打好了内容标签。比如文档1:{美妆:0.3,汽车:0.5,衣服:0.8,电子产品:0.1}文档2:{美妆:0.4,汽车:0.2,衣服:0.1,电子产品:0.7}

推荐流程是:用户发起访问—找到用户短期兴趣标签—计算文档与用户标签的相似度—相似度排序—展示内容。

REF

Real-time Recommendation System: Rolling Feature Matrix Graph-based real-time recommendation systems
实时推荐系统如何做到实时? 左高玩的推荐系统
结合实时推荐与离线推荐的推荐系统