经过长时间的开发,Gorse迎来了大版本更新。需要注意的是,大版本之间并不兼容,需要对数据库进行修改之后才能升级。
新特性
- 支持隐藏物品。
在某些时候,我们希望一些物品在训练数据中出现但是不在推荐结果中出现。例如,用户购买过的物品已经下架了,用户对于下架物品的购买行为可以作为训练数据,但是下架的物品不应该出现在其他用户的推荐结果中,这个时候就需要对物品进行隐藏。
物品增加了一个IsHidden字段,同时也支持使用PATCH方法对物品的隐藏状态进行修改。
type Item struct {
ItemId string
IsHidden bool // 是否隐藏物品
// ...
}
在物品被隐藏之后,该物品就不会再出现在任何用户的推荐结果中。然而,如果是对物品进行取消隐藏操作,那么物品只有在推荐缓存刷新之后才会重新出现在用户的推荐列表中。
- 支持为物品设置分类。
一个应用之上可能存在不同类型的物品,例如B站会有直播、长视频和短视频,另外长视频也可以分为电影、电视剧、纪录片、自制等类型,如果希望向用户推荐细分分类的物品,那么可以使用新推出的物品分类功能。
物品增加了一个Categories字段记录物品所属的分类,同时也支持使用PATCH方法对物品的分类信息进行修改。
type Item struct {
ItemId string
// ...
Categories []string // 物品分类
// ...
}
Gorse推荐系统的RESTful API提供了获取各个分类下的推荐结果接口:
| 方法 | URL | 解释 |
|---|---|---|
| GET | /api/latest/{category} | 列出分类下的最新物品 |
| GET | /api/popular/{category} | 列出分类下的热门物品 |
| GET | /api/recommend/{user-id}/{category} | 获取分类下的推荐结果ß |
| GET | /api/item/{item-id}/neighbors/{category} | 列出分类下的相似物品 |
性能优化
- 实现了内存可重用深拷贝。
在Gorse推荐系统中,很多地方都用到了深拷贝,例如在训练模型过程中保存模型参数作为检查点,以及在模型搜索过程中保存最佳模型。旧版本采用深拷贝复制数据结果,然后将原先的数据结果丢弃,然而这些碎片化的内存给垃圾回收器巨大的压力。因此,新版本采用了内存可重用深拷贝,尝试使用新数据覆盖原始数据,只有在无法简单覆盖的情况下才分配新内存并丢弃旧内存。
升级指南
本次大版本更新在数据库的物品表中增加了两个字段:
is_hidden字段记录物品是否被隐藏;categories字段记录了物品所属的分类。
如果使用了MySQL,执行以下的SQL语句即可升级数据库模式:
ALTER TABLE items ADD is_hidden BOOL NOT NULL DEFAULT FALSE;
ALTER TABLE items ADD categories json NOT NULL;