10分钟入门faiss相似向量检索

Faiss 简介 最近在做知识库问答的时候看到了Faiss,查询了一些资料了解其原理,下面做简单记录,方便以后查阅。(Facebook AI Similarity Search)是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前较成熟的近似近邻搜索库。Faiss整体流程图如下所示:图中,Faiss主要包含两个步骤:Faiss训练和Faiss查询。 阅读详情
AI摘要

本文介绍了Faiss库,Facebook的高效向量检索工具,包括其原理、安装方法,以及如何使用代码创建、训练索引、执行相似向量查询、增删向量和保存/加载索引。实例展示了如何在Python中使用Faiss进行大规模数据处理。

一,faiss简介

faiss全称 Facebook AI Similarity Search,是FaceBook的AI团队针对大规模向量 进行 TopK 相似向量 检索  的一个工具,使用C++编写,有python接口,对10亿量级的索引可以做到毫秒级检索的性能。

使用faiss 搭配合适的model和embedding函数,可以帮助我们 构建 人脸识别,相似图片检索,LLM知识库问答,推荐系统召回模块 等应用。

faiss的主要原理是构建base vectors向量数据的index索引,然后利用索引对search vectors 实现 TopK 相似向量检索。

faiss支持许多不同的构建索引的方式,以下是一些较推荐使用的类型。

1,Flat:暴力精确检索,全局最优,适合数十万级。

2,IVF100,Flat:倒排暴力检索(100聚类后暴力检索),非全局最优但召回高,适合数百万级。

3, HNSW64: 图网络检索,Hierarchical NSW(Navigable Small World),每个节点64条边,检索复杂度log(logn),适合千万上亿规模以及更大规模的图索引,缺点是构建索引过程较慢,占用很大的存储。

公众号算法美食屋后台回复关键词:源码,获取本文notebook源代码。

二,Faiss安装

pip install faiss-cpu # faiss-gpu (一般来说cpu足够快了)

三,代码范例

import faiss
import numpy as np 

# 〇,基本参数设置
d = 64                                           # 向量维度
nb = 100000                                      # index向量库的数据量
nq = 1000                                        # 待检索query的数目
index_type = 'Flat'                              # index 类型
metric_type = faiss.METRIC_INNER_PRODUCT         # 度量(相似度/距离)类型


# 一,准备向量库向量
print('============================== 1,base vector ==============================')
np.random.seed(1234)             
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.                # index向量库的向量
faiss.normalize_L2(xb)
print('xb.shape = ',xb.shape,'\n')


# 二,准备查询向量
print('============================== 2,query vector ==============================')
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.                # 待检索的query向量
faiss.normalize_L2(xq)
print('xq.shape = ',xq.shape,'\n')

# 三,构建向量库索引
print('============================== 3,create&train ==============================')
index = faiss.index_factory(d,index_type,metric_type)    #等价于 faiss.IndexFlatIP(d)     
print('index.is_trained=',index.is_trained)    # 输出为True,代表该类index不需要训练,只需要add向量进去即可
index.train(xb)
index.add(xb)                                      # 将向量库中的向量加入到index中
print('index.ntotal=',index.ntotal,'\n')           # 输出index中包含的向量总数,为100000 


# 四,相似向量查询
print('============================== 4, search ==============================')
k = 4                       # topK的K值
D, I = index.search(xq, k)  # xq为待检索向量,返回的I为每个待检索query最相似TopK的索引list,D为其对应的距离

print('nearest vector ids:\n',I[:5],'\n')
print('metric(distances/scores) to query:\n',D[-5:],'\n')

# 五,增删索引向量
print('============================== 5, add&remove ==============================')
xa = np.random.random((10000, d)).astype('float32')
xa[:, 0] += np.arange(len(xa)) / 1000.                
faiss.normalize_L2(xa)
index.add(xa)
print('after add, index.ntotal=',index.ntotal) 
index.remove_ids(np.arange(1000,1111))
print('after remove, index.ntotal=',index.ntotal,'\n') 

# 六,保存加载索引
print('============================== 6, write&read ==============================')
faiss.write_index(index, "large.index")
index_loaded = faiss.read_index('large.index')
print('index_loaded.ntotal=', index_loaded.ntotal)

输出如下:

============================== 1,base vector ==============================
xb.shape =  (100000, 64) 

============================== 2,query vector ==============================
xq.shape =  (1000, 64) 

============================== 3,create&train ==============================
index.is_trained= True
index.ntotal= 100000 

============================== 4, search ==============================
nearest vector ids:
 [[ 207  381 1394 1019]
 [ 300  911  142  526]
 [ 838 1541  527  148]
 [ 196  359  184  466]
 [ 526  120  917  765]] 

