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

Faiss 是 Facebook AI 研究院开发的一种高效的相似性搜索和聚类库,能够快速处理大规模数据,并支持在高维空间中进行相似性搜索。以下是 Faiss 的搭建与使用步骤:

安装 Faiss

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

pip install faiss-cpu

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

pip install faiss-gpu

基本使用示例

1、导入所需库:

    import numpy as np
    import faiss

2、生成随机数据作为向量数据库:

    d = 128  # 维度
    nb = 10000  # 数据库大小
    np.random.seed(1234)  # 使结果可重复
    xb = np.random.random((nb, d)).astype('float32')

3、创建索引(这里使用最简单的 L2 距离索引):

    index = faiss.indexflatl2(d)  # 构建索引
    print(index.is_trained)  

4、将数据添加到索引中:

    index.add(xb)  # 添加向量到索引
    print(index.ntotal)  

5、生成查询向量并进行搜索:

    nq = 5  # 查询向量数量
    k = 4  # 想要的相似向量数量
    xq = np.random.random((nq, d)).astype('float32')
    d, i = index.search(xq, k)  # 进行搜索

在上述示例中,i 是一个数组,它包含了每个查询向量的最近的 k 个向量的索引;d 是一个数组,它包含了这些向量的距离。

使用 Faiss 进行图片或文件搜索

图片搜索时,通常需要通过深度学习模型(如 CNN)将图片转换为向量。例如使用预训练的 ResNet 模型将图片转换为向量:

from torchvision import models, transforms
from PIL import Image

# 加载预训练模型
model = models.resnet50(pretrained=True)
model = model.eval()

# 定义图片变换
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))
])

# 加载图片
image = Image.open('image.jpg')

# 应用变换并获取图片向量
image = transform(image).unsqueeze(0)
image_vector = model(image).detach().numpy()

然后将这个向量添加到 Faiss 的索引中,进行相似图片搜索。

文件搜索时,一般通过自然语言处理模型(如 BERT)将文件转换为向量。例如使用预训练的 BERT 模型将文本文件转换为向量:

from transformers import BertModel, BertTokenizer

# 加载预训练模型和分词器
model = BertModel.from_pretrained('bert-base-uncased')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# 加载文本文件
with open('file.txt', 'r') as f:
    text = f.read()

# 分词并获取文本向量
inputs = tokenizer(text, return_tensors='pt')
outputs = model(**inputs)
text_vector = outputs.last_hidden_state.mean(dim=1).detach().numpy()

再将该向量添加到 Faiss 索引中,实现相似文件搜索。

Faiss 中不同索引类型的介绍与选择

  1. indexflatl2:使用欧氏距离(L2)进行精确检索。如果采用此索引结构,查询向量需要和索引中每个向量计算 L2 距离,然后进行排序,最后将距离较小的前 k 个结果返回。注意:indexflatl2 索引不需要训练过程。

  2. indexivfflat:使用倒排索引结构,将数据集划分为多个聚类空间,以加速搜索。在查询阶段,首先定位到可能包含相似向量的聚类中心,然后在该聚类中心附近进行精确搜索。构建索引时需要指定聚类空间的数量 nlist,并进行训练。

  3. indexivfpq:使用 product quantization(PQ)技术进行有损压缩,以节省内存。在查询阶段,返回近似结果。需要指定空间拆分的数量 m 和聚类空间的数量 nlist,同样要进行训练。

  4. indexhnswflat:基于图索引的方式,包括 regular graph(图中每个顶点具有相同数目的邻居)、random graph(图中每个顶点的邻居数是随机的)和 small world graph(介于 regular 与 random 之间)。其中 hnsw 是 hierarchical navigable small world 的缩写,即分层的 NSW。它整体可分为图构造过程和图检索过程,通过构建分层的 NSW 图来提高搜索效率。

在选择索引类型时,可以考虑以下因素:

  • 简单场景:如果只需较少次查询,建议使用 “flat” 索引直接计算,因为建索引时间不能被查询时间弥补。如果全部数据不能放入 RAM 内存,则可分多次构建小索引,最后再将小索引查询结果合并。如果需要确切结果,则需要使用 indexflatl2 或者 indexflatip

  • 内存考量:如果不关注(如内存较大或数据集较小),hnsw 是较好的选择,它不仅快而且准。比 hnsw 更快的选择是 ivf1024, pqnx4fs, rflat。如果稍微考虑内存,则采用先聚类再 “flat” 索引的方式。如果内存比较重要,则采用 opqm_d,…, pqmx4fsr,其中 opq 用来降维,pq 对向量进行量化。如果非常重要,则采用 opqm_d,…, pqm,其中 d 和 m 有特定要求。

  • 数据集大小:如果数据集大小在 100 万以下,可采用 …, ivfk,…;在 100 万到 1000 万之间,可采用 …, ivf65536_hnsw32,…,训练向量数建议在 30 * 65536 和 256 * 65536 之间;在 1000 万到 1 亿之间,可采用 …, ivf262144_hnsw32,…,训练向量数建议在 30 * 262144 和 256 * 262144 之间;在 1 亿以上,可采用 …, ivf1048576_hnsw32,…,训练向量数建议在 30 * 1048576 和 256 * 1048576 之间。

实际应用中,需根据具体的需求和数据特点来选择合适的索引类型,以平衡搜索速度、准确性和内存占用等因素。同时,Faiss 还提供了一些高级功能和优化选项,可以根据具体情况进一步调整和优化搜索性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值