简介

Gorse ,官方网址https://docs.gorse.io/

Gorse 是一个用 Go 编写的开源推荐系统。Gorse 旨在成为一个通用的开源推荐系统,可以很容易地引入到各种在线服务中。通过将项目、用户和交互数据导入 Gorse,系统将自动训练模型为每个用户生成推荐。项目特点如下。

  • AutoML:通过后台模型搜索自动选择最佳推荐模型和策略。
  • 分布式推荐:单节点训练,分布式预测,在推荐阶段实现横向扩展的能力。
  • RESTful API:为数据 CRUD 和推荐请求提供 RESTful API。
  • Dashboard:提供数据导入导出、监控、集群状态检查的dashboard。 Gorse 是一个单节点训练和分布式预测推荐系统。Gorse 将数据存储在 MySQL 或 MongoDB 中,中间数据缓存在 Redis 中。集群由一个主节点、多个工作节点和服务器节点组成。主节点负责模型训练、非个性化项目推荐、配置管理、会员管理。服务器节点负责公开 RESTful API 和在线实时推荐。Worker 节点负责为每个用户进行离线推荐。此外,管理员还可以通过主节点上的仪表板进行系统监控、数据导入导出、系统状态检查。

架构图

图片

Master Dashboard http://127.0.0.1:8088/
Server RESTful API http://127.0.0.1:8087/apidocs
Server Prometheus Metrics http://127.0.0.1:8087/metrics
Worker Prometheus Metrics http://127.0.0.1:8089/metrics

主要逻辑

物品或者项目(Item)、用户(User)、反馈(feedback)、measurements

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Item {

ItemId     string //唯一编号

IsHidden   bool //是否显示,当设置为true是,这个项目不在推荐结果里出现

Categories []string //分类,项目所属分类便于 项目之间的关联

Timestamp  Time //更新时间,判断这个项目是否为新的

Labels     []string //关键词或者tag, 不能为空

Comment    string //备注或者名称,方便后台显示

}

User {

UserId    string //用户唯一编号

Labels    []string //关键词或者tag

Subscribe  string //

Comment    string //备注或者名称,方便后台显示

}

Feedback {

    FeedbackType string //反馈类型,

    UserId       string //用户编号

    ItemId       string //项目编号

    Timestamp    Time //反馈的时间

 Comment          string //备注

}

其中 FeedbackType、UserId、ItemId 三个字段为联合主键。

反馈就是用户和物品之间产生的一些事件,可以是正向的或者负向的,例如分享、点赞等等都属于用户对物品的正向反馈,如果用户阅读之后没有进一步的正向反馈,那么认为用户对该物品的反馈是负向的,为了方便记录,Gorse并没有直接提供负向反馈的概念而提供了已读反馈的概念。如果用户查看了物品,那么记录一个已读反馈。接着,如果用户给了物品正反馈,那么已读反馈被正反馈覆盖。反之,如果用户没有给出正反馈,那么已读反馈视为负反馈。

正反馈和已读反馈的区别

已读反馈即当用户看到了推荐的物品,即可记录为已读反馈。然而,正向反馈的确定更多取决于具体业务场景。对于抖音来说,用户如果点赞或者分享则可以认为是正反馈;对于哔哩哔哩来说,用户观看视频到达一定的完成度或者点赞、分享、收藏则认为是正反馈。总结以下,正反馈和已读反馈的确定遵循以下规则:

  • 已读反馈: 用户看到了物品。
  • 正向反馈: 希望用户去做的动作。 对应配置文件
1
2
3
4
5
6
7
8
9
//The feedback types for positive events.

positive_feedback_types = ["star","like","completed"]

//The feedback types for read events.

read_feedback_types = ["play"]

FeedbackType 可取范围即:start、like、completed、play

正向反馈对应操作:点赞、收藏、播放完成80% 已读反馈对应操作:视频播放

注意:项目的已读反馈一旦发生,在推荐结果中将不再出现该项目

最佳实践问题

  • 导入旧数据
    • 现有数据的导入
    • 数据更新和新增
  • 提交反馈
    • 检查是否有课程、用户,怎么判断是否已经反馈过
    • 已读反馈,可以使用Gorse获取推荐结果的API提供了write-back-typewrite−back−type和write-back-delaywrite−back−delay这两个参数在获取推荐时就把已读反馈提交了。
    • 正向反馈,根据实际情况而定。可以在日志提交的消息队列增加一个订阅处理程序。
  • 获取推荐并应用
    • 调取反馈接口并联合基础库查询结果
    • 多租户问题要考虑
    • 分类要尽量使用id,避免使用汉字

参考文章:

https://juejin.cn/post/7027723551151128606 收集用户反馈

https://juejin.cn/post/7022541184077660196 制定推荐策略