管道
管道
Gorse 是一个多路推荐系统。不同的推荐器组合在一起,提供高质量的推荐。
检索和排序
此架构遵循“检索和排序”模式:
- 输入层是数据源。这里存储了所有原始数据。
- 用户: 使用该应用程序的人口统计数据或用户画像。
- 物品: 可推荐的内容、产品、视频等目录。
- 反馈: 用户对物品的反馈(点击、喜欢、购买、查看时间)。这对于训练算法以了解用户偏好至关重要。
- 检索层由多个推荐器组成,为每个用户生成大量候选物品。
- 最新物品: 最新内容,Gorse 中的预定义推荐器。
- 非个性化: 物品按定义的规则排名,例如最受欢迎的物品。
- 用户到用户: “与您相似的人喜欢这个。”
- 物品到物品: “因为您喜欢 X,所以这里是 Y。”
- 协同过滤: 矩阵分解在用户-物品交互中发现复杂的模式。
- 外部 API: 从第三方服务(例如,广告网络或合作伙伴服务)获取推荐。
- 排序层合并来自不同推荐器的所有输出,删除用户已经看过的物品(已读物品),并根据用户与剩余物品互动的可能性对其进行评分。
- 排序器: 根据用户与物品互动的可能性对物品进行评分和排序。
- 替换: 如果配置,已读物品将被替换回推荐中。
- 回退: 如果排序器无法提供足够的推荐(例如,对于新用户),回退模块将使用更简单的方法(如最新物品)提供备用推荐。
当用户看到推荐并与之互动(或忽略它们)时,该操作将被记录并反馈到数据库中。这使系统能够学习并提高下一次的准确性。
默认管道
有一个预定义的推荐器,即最新物品。如果未配置管道(配置文件中的 [recommend] 部分为空),Gorse 将使用默认管道:
向所有用户推荐最新物品。最新物品易于实现,并且可以向用户推荐新鲜物品。但是,最新物品会忽略用户偏好,无法提供个性化推荐。因此,建议配置完整的管道以提高推荐质量。
管道中的缓存
以下中间结果被缓存并定期更新:
- 用户到用户推荐器的用户邻居。
- 物品到物品推荐器的物品邻居。
- 非个性化推荐器的结果。
- 每个用户的排序器输出(已应用替换)。
如果数据更改、配置更改或达到过期时间,缓存将被更新。缓存的大小和过期时间可以在配置文件中配置。
[recommend]
cache_size = 100
cache_expire = "72h"增加缓存大小可能会改善推荐,因为推荐系统拥有更多的数据信息,但也会消耗更多的缓存存储。缓存的过期时间应在新鲜度和 CPU 成本之间进行权衡。
Gorse 工作原理
管道以分布式方式执行。Gorse 中有三种类型的节点:主节点、工作节点和服务器节点。
主节点:数据集、邻居和模型
一个集群只有一个主节点。工作节点和服务器节点通过 GRPC 连接到主节点。主节点负责以下任务:
- 加载数据集: 从数据库加载用户、物品和反馈。在此过程中更新非个性化推荐。
- 生成用户到用户推荐: 计算用户相似度并为每个用户到用户推荐器在缓存数据库中存储用户邻居。
- 生成物品到物品推荐: 计算物品相似度并为每个物品到物品推荐器在缓存数据库中存储物品邻居。
- 训练协同过滤模型: 训练矩阵分解模型并将模型存储在 blob 存储中(默认为主节点上的本地磁盘)。
- 训练点击率预测模型: 训练因子分解机排序模型并将模型存储在 blob 存储中。
如果主节点关闭,工作节点和服务器节点仍将工作,但配置更改和模型更新将不会应用。
工作节点:推荐
检索和排序过程由工作节点执行。工作节点连接到主节点以获取配置和模型。工作节点通过以下步骤为所有用户定期生成离线推荐并将结果存储在缓存数据库中:
- 对于每个用户,从所有推荐器获取候选物品。
- 通过排序器对候选物品进行评分和排序。
- 如果配置,将已读物品替换回推荐中。
- 将最终推荐存储在缓存数据库中。
可以添加更多工作节点以加快离线推荐过程。如果一个工作节点关闭,其他工作节点将接管其任务。
服务器:筛选和回退
服务器节点为数据和推荐公开 RESTful API。当用户请求推荐时,服务器节点执行以下步骤:
- 从缓存数据库获取离线推荐。
- 筛选出用户已读的物品。
- 如果推荐不足,则从推荐器获取回退推荐。
4.向用户返回推荐。
服务器是无状态的,因此可以添加更多服务器来处理更多请求。
时钟同步
Gorse 支持带有未来时间戳的反馈,因此 Gorse 依赖于正确的时钟。但是,不同主机中的时钟可能不同,clock_error 应该是时钟之间的最大差异。
