#VDB|RAG|AIGC#(含代码)向量检索工具FAISS的搭建和使用教程、经验分享

news/2025/2/19 2:52:35/

请添加图片描述

向量数据库Faiss是Facebook AI研究院开发的一种高效的相似性搜索和聚类的库。它能够快速处理大规模数据,并且支持在高维空间中进行相似性搜索。

本文将依faiss使用全流程来教学gpu版的faiss如何使用

整个使用流程是:

  1. faiss环境配置
  2. 获取词向量
  3. 词向量索引获取
  4. 索引-词向量文档存储
  5. 读取索引-词向量文档
  6. 向量匹配

环境配置

pip install faiss-cpu==1.7.3
# pip install faiss-gpu==1.7.2  # gpu安装

词向量获取

词向量模型可以从大规模文本嵌入基准 (MTEB) 排行榜中选取
可选

SentenceTransformer(‘lier007/xiaobu-embedding’)

FastTextEncoder( “infgrad/stella-base-zh-v2”)

FlagModel(‘BAAI/bge-large-zh-v1.5’,query_instruction_for_retrieval=“为这个句子生成表示以用于检索相关文章:”,
use_fp16=True)

等等……

通用加载方法:

model = SentenceTransformer('你的词向量模型')
sentence_embeddings  = model.encode(texts, normalize_embeddings)

存储

sentence_embeddings = 获取到的词向量[]
dimension = sentence_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(sentence_embeddings)
faiss.write_index(index, output_path)

构建索引

上面代码中构建索引的方式是IndexFlatL2,实际上,FAISS还提供了其他构建索引的方式。不同的索引方法在不同场景下有不同的优势,你可以根据数据集大小、内存限制和搜索速度的需求来选择适当的索引类型。

1. IndexFlatL2 - 暴力检索L2

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

import faiss
d = # 向量维度
index = faiss.IndexFlatL2(d)  # 构建索引
data = ...  # 添加数据
index.add(data)  # 添加数据到索引

2. IndexIVFFlat - 倒排索引,加速,查询优化

使用倒排索引结构,将数据集划分为多个聚类空间,以加速搜索。
在查询阶段,首先定位到可能包含相似向量的聚类中心,然后在该聚类中心附近进行精确搜索。
请添加图片描述

import faiss
d = # 向量维度
nlist = # 聚类空间
k = # 返回结果个数
quantizer = faiss.IndexFlatL2(d)  # 量化器
index = faiss.IndexIVFFlat(quantizer, d, nlist)  # 构建索引
index.nprobe = 20  # 查找聚类中心的个数
index.train(data)  # 训练
index.add(data)  # 添加数据到索引

3.IndexIVFPQ - 省空间超快

使用 Product Quantization(PQ)技术进行有损压缩,以节省内存。
在查询阶段,返回近似结果。请添加图片描述

请添加图片描述

请添加图片描述

import faiss
d = # 向量维度
m =   # 空间拆分
nlist = # 聚类空间
k = # 返回结果个数
quantizer = faiss.IndexFlatL2(d)
index = faiss.IndexIVFPQ(quantizer, d, nlist, m, 8)  # 每个向量用8 bits 编码
index.nprobe = 20  # 查找聚类中心的个数
index.train(data)  # 训练
index.add(data)  # 添加数据到索引

4.IndexHNSWFlat-图索引

请添加图片描述
Regular Graph:图中每个顶点具有相同数目的邻居。
Random Graph:图中每个顶点的邻居数是随机的。
Small World Graph:介于Regular与Random之间;局部同类顶点的连接呈现出regular,全局不同类顶点的连接呈现出random。
构建好small world graph后,随机选择一个起始点,逐个遍历其邻接点,选择与目标最近的顶点继续遍历,直到找到最近的顶点。这个过程称之为NSW(Navigable small world)。

HNSW是Hierarchical Navigable Small World的缩写,即分层的NSW。整体可分为图构造过程和图检索过程。

请添加图片描述
上图描述了图构造过程。layer=0包含数据集中所有节点,layer=l以50%概率从layer=l-1层中选择的点构成。在每层的NSW图中查找m个近邻,然后连接它他。

请添加图片描述

对HNSW进行查询时,从最高层检索,逐层往下进行。

