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

news/2024/4/15 13:15:45

请添加图片描述

向量数据库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的详细介绍: 系统名称与发布历程: 该产品最初被命名为…

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

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

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

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

非内积级联学习

1.首页推荐非内积召回现状 非内积召回源是目前首页推荐最重要的召回源之一。同时非内积相比于向量化召回最终仅将user和item匹配程度表征为embeding内积,非内积召回仅保留item embedding,不构造user显式表征,而是通过一个打分网络计算用户-商…

一、冯诺依曼计算机

图灵与冯诺依曼两位计算机发展重要人物。冯诺依曼简介:被誉为现代计算机之父。 世界上第一台通用计算机Eniac,就有冯诺依曼的参与。他提出的思想,将数据和程序分离开了,程序是程序,数据是数据,数据可以由程…

(十六)串口UART

文章目录 UART简介传输数据帧和波特率定时器1作为串口1波特率发生器串口部分相关寄存器TMODAUXRPCONSCONSBUF 串口1工作模式1:8位UART,波特率可变总体工作原理如何简单接收一个字符和发送数据一步之遥的设置现象演示 UART简介 通用异步收发传输器(Unive…

基于 Echarts 的 Python 图表库:Pyecahrts交互式的K线图(股票)

目录 一、K线图的介绍 二、K线图的使用场景 1. 趋势分析 2. 支撑与阻力 3. 价格反转 4. 交易信号 5. 波动性分析 三、Pyecharts绘制K线图 四、总结 一、K线图的介绍 K线图(K-Line Chart)是用于显示金融市场价格走势的一种图表形式,主…

贪吃蛇小游戏

🌈个人主页:小田爱学编程 🔥 系列专栏:c语言从基础到进阶 🏆🏆关注博主,随时获取更多关于c语言的优质内容!🏆🏆 😀欢迎来到小田代码世界~ &#x…

爬虫学习笔记-Cookie登录古诗文网

1.导包请求 import requests 2.获取古诗文网登录接口 url https://so.gushiwen.cn/user/login.aspxfromhttp%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx # 请求头 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …

AI智能分析+明厨亮灶智慧管理平台助力“舌尖上的安全”

春节是中国最重要的传统节日之一,在春节期间,人们聚餐需求激增,餐饮业也迎来了高峰期。在这个时期,餐饮企业需要更加注重食品安全和卫生质量,以保证消费者的健康和权益,明厨亮灶智慧管理成为了餐饮业中备受…

c# cad PromptSelectionResult批量选择 PromptEntityOptions选择单个实体介绍

一、PromptSelectionResult : 是 AutoCAD .NET API 中的一个类,位于 Autodesk.AutoCAD.EditorInput 命名空间下。它代表了用户在 AutoCAD 编辑器中进行图形对象选择操作的结果。 当你通过 Editor 类的 GetSelection() 方法(或者其他类似的方…

Codeforces Round 922 (Div. 2)(A~D)补题

A题考虑贪心,要使使用的砖头越多,每块转的k应尽可能小,最小取2,最后可能多出来,多出来的就是最后一块k3,我们一行内用到的砖头就是 m 2 \frac{m}{2} 2m​下取整,然后乘以行数就是答案。 #inclu…

UE5 虚幻游戏报错常用解决方法(幻兽帕鲁UE5报错)

在体验使用虚幻引擎5、4(UE5/UE4)开发的游戏如《幻兽帕鲁》时,玩家可能会遇到各种报错情况,例如黑屏、闪退、C运行时错误等。本博客将汇集一系列有效解决方案,通过调整虚幻引擎内置命令行参数以及优化系统环境&#xf…

Java进阶:集合进阶统计次数(双列集合HashMap 单列集合Set):实现景点被选择的次数统计

~ 景点次数统计 * 某个班级80名学生,现在需要组成秋游活动,* 班长提供了四个景点依次是(A,B, C, D),* 每个学生只能选择一个景点,请统计出最终那个景点想去的人数最多*/代码示例: public static…

瑞萨RL78G12系列单片机使用IAR软件进行仿真设置及与E2接线

目录 一、单片机与仿真器连接 二、IAR软件在线仿真使用手册 一、单片机与仿真器连接 E1引脚接线图 RL78系列单片机的GND接仿真器的pin2、pin12、pin14 RL78系列单片机的VDD接仿真器的pin8 RL78系列单片机的Tool0接仿真器的pin5 RL78系列单片机的Reset接仿真器的pin10、pin…
最新文章