Faiss向量数据库

news2024/9/20 9:39:41

Faiss(Facebook AI Similarity Search)向量数据库是由Facebook AI研究院开发的一种高效相似性搜索和聚类的库。Faiss不仅支持在高维空间中进行高效的相似性搜索,还能够在处理大规模数据集时展现出卓越的性能,尤其适用于图像检索、文本搜索、推荐系统和语音处理等多种应用场景。 

  • 在推荐系统中,Faiss可以用于快速查找用户可能感兴趣的物品或寻找具有相似兴趣的用户。 
  • 在信息检索领域,Faiss可以用于构建文档或图像的相似性搜索引擎。
  • 在图像识别领域,Faiss可以用于构建图像特征的索引,实现快速的相似图像搜索和图像聚类。

 安装Faiss:

💢cpu版本:

conda install -c pytorch faiss-cpu

💢gpu版本:

conda install -c pytorch faiss-gpu

Faiss 处理固定维数 d 的向量集合,通常为几十到几百个。这些集合可以存储在矩阵中。我们假设采用行主存储,即向量编号 i 的第 j 个分量存储在矩阵的第 i 行、第 j 列中。Faiss 仅使用 32 位浮点矩阵。

import numpy as np
d = 64                           # 设置向量的维度为64
nb = 100000                      # 向量数量为100,000
nq = 10000                       # 查询向量的数量为10,000
np.random.seed(1234)             # make reproducible
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.    # 修改查询向量的第一个维度

建立索引 

Faiss 是围绕Index对象构建的。它封装了一组数据库向量,并可选地对它们进行预处理,以提高搜索效率。索引有很多种类型,我们将使用最简单的版本,即对它们进行强力的 L2 距离搜索:IndexFlatL2

所有索引在构建时都需要知道它们所操作的向量的维数,当索引建立并训练完成后,可以对索引进行两种操作:addsearch

  • 当我们说一个索引是否被“训练”时,我们实际上是指该索引是否已经通过某种方式优化了其内部结构,以便更有效地处理搜索查询。 
import faiss                   
index = faiss.IndexFlatL2(d)   # 创建一个IndexFlatL2类型的索引
print(index.is_trained)        # 打印出索引是否已经被训练
index.add(xb)                  # 将向量添加到索引中
print(index.ntotal)
  • IndexFlatL2索引是一种简单的暴力搜索索引,它不需要训练过程,因为它直接计算查询向量与数据库中所有向量的L2距离,以找到最相似的向量。 

 

搜索~

可以在索引上执行的基本搜索操作是k最近邻搜索,即对于每个查询向量,k在数据库中找到其最近的邻居。

此操作的结果可以方便地存储在大小为nq-by-的整数矩阵中k,其中第 i 行包含查询向量 i 的邻居的 ID,按距离递增排序。除了这个矩阵之外,该search操作还返回一个nq-by-k浮点矩阵,其中包含相应的平方距离。

k = 4                          # we want to see 4 nearest neighbors
D, I = index.search(xb[:5], k) # 在索引中搜索xb数组的前5个向量(xb[:5])的k个最近邻居
print(I)
print(D)
D, I = index.search(xq, k)     # 整个查询集xq上搜索每个查询向量的k个最近邻居
print(I[:5])                   # 前5个查询向量的最近邻居的索引位置
print(I[-5:])   
  • D:包含了查询向量与其找到的最近邻居之间的距离。 
  • I:也是一个数组,但它包含的是最近邻居在索引中的位置或索引。

结果:


 

💥由于索引中未添加任何向量,因此无法进行有效的相似性搜索。在实际应用中,我们需要先将向量添加到索引中,然后才能进行搜索操作。


💥向索引添加向量:

nb = 100000  # 假设有100,000个向量  
xb = np.random.random((nb, d)).astype('float32')  # 生成随机向量数据,100000个64维数据
index.add(xb)  # 将向量数据添加到索引中
# 优化索引(跳过)

💯结果:

  •  后两个为实际的搜索输出(前五和后五)。

更快的搜索!

为了加快搜索速度,可以将数据集分割成块。我们在 d 维空间中定义 Voronoi 单元,每个数据库向量都位于其中一个单元中。在搜索时,仅将查询 x 所在的单元中包含的数据库向量 y 和一些相邻的向量与查询向量进行比较。

这是通过IndexIVFFlat索引完成的。这种类型的索引需要一个训练阶段,可以对具有与数据库向量相同分布的任何向量集合执行。

IndexIVFFlat需要另一个索引,即量化器,它将向量分配给 Voronoi 单元。每个单元由一个质心定义,找到向量所在的 Voronoi 单元就是在质心集合中找到向量的最近邻居。这是另一个索引的任务,通常是IndexFlatL2