metric(distances/scores) to query:
 [[0.87687665 0.86128205 0.85667723 0.85451   ]
 [0.8702938  0.86668813 0.85934925 0.8523142 ]
 [0.862915   0.85807455 0.85384977 0.8499449 ]
 [0.8692     0.86600477 0.8647547  0.8634621 ]
 [0.8539625  0.84914947 0.84744585 0.8432568 ]] 

============================== 5, add&remove ==============================
after add, index.ntotal= 110000
after remove, index.ntotal= 109889 

============================== 6, write&read ==============================
index_loaded.ntotal= 109889

参考文章:
1,《Faiss入门以及应用经验记录》
https://zhuanlan.zhihu.com/p/357414033

2,《ANN召回算法之HNSW》
https://zhuanlan.zhihu.com/p/379372268

公众号算法美食屋后台回复关键词:源码,获取本文notebook源代码。

Faiss实战:5分钟搞定百万级向量检索(附Python代码) 本文详细介绍了如何使用Faiss向量检索库高效处理百万级向量相似性搜索。通过对比Flat、IVF、PQ等核心索引的优缺点,并结合Python代码实战演示,指导读者进行索引选择、参数调优及性能优化,帮助开发者在推荐系统、语义搜索等场景中快速实现工程化落地。 阅读详情

相关推荐

一文读懂 Faiss:开启高维向量高效检索的大门

Faiss(Facebook AI Similarity Search),如同一位身怀绝技的武林高手,为高维向量相似性搜索带来了高效的解决方案。本文将以清晰的章节结构、完整的内容和严谨的逻辑,深入剖析 Faiss,带你领略其独特的魅力。

进一步有进一步的欢喜~ 4708

深度学习--FAISS向量数据库

faiss 是相似度检索方案中的佼佼者,是来自 Meta AI(原 Facebook Research)的开源项目,也是目前最流行的、效率比较高的相似度检索方案之一。虽然它和相似度检索这门技术颇受欢迎,在出现在了各种我们所熟知的“大厂”应用的功能中,但毕竟属于小众场景,有着不低的掌握门槛和复杂性。

积木的笔记 2万+

主流向量数据库全面解析

随着大语言模型(LLM)的快速发展,RAG(检索增强生成)技术成为解决模型“幻觉”、提升专业领域回答精度的核心方案,而向量数据库则是RAG技术的底层支撑。向量数据库专门用于存储、管理和检索高维嵌入向量(Embedding),通过高效的相似度匹配算法,快速从海量数据中找到与查询向量最相关的结果。FAISS是由Meta(原Facebook)AI团队开源的轻量级向量检索库,并非严格意义上的“完整数据库”,而是专注于高维向量的高效相似度检索的核心算法库。

h a 6 6 6 c k 为 你解决复杂难题! 1743

相似向量检索库-Faiss-简介及原理

前言 由于项目需要,需要对某些种子用户进行look-alike,找到相似用户,所以近期对相似向量检索库Faiss进行一定的了解,接下来,结合相关资料,把我对这个库的了解记录在这里,也希望对你有所帮助! 一:Faiss简介 Faiss全称(Facebook AI Similarity Search)是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前较成熟的近似近邻搜索库。 它包含多种搜索任意大小向量集(备注:向量集大小由RAM内存决定)

Catcher 3万+

SearchServer:一个基于 faiss 的检索服务

基于faiss的检索服务 1 概述 一个基于 faiss 的每日构建索引的检索服务 主要功能包括: 添加向量至索引结构 检索向量 topK Search Approximate Nearest Neighbor Search 按日期检索 删除指定id向量或范围内向量 重新配置 目录 说明 cmake cmake脚本文件 docs 项目相关文档 scripts 项目相关的脚本 src 项目源码(按模块组织) test 项目测试使用的脚本 2 使用 2.1 安装依赖 # sudo apt-get install libopenblas-dev # clone project $ git clone https://github.com/FlYWMe/SearchServer.git $ cd SearchServer 2.2 编译运行 # require cmake3 $ mkdir buil

谐振电路原理与应用场景全解析

本文全面解析了谐振电路的原理、类型及其核心应用。详细阐述了串联谐振与并联谐振的工作特性,并重点介绍了其在无线通信调谐、音频处理分频以及电力系统滤波与无功补偿等关键场景中的实际作用。通过公式推导与实例分析,帮助读者深入理解LC谐振的选频与能量交换机制。

t1u2v的博客 837

10分钟了解向量数据库

向量数据库(Vector Database),也叫矢量数据库,主要用来存储和处理向量数据。在数学中,向量是有大小和方向的量,可以使用带箭头的线段表示,箭头指向即为向量的方向,线段的长度表示向量的大小。两个向量的距离或者相似性可以通过汉明距离、欧式距离或者余弦距离得到。图像、文本和音视频这种非结构化数据都可以通过某种变换或者嵌入学习转化为向量数据存储到向量数据库中,从而实现对图像、文本和音视频的相似性搜索和检索。

