向量数据库Faiss的搭建与使用

news/2025/2/13 22:23:12/

向量数据库Faiss是Facebook AI研究院开发的一种高效的相似性搜索和聚类的库。它能够快速处理大规模数据,并且支持在高维空间中进行相似性搜索。本文将介绍如何搭建Faiss环境并提供一个简单的使用示例。

Faiss的安装

首先,我们需要在我们的系统上安装Faiss。Faiss支持Linux,macOS和Windows操作系统,可以通过Python的pip包管理器进行安装。在终端中输入以下命令:

pip install faiss-cpu

如果你的系统有NVIDIA的GPU并且已经安装了CUDA,你可以选择安装支持GPU的版本:

pip install faiss-gpu

Faiss的基本使用

安装完Faiss之后,我们可以开始创建我们的第一个向量数据库。首先,我们需要导入Faiss库和numpy库,因为Faiss的输入数据需要是numpy数组。

import numpy as np
import faiss

然后,我们可以生成一些随机数据作为我们的向量数据库。在这个例子中,我们生成了10000个128维的向量。

d = 128                            # dimension
nb = 10000                         # database size
np.random.seed(1234)             # make reproducible
xb = np.random.random((nb, d)).astype('float32')

接下来,我们需要创建一个索引。索引是Faiss进行高效搜索的关键。在这个例子中,我们使用最简单的L2距离索引。

index = faiss.IndexFlatL2(d)   # build the index
print(index.is_trained)

然后,我们可以将我们的数据添加到索引中。

index.add(xb)                  # add vectors to the index
print(index.ntotal)

现在,我们的向量数据库已经准备好了,我们可以进行搜索了。我们生成了5个查询向量,并且我们希望找到每个查询向量的最近的4个向量。

nq = 5                          # number of query vectors
k = 4                           # we want 4 similar vectors
Xq = np.random.random((nq, d)).astype('float32')
D, I = index.search(Xq, k)     # sanity check
print(I)
print(D)

在这个例子中,I是一个数组,它包含了每个查询向量的最近的4个向量的索引。D是一个数组,它包含了这些向量的距离。

Faiss的强大之处在于它可以处理任何可以表示为向量的数据,包括图片和文件。在这个部分,我们将介绍如何使用Faiss进行图片和文件的搜索。

图片搜索

在进行图片搜索时,我们首先需要将图片转换为向量。这通常通过深度学习模型,如CNN,来实现。这些模型可以将图片的视觉内容编码为一个向量,这个向量可以捕获图片的重要特征。

以下是一个简单的例子,我们使用预训练的ResNet模型将图片转换为向量:

from torchvision import models, transforms
from PIL import Image# Load the pretrained model
model = models.resnet50(pretrained=True)
model = model.eval()# Define the image transformations
transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])# Load the image
image = Image.open('image.jpg')# Apply the transformations and get the image vector
image = transform(image).unsqueeze(0)
image_vector = model(image).detach().numpy()

然后,我们可以将这个向量添加到Faiss的索引中,就像我们在前面的例子中做的那样。当我们需要搜索相似的图片时,我们可以将查询图片也转换为向量,然后使用Faiss进行搜索。

文件搜索

对于文件搜索,我们也需要将文件转换为向量。这通常通过自然语言处理模型,如BERT,来实现。这些模型可以将文本内容编码为一个向量,这个向量可以捕获文本的语义信息。

以下是一个简单的例子,我们使用预训练的BERT模型将文本文件转换为向量:

from transformers import BertModel, BertTokenizer# Load the pretrained model and tokenizer
model = BertModel.from_pretrained('bert-base-uncased')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')# Load the text file
with open('file.txt', 'r') as f:text = f.read()# Tokenize the text and get the text vector
inputs = tokenizer(text, return_tensors='pt')
outputs = model(**inputs)
text_vector = outputs.last_hidden_state.mean(dim=1).detach().numpy()

然后,我们可以将这个向量添加到Faiss的索引中,就像我们在前面的例子中做的那样。当我们需要搜索相似的文件时,我们可以将查询文件也转换为向量,然后使用Faiss进行搜索。

结论

通过将图片和文件转换为向量,我们可以使用Faiss进行高效的搜索。这种方法不仅可以应用于图片和文件,还可以应用于任何可以表示为向量的数据,如音频,视频等。这使得Faiss成为处理大规模数据和进行相似性搜索的强大工具。


http://www.ppmy.cn/news/830347.html

相关文章

cpu和内存监控脚本

#!/bin/python3 # -*- coding: utf-8 -*- """ 使用方式: python3 cpu_monitor.py 1 0.7 python3 cpu_monitor.py 5 0.7 python3 cpu_monitor.py 15 0.7 1 5 15分别表示负载1分钟内,5分钟内,15分钟内统计.只有这三个选择 0.7是计算峰值&am…

Android如何实时监控CPU频率

之前做过一个项目,是移植MTK CPU超频(有兴趣的同学可以参考:原作者地址 http://media.weibo.cn/article?id2309403981343598977447&location35 ), 但是要求界面美观一点,其中有一个要求就是要实时监控…

zabbix自带模板监控CPU,磁盘和内存

版本:zabbix5,使用自带模板“Template OS Linux”链接主机。 CPU: 使用模板自带监控项“CPU idle time”,只需要创建一个触发器即可: 主页面添加图形展示: 内存: 客户端创建键值: 取出内存…

【Python监控CPU】一款超治愈的RunCat监控应用系统上线啦~爆赞,颜值拉满啊

导语 哈喽!我是木木子,最近好懒了哈天气太热了.jpg 有时间给大家更新一下下啦!今日上线——跟这这篇👇文章写姐妹篇哈~ 【Python太牛了】一款强大的实时监控 CPU使用率 专业工具新鲜出炉啦~ 在使用 Mac 电脑办公时,…

jmeter添加服务器cpu监控插件

jmeter添加服务器cpu监控插件

prometheus cAdvisor 监控docker CPU利用率 教程

一、方案 1. 背景 promethus,原理是获取所有全量标签,然后按需过滤 监控Docker容器,Prometheus提供了几种方法来监控Docker,包括一些自定义exporter。 然而,这些exporter一般都不会用到,推荐的方法是使…

echarts cpu监控 心跳/心电图

1.0版本,适合心跳,脉搏波等图表需求 2.0版本,适合心跳/心电图,cpu等电脑资源监控(win10资源监控) 3.0版本,适合医院心电图,百分百还原,带音效 免积分下载

linux服务器系统cpu监控-shell脚本

监控服务器系统cpu占用情况: 1、使用top命令查看linux系统cpu使用情况: # top -b -n 1 | grep Cpu (-b -n 1 表只需要1次的输出结果) Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st …