浅谈NB推荐系统架构-ProLightsfx

ProLightsfx 2024-11-5 1,450 11/5

浅谈NB推荐系统架构

导语:分享一种推荐系统架构(The Architecture Of NB Recommendation System),以及实际服务业务的时候遇到的一些问题和解决,可能比较粗糙,但可参考。这里为了和其他人搭建的推荐系统区分开,所以取名叫NB推荐系统架构(不是Naive Bayesian)

一、 背景与目标

1. 背景

使用推荐系统用户千人千面的个性化推荐体验

2. 目标

从零搭建一套灵活可插拔并且能为多种不同业务提供高可用推荐服务的系统。

3.举个栗子

这里举个与西瓜(《机器学习 周志华》)里类似例子形象描述什么特征以及怎么根据特征进行推荐服务。

3.1 比如西瓜属性色泽根蒂敲声三个属性。

有的西瓜:色泽=青绿;根蒂=蜷缩;敲声=浊响,

有的西瓜:色泽=乌黑;根蒂=稍蜷;敲声=沉闷,

还有的西瓜:色泽=浅白;根蒂=稍蜷;敲声=清脆。

这里色泽根蒂敲声我们称之为西瓜的特征青绿乌黑浅白都是是西瓜色泽特征的可能的一种取值

3.2 比如一个“色泽=浅白;根蒂=稍蜷;敲声=清脆”西瓜,用户之后八分这里八分甜就是一个label最终“色泽=浅白;根蒂=稍蜷;敲声=清脆|八分甜”构成训练样本

3.3 再比如已经上线了一个冷启动的模型(这里指训练完成后导出模型文件用于线上serving,而不是算法模型结构)。当一个特别喜欢“七分甜西瓜”的用户之后系统挑出一部分西瓜加上“七分甜”,去模型里给这些西瓜打分然后分数最高(最可能符合用户七分甜预期)的一批西瓜推荐用户然后用户给出行为反馈有个西瓜是“五分甜”那么我们又收获一条样本“那个渣渣西瓜|五分甜,进行再训练。

所以最开始推荐可能不准样本量足够大,用户的行为足够推荐系统可以越来

 

二、 系统架构

浅谈NB推荐系统架构-ProLightsfx

1. 黄底的框框是业务层分别业务cgi组装层业务推荐流feed业务召回,主要用go来实现,并且每个业务都有各自的微服务。

a. 业务cgi组装面向终端用户收到用户http请求调起推荐feed服务,收到推荐物品id(比如商品id、直播间id、文章id、视频id等等)各种存储拼装数据(比如商品价格和标题、文章作者和内容等),然后下发客户端展示用户

b. 业务推荐流feed这里feed就是那种可以不断往下那种资源流,下拉一下刷出一些没有看过的视频、文章等。feed主要是根据不同场景的配置依次发起召回粗排精排重排多样性混排逻辑比如有些业务可能没有粗排精排重排只有召回、多样性混排这是配置

c. 业务召回召回代理(后文会讲解)触发不同业务不同场景配置不同的trigger以及不同索引(后文会讲解),然后会根据拿到的用户特征取查相应的索引。qps、耗时、机器资源允许情况下可能查出索引并且进行初步过滤之后进行一次粗排并且截断返回。比如索引查出5000个物品然后粗排返回300物品,最终feed大概会下发10个物品。因此召回的上限决定了整个推荐效果的上限

2. 的框框推荐系统中台层(或者公共),通过不同业务id不同配置执行各自的流程,来为各个业务提供推荐服务。主要用c++来实现。后文会详细介绍。

3. Kafka、Redis、Spark、FlinkHiveHdfs基础组件这里不做详解

4. 如果业务发展初期可以直接使用cgi-feed-rank-recall-index简单架构不需要模型,直接用人工规则排序。不需要复杂索引直接全量索引

 

三、 召回代理

这一层主要是为了可以不同召回服务那里召回物品然后进行融合

这一层不一定要有,之前接入的业务只有一个召回服务并且召回代理一般sdk方式提供业务而不是服务。主要原因功能相对单一,所以想节约一次rpc序列化和反序列化耗时。实际使用时候召回服务常常附带一些生成物品特征回来以及物品数量不少节约一次rpc序列化序列化还是很有效果

 

四、 索引

这里索引可以根据某些key(比如业务id+全局索引专用key、业务id+活动id、业务id+类目id)索引一部分物品id用于推荐