构建索引的方式对比与选择

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

如果需要确切结果的话,则需要使用IndexFlatL2 或者 IndexFlatIP。

2 基于内存的考量
如果不关注(如内存较大或数据集较小),则HNSW是最好的选择,它不仅快而且准。比HNSW更快的选择是IVF1024,PQNx4fs,RFlat。

如果稍微考虑的话,则采用先聚类再Flat索引的方式。

如果比较重要的话,则采用OPQM_D,…,PQMx4fsr。 其中OPQ用来降维,PQ对向量进行量化。

如果非常重要,则采用OPQM_D,…,PQM。其中D和M有特定要求。

3 考虑数据集大小
如果数据集大小在1M以下,则采用…,IVFK,…。

如果数据集大小在1M~10M,则采用 …,IVF65536_HNSW32,…。训练向量数建议在 30 * 65536 and 256 * 65536之间。

如果数据集大小在10M~100M,则采用…,IVF262144_HNSW32,…。训练向量数建议在 30 * 262144 and 256 * 262144之间。

如果数据集大小在100M~1B,则采用…,IVF1048576_HNSW32,…。训练向量数建议在30 * 1048576 and 256 * 1048576之间。

覆盖

读取

index = faiss.read_index(index_path)

搜索

search = model.encode(["有问题这个功能"])D, I = index.search(search, topK=5)for k in I[0]:print(texts2[k])pass

在这里插入图片描述


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

相关文章

「阿里云」幻兽帕鲁个人服务器已上线,3分钟快速搭建

基于阿里云搭建幻兽帕鲁服务器方法,1到2分钟部署完成,稳定运行无卡顿,阿里云服务器网aliyunfuwuqi.com分享保姆级手把手教程,基于阿里云计算巢、云服务器或无影云桌面都可以: 基于阿里云幻兽帕鲁服务器创建教程 基于…

Java数组-初识数组

签名:但行好事,莫问前程。 文章目录 前言一、数组的概述1、数组中的概念2、数组的特点 二、数组的声明与初始化1、先声明后初始化2、声明的同时直接初始化3、静态初始化数组4、动态初始化数组 三、数组的赋值与取值1、给数组的元素赋值2、遍历数组的元素…

Camera2+OpenGL ES+MediaCodec+AudioRecord实现录制音视频写入H264 SEI数据

记录一下学习过程,得到一个需求是基于Camera2OpenGL ESMediaCodecAudioRecord实现录制音视频。 需求: 在每一帧视频数据中,写入SEI额外数据,方便后期解码时获得每一帧中的自定义数据。点击录制功能后,录制的是前N秒至…

MySQL基础(三)-学习笔记

一.innodb引擎: 1). 表空间:表空间是InnoDB存储引擎逻辑结构的最高层,启用了参数 innodb_file_per_table(在 8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd),一个mysql实例可以对应多个…

mac电脑风扇控制软件:Macs Fan Control Pro for mac 激活版

Macs Fan Control 是一款专门为 Mac 用户设计的软件,它可以帮助用户控制和监控 Mac 设备的风扇速度和温度。这款软件允许用户手动调整风扇速度,以提高设备的散热效果,减少过热造成的风险。 Macs Fan Control 可以在菜单栏上显示当前系统温度和…

记一次某竞赛中的渗透测试(Windows Server 2003靶机漏洞)

靶机简介 Windows Server 2003是微软公司于2003年3月28日发布的服务器操作系统,它基于Windows XP/Windows NT 5.1进行开发,并在同年4月底上市。以下是关于Windows Server 2003的详细介绍: 系统名称与发布历程: 该产品最初被命名为…

【操作系统和计网从入门到深入】(八)线程

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记,所以如果是博主比较熟悉的知识点,博主可能就直接跳过了,但是所有重要的知识点,在这个专栏里面都会提到!而且我也一定会保证这个专栏知识点的完整性&…

洗地机哪个牌子好性价比高又实惠?全能型洗地机推荐

近年来,在家居清洁工具中,洗地机出镜率非常高,是我们生活中常备的清洁工具之一,尤其在繁忙的工作之余,还要给家里做大扫除清洁的人儿。然而,市面上的洗地机品牌繁多,产品功能各异,如…