zxm2015的博客 8万+

Dify 1.1.3部署避坑指南:用wait-for-it.sh解决PostgreSQL初始化失败问题

本文详细解析了Dify 1.1.3部署中遇到的插件数据库初始化失败问题,并提供了使用wait-for-it.sh脚本的实战解决方案。通过剖析Docker Compose服务依赖管理的局限性,指导用户如何改造镜像与配置,确保服务按正确顺序启动,从而有效解决数据库连接失败等部署难题。

wdx012345的博客 1003

Faiss向量检索库:10倍性能提升的AI相似性搜索终极指南

想要在亿级数据中实现毫秒级向量检索?Faiss(Facebook AI Similarity Search)正是你需要的开源向量检索神器!这个由Facebook AI研究院开发的库专为高效相似性搜索和密集向量聚类设计,能够轻松处理大规模AI应用中的向量搜索需求。 ## 🚀 为什么Faiss成为AI搜索的首选? 想象一下,你在一个拥有数百万商品图片的电商平台工作,需要为用户推荐相似商品;或者在

gitblog_00558的博客 676

灰度重心法实战:从原理到MATLAB代码实现激光条纹中心线提取

本文详细介绍了激光条纹中心线提取的核心方法——灰度重心法。通过物理类比阐释其原理,并提供从图像预处理到MATLAB代码实现的完整实战教程。文章重点解析了算法流程、关键参数调整及常见问题避坑指南,帮助读者快速掌握这一机器视觉与三维测量中的基础且高效的技术。

cake8的博客 459

飞书多维表格省钱攻略:1个专业版账号,全员合规用、权限全掌控

像运动馆、 托管班、作业辅导、少儿美术、书法、口才班等等。对于大多数中小团队而言,飞书多维表格的核心需求是“协作高效、数据可控、成本可控”,而“1个专业版账号+多联系人”的模式,恰好完美契合这三点——既不用为不必要的席位付费,又能解锁全部专业功能,还能通过精细化权限管控保障数据安全。尤其是餐饮店、乒乓球训练馆这类个体经营或小型团队,人员分工清晰、权限需求明确,采用这种模式能最大化节省成本,同时提升管理效率。无需复杂的配置,无需额外的技术支持,5分钟就能搭建起全员协作的省钱体系。

涛涛讲AI 2212

YOLO模型支持Faiss向量索引,GPU加速相似图检索

通过结合YOLO的目标检测能力与Faiss的高效向量搜索,构建可在百万级图像中毫秒级查找相似目标的智能系统。利用GPU加速,实现从‘看得清’到‘记得住、找得快’的跨越,广泛应用于工业质检、安防追踪与图像搜索等场景。

weixin_42513870的博客 807

Claude Code教程(二) | Claude Code 核心信息与使用指南

Claude Code 核心信息与使用指南

qq_20236937的博客 2182

【零基础实战】FAISS 向量检索全流程通关:环境搭建 + 文本向量化 + 相似度检索,附生产级完整代码

是 FAISS 最基础的精确检索索引,暴力计算所有向量距离,召回率 100%,无需训练,适合 10 万条以内的小数据量。# 动态获取向量维度,避免硬编码出错# 创建L2距离精确检索索引# 验证索引状态:Flat索引无需训练,创建即可用print(f"索引是否需训练:{index.is_trained}")print(f"索引当前向量数:{index.ntotal}")# 向量入库print(f"✅ 向量入库完成,索引总向量数:{index.ntotal}")

雨辰AI的博客 1228

QT应用编程: 基于UDP协议设计的大文件传输软件

一、环境介绍 QT版本: 5.12.6 编译器: MinGW 32 传输协议: UDP 功能介绍:软件由客户端和服务器组成,客户端通过 UDP协议不断循环地向服务端发送文件,文件传输速率可以达到10MB/s以上,文件传输后支持自动删除,客户端上可以支持每分钟创建一个文件并以时间戳命名,每个生成的文件可以设置大小,默认大小为6GB; 服务端收到文件之后,将文件进行存储到本地,可以指定时间自动删除文件;服务端可以动态计算传输速率,并写入日志文件; 服务器可以支持同时接收多个客户端的文件上传。...

2803

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

10倍提速!FlagEmbedding Faiss GPU向量检索实战教程

你是否还在为百万级向量检索速度慢而烦恼?当传统CPU检索需要数分钟时,GPU加速能将时间压缩到秒级。本文将带你掌握Faiss(Facebook AI Similarity Search,向量相似度搜索)的GPU加速技术,通过FlagEmbedding项目提供的工具链,实现从环境配置到多GPU集群部署的全流程落地。读完本文你将获得: - Faiss GPU版的正确安装姿势 - 单GPU/多GPU环境...

