复现系列-2:DocArray 和 Redis 联手,让推荐系统飞起来

1,293 阅读3分钟

原公众号链接是[这里](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步。

  1. 将数据集加载成 DocArray 格式。
  2. 使用 CLIP-as-service 编码商品图像,以此建立商品模型。
  3. 计算最近 K 次浏览商品的 embedding 的加权平均数,以此来建立用户画像。
  4. 索引 Redis 中的商品数据。
  5. 用 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))方便国内下载使用。

主要修改

原公众号文章里有这样一段代码,这里有些问题,需要修改掉

image.png

可以看到这里有一个hardcode的 n_dim,很有可能跟自己clip_server embedding之后的维度不相同。如果不相同导致的后果就是,在用 find(embedding) 进行最近查找的时候会找不到内容。

因此我在将encoded_da放进redis之前,首先获取一下embedding的dim是多少即可。

n_dim = len(da[0].embedding)

总结

总体来说,Jina AI的公众号、文档质量很高,大部分内容都可以一遍通过,微信群里也有专门的资深工程师进行答疑解惑,氛围很棒。

下一篇《复现》选题已经准备好了,在路上了。