nlist = 100
# nlist指定IndexIVFFlat索引中聚类中心的数量
k = 4
quantizer = faiss.IndexFlatL2(d)  
index = faiss.IndexIVFFlat(quantizer, d, nlist)
# 这个索引中,quantizer 被用作内部机制来量化向量,并将它们分配到倒排文件中的不同聚类中心

# assert 语句用于验证索引的状态,确保其在训练前后的行为符合预期。
assert not index.is_trained
index.train(xb)
print("~~训练完成~~")
assert index.is_trained
index.add(xb)                  
D, I = index.search(xq, k)     
print(I[-5:])                  
index.nprobe = 10              # 在搜索时控制要检查的聚类中心的数量
D, I = index.search(xq, k)
print(I[-5:])       

# quantizer 被“嵌入”到 index 中,是因为 index 需要使用 quantizer 的量化功能来将向量分配到正确的聚类中心,并实现高效的搜索。
  • ⭐️IndexIVFFlat索引首先将向量空间划分为nlist个聚类中心,然后使用quantizerIndexFlatL2索引)来量化这些中心。
  • ⭐️在搜索时,IndexIVFFlat索引会先确定查询向量所属的聚类中心,然后只在该中心的向量中执行搜索,从而大大减少了计算量。
  • ⭐️xb(代表数据集的一部分或全部)来训练索引。这是为了优化量化器或聚类中心。
  • ⭐️我们重新初始化了索引 index,所以第一次添加的操作就没有影响了。
  • 🌟每创建一个索引,就相当于在向量搜索的上下文中创建了一个独立的、用于存储和查询向量的数据结构。