gitblog_00207的博客 1037

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

10分钟上手向量检索神器:Faiss完整学习路径与实战指南

你是否还在为海量向量数据的相似性搜索发愁?当向量规模达到百万甚至十亿级别,传统数据库的查询性能早已捉襟见肘。作为Meta开源的向量检索库,Faiss(Facebook AI Similarity Search)凭借其高效的近似最近邻搜索算法,已成为AI工程师处理密集向量的必备工具。本文将带你从环境搭建到高级应用,系统掌握Faiss的核心能力,读完你将能够: - 快速搭建Faiss开发环境(CPU...

gitblog_00772的博客 503

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

5分钟上手Faiss图像检索:从特征提取到相似图片搜索全流程

你是否还在为百万级图片库的检索速度慢而烦恼?是否因高维特征存储占用过多内存而束手无策?本文将带你用Faiss(Facebook AI Similarity Search)构建一个高性能图像检索系统,无需深厚算法背景,通过30行核心代码即可实现亿级图片的毫秒级搜索。 读完本文你将掌握: - 图像特征向量的标准化处理方法 - IVF-PQ索引的参数调优技巧 - 基于GPU加速的批量检索实现 - 工业...

gitblog_00709的博客 527

使用 FAISS 和 CLIP 构建图像相似度搜索引擎

在本教程中,我们使用 CLIP 和 FAISS 构建了一个基本的图像相似性搜索引擎。获取的图片与查询具有相似的语义含义,表明该方法的有效性。尽管 CLIP 对零样本模型显示出不错的结果,但它可能在分布外数据、细粒度任务中表现较差,并且继承了它所训练数据的自然偏差。为了克服这些限制,你可以尝试使用其他类似 CLIP 的预训练模型,如在OpenClip中,或者在你自己的定制数据集上微调 CLIP。

龙哥盟 1401

Faiss在相似句检索中的性能表现

本文深入探讨Faiss在百万级向量相似句检索中的性能优化策略,涵盖IVF、PQ、HNSW等索引机制及GPU加速实践,分析其在召回率、延迟和内存间的权衡,为构建高效语义检索系统提供选型建议与工程落地指导。

weixin_31315007的博客 344

Faiss实战:5分钟搞定Python向量检索(附GPU加速技巧)

本文详细介绍了如何使用Faiss在Python中快速实现高效向量检索,包括基础索引构建、高级索引类型选择以及GPU加速技巧。通过实战代码示例,展示了Faiss在推荐系统、图像检索等场景的应用,帮助开发者5分钟内掌握这一强大的相似性搜索工具。

pandas7gardener的博客 567

FAISS实战:5分钟搞定百万级向量相似搜索(Python代码示例)

本文详细介绍了如何使用FAISS(Facebook AI Similarity Search)实现百万级向量相似搜索的Python实战指南。通过5分钟快速上手指南、生产级优化策略和真实场景案例解析,帮助开发者高效处理大规模向量数据,提升搜索性能。FAISS作为行业标杆的向量数据库,在推荐系统和图像识别等领域具有广泛应用。

github5actions的博客 840

百万实体怎么找得快?Faiss 向量检索给知识图谱装上加速引擎

Faiss 是 Meta 出品的密集向量相似度检索库,专门解决一个问题:从海量向量里,快速找出和查询向量最相似的那几个。做知识图谱的实体链接或关系挖掘时,Faiss 向量检索能让你在百万级数据上做到毫秒级出结果。 ## Faiss 向量检索到底解决什么问题 先看一个小例子:知识图谱里有 100 万个实体描述向量,新来一个实体,要找出和它最相关的 5 个。暴力遍历意味着每次查询都算 100 万次

gitblog_00049的博客 806

AI代码开发宝库系列:FAISS向量数据库

FAISS是Facebook AI团队开源的一个超高效的向量搜索引擎,专门用于快速相似性搜索和聚类密集向量。简单来说,它能帮你解决这样一个问题:当你有成千上万个文档,用户问一个问题时,如何在毫秒级时间内找出最相关的几个文档?传统关键词搜索已经不够用了!我们需要的是语义级别的理解,而这就需要用到Embedding技术和向量数据库。FAISS真的是一个改变游戏规则的工具!它让原本复杂的向量检索变得简单高效。掌握了FAISS,你就拥有了构建各种AI应用的利器!

chenchihwen的专栏 949
上一篇: Llama深入浅出
下一篇: BaiChuan13B多轮对话微调范例
算法美食屋
博客等级 码龄9年 2万+粉丝 154原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值