索引从构建方式来分主要基于Faiss[https://github.com/facebookresearch/faiss]的向量索引、Redis索引。中途也用ES建过索引,但性能不大好,用起来也不够灵活,感觉不大适合用于构建推荐系统底层索引。

业务逻辑划分大概有全量索引活动索引类目索引、各种奇奇怪怪的离线索引等

全量索引一般基于上架时间排序活动索引一般基于活动id或者活动场景索引类目索引主要是用了相关推荐

 

一般索引的入库方式有实时入库、离线入库两种。

1.  实时入库:监听业务物品dbbinlog的kafka消息队列比如商品上架文章发布就是消息队列实时索引插入索引类目索引索引这里一般配置kafka地址参数索引参数可以完成入库

2.  离线入库是指算法同学自己用Spark离线计算一些特殊索引(比如热点商品、热点文章)然后写入kafka然后配置索引入库然后召回时候进行多路融合

 

五、 排序

排序是为了从候选集中挑出最接近业务目标(GPV/点击率)的top n个物品

浅谈NB推荐系统架构-ProLightsfx

1. 粗排:一般是查出索引后召回返回前,进行一次模型打分然后排序截断主要目标剔除劣质物品

2. 精排:一般使用算法模型精选打分排序业务不需要主要目标选择优质物品

3. 重排:基于精排的ctr/cvr、gpv疲劳度新颖相关等使用树模型再排一次。关于模型笔者当时主要是手动开发一个树模型serving服务嵌入现有推荐系统算法同学自己配置模型

4. 多样性比如一次召回排序最终返回比较同类型物品那么可能剔除一些使得一些稍后一些物品能够下发出去

5. 混排:比如商品店铺一个推荐类别下发

6. 排序完成最后还会进行最终业务策略干预比如置顶扶持(调高某些指定类型物品的排名)

 

六、 特征、样本模型训练

特征系统算是一个比较独立功能系统之后专门单独文章介绍(《从零搭建NB特征平台》)这里简介

特征主要是由用户特征物品特征(少量)全局特征构成在线预测时候用户特征+物品特征+全局特征,构成一条原始样本,然后serving。serving之后也会把ctr、cvr等打分写入到特征里,以供更后面的排序逻辑使用。

样本拼接时候也是这条特征构成原始样本join标签,以构成训练样本,并且写入kafka。kafka里的样本可以直接继续实时训练该模型,以及也会落地到hive表,方便后续进行样本回溯。

浅谈NB推荐系统架构-ProLightsfx

机器学习框架我们没有使用TensorFlow而是司内自研超大规模分布式机器学习框架主要原因时效性好,扩展性好,有专人运维,持续迭代

 

七、 性能优化主要是特征系统的优化)

推荐系统当时遇到最大问题是请求耗时高,而用户能接受的等待时间短

1. 针对go传输和编解码耗时对大包增长明显的问题

单请求分小包并行处理

改用精简、使用更少格式转换和嵌套的数据结构

重复率高的数据(比如特征ID)采用字典压缩方式

采用请求分小包并发的方式

结果降低耗时并发量

2. 针对连续的请求有大量item重复计算的问题

增加本地缓存,减少用户连续翻页带来的重复打分压力

结果:提高qps

3. 针对特征加工、模型打分时用户特征重复拼接导致item特征过长的问题

采用user、item特征拆分处理的方式

结果:降低耗时

4. 针对部分用户特征数量过多易超时的问题

裁剪0值特征

裁剪无用特征

结果使得特征较多用户的打分超时率大幅下降

 

八、 容灾

浅谈NB推荐系统架构-ProLightsfx

这里灾难主要是部分推荐页任何物品严重影响用户体验情况

1. 兜底策略:

排序模型失败:分包调用排序部分失败,自动补充item特征防止大部分item倍过滤

召回没有数据或者数据被全部过滤:取兜底列表下发

Cgi服务拉取推荐列表失败:取兜底列表下发

Cgi服务拉取组装数据失败:取已经组装好的列表数据补充下发

2. 模块开关:

a. 各个业务推荐模块首页推荐、商品页相关推荐、文章详情页的推荐内容)的开关发生问题,并且兜底策略没有起到作用,可以直接关闭推荐

b.推荐内部模块开关比如突然遇到大规模流量机器扩容来不及可以关闭粗排和精排召回完成直接重排展示降低推荐质量方式防止大规模灾难

 

九、 监控

按重要程度分等级监控

1. 严重告警:影响用户使用,需要马上处理,例如白屏,告警为:邮件、企业微信微信电话

2. 较严重告警:短时间内不影响用户使用,需要尽快处理,例如模型没有及时更新,告警为:邮件企业微信微信电话

3. 一般告警:不影响用户正常使用,需要关注,不一定要处理,例如正常流量波动告警,告警为:企业微信微信

具体告警比如

1. 数据下发告警可能白屏

2. 特征覆盖率环比降低严重说明哪里问题

3. 索引构建告警可能源头kafka出问题

4. 召回比例监控告警可能索引脏了导致查出来物品大部分被合法性检查过滤

 

十、  鸣谢

感谢carbon、华明、shenquan的指引。

 

十一、 后记

个人感觉:可能推荐系统在大部分时候终究锦上添而不是雪中送炭,尤其是中小规模的项目其实让人无奈

 

十二、后记+1

感谢“腾讯云开发者”公众号的转载与收录,

浅谈NB推荐系统架构-ProLightsfx

公众号文章链接:https://mp.weixin.qq.com/s?src=11&timestamp=1731080185&ver=5616&signature=3MvUWhW3I1UasU1fHcSJzgRzRl4-xzMBdGZM2BdWNbc116M5u0pfStYViTp-IivoPtjd9rJaaC68qhxglel*sYm5zx4dWTSs-PRz6DEcy6rTlvTxW*iWFCpuZEzAGQYe&new=1

 

本博所有文章均为博主原创,未经许可不得转载。

https://www.prolightsfxjh.com/article/the-architecture-of-nb-recommendation-system/

 

 

Thank you!

                                                                                                                                             ------from ProLightsfx

 

 

如果对笔者的文章感兴趣的话,欢迎关注公众号。

浅谈NB推荐系统架构-ProLightsfx

- THE END -

ProLightsfx

11月16日23:58

最后修改:2024年11月16日
4

本博所有文章均为博主原创,未经许可不得转载

共有 7 条评论