搜索方法有两个参数:nlist,即单元格数量,以及nprobe,即执行搜索时访问的单元格数量(共nlist

🧊nprobe = 10: 

🧊nprobe = 1 :

💢设置 nprobe = nlist 会得到与强力搜索相同的结果(但速度较慢)。 

Faiss支持将索引保存到磁盘文件中,并在需要时重新加载它们。通过保存和重新加载索引,可以在不同的会话或应用程序中重用索引:

# 保存索引  
faiss.write_index(index, 'index.faiss')  
  
# 加载索引  
index = faiss.read_index('index.faiss')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# SM2 SM3 SM4 使用

目录 效果 SM2 SM3 SM4 项目 代码 SM2Utils.cs Sm3Utils.cs Sm4Utils.cs 下载 效果 SM2 公钥:04ca3e272e11b5633681cb0fbbfd8c162be08918ce5b644cd33d49c17be8674caf6c20a11de8b65333924dfe7d42246abb4a4c36b663bef1aafc624a35acf4d2b1 私钥:…

多个视频怎么合成一个视频?这10款视频合并软件大家都在用,适合手机和电脑!

如果您希望利用拍摄的片段制作出色的电影或视频故事,选择合适的视频合并软件是非常关键的。此外,视频剪辑的复杂程度可能会让人感到意外,有时简单得让人吃惊。专业的视频剪辑合并大师能够大大简化视频合并的过程,这正是它们的价值…

『功能项目』主角的信息显示【16】

本章项目成果展示 我们打开上一篇15怪物的信息显示的项目, 本章要做的事情是对主角的UI信息实时显示 创建一个脚本:UIManager.cs 创建一个空物体作为钉子钉在左上角命名为LeftUp 创建Image做为头像 将以下资源导入Art文件夹 将以下资源图片放至Art文件夹…

思维导图软件全攻略:5款软件横向对比

思维导图作为一种图形化的工具,能够帮助我们更有效地组织和表达放射性思维。在学习和工作中,思维导图的作用不可小觑,它不仅帮助我们理清思路,还能提升我们的工作效率。通过可视化的方式,思维导图将复杂的信息分解成更…

JDK原理

当我们谈论JDK(Java Development Kit)的原理时,实际上是在探讨Java语言及其开发环境背后的技术和设计思想。JDK是Java编程语言的核心工具包,它包含了Java运行环境(JRE)、Java编译器(javac&#…

U盘数据恢复哪家强?四款神器拯救你的文件!

随着科技的发展,我们越来越依赖于电子设备来储存和传输数据。然而,数据丢失的情况也时有发生,尤其是当我们的数据存储在U盘等移动设备上时。这时,U盘数据恢复软件就显得尤为重要了。本文将为大家介绍四款常用的U盘数据恢复软件&am…

按箭头上下左右来实现简单二层级树形结构

按箭头上下左右来实现简单二层级树形结构 .vue template内容 <div class"nav-container"><ul class"nav-list" :class"{ border-glow: status F }"><liv-for"(item, index) in items":key"index"click&…

iOS 18降级后遭遇“白苹果”?可试试这几种解决办法

随着苹果iOS系统的不断升级&#xff0c;用户们总是满怀期待地尝试最新的系统版本&#xff0c;但偶尔也会因为某些原因选择降级回旧版本。然而&#xff0c;iOS 18降级后遇到“白苹果”问题&#xff0c;无疑给许多用户带来了困扰。今天&#xff0c;我们就来探讨一下&#xff0c;当…

CAD二次开发IFoxCAD框架系列(26)- 分段测量多段线长度和计算多边形的面积

#region 分段测量多段线长度private static double textHight 10;[CommandMethod(nameof(PolylineDemo))]public void PolylineDemo(){using var tr new DBTrans();if(!tr.LayerTable.Has("标注")){tr.LayerTable.Add("标注",1);}var pso new PromptSel…

开绕组永磁电机驱动系统零序电流抑制策略研究(7)——基于零矢量重新分布的120°矢量解耦/中间六边形调制零序电流抑制策略

1.前言 很久没有更新过开绕组电机的仿真了。在一年前发了开绕组的各种调制策略。开绕组电机最常见的两种解耦调制就是120矢量解耦/中间六边形调制和180矢量解耦/最大六边形调制。 我当时想的是&#xff0c;180解耦调制/最大六边形调制的电压利用率最高&#xff0c;所以我就一直…

docker部署project-exam-system

使⽤docker部署project-exam-system 1. 背景&#xff0c;在⼀台主机之内&#xff0c;实现容器的编排&#xff0c;发布考试系统 2. 环境准备 1. docker 1. vim /etc/docker/daemon.json 2. docker-compos 3. 普通的部署 1. 镜像 1. 前端&#xff1a;nginx latest服务 1. 拉取…

Python实现贝叶斯优化器(Bayes_opt)优化深度森林(Deep Forest)分类模型(deepforest分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 深度森林是一种基于集成学习的机器学习方法&#xff0c;其设计灵感来源于深度学习的成功。它通过堆叠多…

2024年四款必备的Windows录屏工具推荐!

无论你是教育工作者、游戏主播、还是企业培训师&#xff0c;一款好的录屏工具都能让你的工作事半功倍。今天&#xff0c;我们就来探讨录屏工具几种不同的使用情境&#xff0c;并推荐几款适合相应情境的Windows录屏工具&#xff01; 福昕录屏大师 直达链接&#xff1a;www.fox…

云联惠涉传!商家联盟再起新秀!某店模式 三年百亿销售额!

大家好&#xff0c;我是吴军&#xff0c;任职于一家致力于软件开发领域的公司&#xff0c;担任产品经理的职位。 今天&#xff0c;我想和大家探讨一下曾经风靡一时的云联惠平台。在其全盛时期&#xff0c;该平台吸引了超过一千万的用户&#xff0c;并且资金规模达到了6000亿的…

食品种类检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

食品种类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

100%结构化输出——OpenAI新功能大幅增强工具调用

告别杂乱输出&#xff0c;OpenAI引领大模型的精准时代 ©作者|Steven 来源|神州问学 作为一名大模型的使用者&#xff0c;你是否曾通过编写极其复杂的提示词&#xff0c;以规范化模型输出的内容&#xff0c;然而结果普遍是模型输出格式与要求的格式相差甚远&#xff0c;导…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-27浅谈XILINX BRAM的基本使用

软件版本&#xff1a;VIVADO2021.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台&#xff1a;米联客-MLK-H3-CZ08-7100开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…

0826-0901 各种面试笔试题算法题整理

目录 1. 最长回文子串 2. 设计模式里和单一职责原则冲突的是&#xff1f; 3. int array[] {10,20,30} cout<<-2[array-1] 是多少 4. python 定义 class method 直接对类修改变量值和建立对象后通过对象修改变量值&#xff0c;最后的结果是多少 5. LRU缓存 6. 二叉…

Kafka【六】Linux下安装Kafka集群

Kafka从早期的消息传输系统转型为开源分布式事件流处理平台系统&#xff0c;所以很多核心组件&#xff0c;核心操作都是基于分布式多节点的。本文这里采用三台虚拟机模拟真实物理主机搭建Zookeeper集群和kafka集群。 VMware可以使用户在一台计算机上同时运行多个操作系统&…

继承(CPP)

引言 继承是CPP的一个重要语法。在现实生活中存在“子承父业”的说法&#xff0c;在CPP中同样存在这样的语法&#xff0c;而继承就是这种语法。 面向对象的三大特征&#xff1a;封装、继承、多态 本文将通过以下要素&#xff0c;进行继承的深入讲解 1.继承的概念及定义 2.基…