原公众号链接是[这里](DocArray 和 Redis 联手,让推荐系统飞起来 (qq.com)) 看着挺有趣的,就决定动手试一试。
原文介绍了一些推荐系统的基础知识,像ItemCF、UserCF这种都有提到。
这个小项目主要是用[Jina AI](Jina AI: MLOps for Multimodal AI, Neural Search, Generative AI, Creative AI) 的 [DocArray](DocArray | Jina AI: MLOps for Multimodal AI, Neural Search, Generative AI, Creative AI) 来完成简单的推荐系统搭建。
总体过程分为以下5步。
- 将数据集加载成 DocArray 格式。
- 使用 CLIP-as-service 编码商品图像,以此建立商品模型。
- 计算最近 K 次浏览商品的 embedding 的加权平均数,以此来建立用户画像。
- 索引 Redis 中的商品数据。
- 用 Redis 向量相似性搜索来推荐和用户浏览历史中最相似的商品,同时根据用户的偏好过滤这些结果。
一步步来:
安装Redis Server
如果本地已经有redis server了可能要检查一下是否支持RedisSearch,如果版本较老不支持的话,需要安装最新版。 为了避免麻烦,直接使用docker来部署一个新的redis server即可。
docker run -d -p 6380:6379 redis/redis-stack:latest
因为我本地已经有一个老版本的redis server占用了6379端口,这里docker运行的采用6380 端口。
安装python依赖库
requirements.txt文件在[这里](product-recommendation-redis-docarray/requirements.txt · orange/jina_demo - 码云 - 开源中国 (gitee.com)) 直接运行
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
即可把相关的依赖都安装好。
一键准备
这一步包含了数据集下载、编码、保存等步骤。
Jina Cloud提供了数据集的编码和保存功能,但是如果能够在本地完成,比如有些时候公网速度受限或者有网络隔离要求,就很有必要了。
启动本地clip_server:
python3 -m clip_server
这里需要注意,如果你的server是M1/M2芯片的MacBook,可能会有问题,表现状态是能够正常启动,c.profile()也能正常显示,但是在embedding的时候会异常,没有深究,建议使用x86 CPU的电脑或者服务器。
直接运行一键脚本,编辑一下脚本里的几处内容,clip_server的地址等,有详细的中英文双语注释。
Jina auth login
python3 prepare.py
运行和体验
最后一步直接运行就可以了,代码量很少
streamlit run main.py
我把原公众号的代码修改了一下放在了[Gitee](jina_demo: jina ai demo (gitee.com))方便国内下载使用。
主要修改
原公众号文章里有这样一段代码,这里有些问题,需要修改掉
可以看到这里有一个hardcode的 n_dim,很有可能跟自己clip_server embedding之后的维度不相同。如果不相同导致的后果就是,在用 find(embedding) 进行最近查找的时候会找不到内容。
因此我在将encoded_da放进redis之前,首先获取一下embedding的dim是多少即可。
n_dim = len(da[0].embedding)
总结
总体来说,Jina AI的公众号、文档质量很高,大部分内容都可以一遍通过,微信群里也有专门的资深工程师进行答疑解惑,氛围很棒。
下一篇《复现》选题已经准备好了,在路上了。