Python使用Faiss库实现向量近邻搜索 4年前

本文是Python应用于推荐系统领域的技术文章。

Embedding的近邻搜索是当前图推荐系统非常重要的一种召回方式,通过item2vec、矩阵分解、双塔DNN等方式都能够产出训练好的user embedding、item embedding,对于embedding的使用非常的灵活:

  • 输入user embedding,近邻搜索item embedding,可以给user推荐感兴趣的items

  • 输入user embedding,近邻搜搜user embedding,可以给user推荐感兴趣的user

  • 输入item embedding,近邻搜索item embedding,可以给item推荐相关的items

然而有一个工程问题,一旦user embedding、item embedding数据量达到一定的程度,对他们的近邻搜索将会变得非常慢,如果离线阶段提前搜索好在高速缓存比如redis存储好结果当然没问题,但是这种方式很不实时,如果能在线阶段上线几十MS的搜索当然效果最好。

Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库。

接下来通过jupyter notebook的代码,给大家演示下使用faiss的简单流程,内容包括:

  1. 读取训练好的Embedding数据

  2. 构建faiss索引,将待搜索的Embedding添加进去

  3. 取得目标Embedding,实现搜索得到ID列表

  4. 根据ID获取电影标题,返回结果

1、读取预训练好的Embedding数据

import pandas as pd

2、使用faiss建立索引

import faiss

3、实现近邻搜索

# 读取user embedding数据

4、拼接得到内容列表

# 把搜索出来的ID变成Series

df_result就是最终可以返回给前端的推荐的电影ID列表了。

如果本文对你有帮助的话,帮忙点个赞吧^_^

代码:https://github.com/peiss/ant-learn-recsys

本文分享自微信公众号 - 蚂蚁学Python(ds_data_driven)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

image
大野团团
山有木兮木有枝,心悦君兮君不知。
3
发布数
2
关注者
1630
累计阅读

热门教程文档

10.x
88小节
Rust
84小节
Spring Boot
24小节
Spring Cloud
8小节
MyBatis
19小节
广告