IT评测·应用市场-qidao123.com技术社区

标题: 向量数据库Faiss的搭建与利用 [打印本页]

作者: 东湖之滨    时间: 2024-11-14 10:36
标题: 向量数据库Faiss的搭建与利用
Faiss 是 Facebook AI 研究院开发的一种高效的相似性搜索和聚类库,能够快速处理大规模数据,并支持在高维空间中进行相似性搜索。以下是 Faiss 的搭建与利用步骤:
安装 Faiss
首先,需要在体系上安装 Faiss。它支持 Linux、macOS 和 Windows 操作体系,可以通过 Python 的 pip 包管理器进行安装。在终端中输入以下命令:
  1. pip install faiss-cpu
复制代码
假如你的体系有 NVIDIA 的 GPU 而且已经安装了 CUDA,你可以选择安装支持 GPU 的版本:
  1. pip install faiss-gpu
复制代码
基本利用示例
1、导入所需库:
  1.     import numpy as np
  2.     import faiss
复制代码
2、生成随机数据作为向量数据库:
  1.     d = 128  # 维度
  2.     nb = 10000  # 数据库大小
  3.     np.random.seed(1234)  # 使结果可重复
  4.     xb = np.random.random((nb, d)).astype('float32')
复制代码
3、创建索引(这里利用最简朴的 L2 距离索引):
  1.     index = faiss.indexflatl2(d)  # 构建索引
  2.     print(index.is_trained)  
复制代码
4、将数据添加到索引中:
  1.     index.add(xb)  # 添加向量到索引
  2.     print(index.ntotal)  
复制代码
5、生成查询向量并进行搜索:
  1.     nq = 5  # 查询向量数量
  2.     k = 4  # 想要的相似向量数量
  3.     xq = np.random.random((nq, d)).astype('float32')
  4.     d, i = index.search(xq, k)  # 进行搜索
复制代码
在上述示例中,i 是一个数组,它包含了每个查询向量的最近的 k 个向量的索引;d 是一个数组,它包含了这些向量的距离。

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

图片搜索时,通常需要通过深度学习模型(如 CNN)将图片转换为向量。比方利用预练习的 ResNet 模型将图片转换为向量:
  1. from torchvision import models, transforms
  2. from PIL import Image
  3. # 加载预训练模型
  4. model = models.resnet50(pretrained=True)
  5. model = model.eval()
  6. # 定义图片变换
  7. transform = transforms.Compose([
  8.     transforms.Resize(256),
  9.     transforms.CenterCrop(224),
  10.     transforms.ToTensor(),
  11.     transforms.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225))
  12. ])
  13. # 加载图片
  14. image = Image.open('image.jpg')
  15. # 应用变换并获取图片向量
  16. image = transform(image).unsqueeze(0)
  17. image_vector = model(image).detach().numpy()
复制代码
然后将这个向量添加到 Faiss 的索引中,进行相似图片搜索。
文件搜索时,一样平常通过自然语言处理模型(如 BERT)将文件转换为向量。比方利用预练习的 BERT 模型将文本文件转换为向量:
  1. from transformers import BertModel, BertTokenizer
  2. # 加载预训练模型和分词器
  3. model = BertModel.from_pretrained('bert-base-uncased')
  4. tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
  5. # 加载文本文件
  6. with open('file.txt', 'r') as f:
  7.     text = f.read()
  8. # 分词并获取文本向量
  9. inputs = tokenizer(text, return_tensors='pt')
  10. outputs = model(**inputs)
  11. text_vector = outputs.last_hidden_state.mean(dim=1).detach().numpy()
复制代码
再将该向量添加到 Faiss 索引中,实现相似文件搜索。
Faiss 中不同索引范例的先容与选择

在选择索引范例时,可以考虑以下因素:



实际应用中,需根据详细的需求和数据特点来选择符合的索引范例,以平衡搜索速度、准确性和内存占用等因素。同时,Faiss 还提供了一些高级功能和优化选项,可以根据详细环境进一步调解和优化搜索性能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4