1. Faiss能解决什么问题?

为了比较两个结构化的数据是否相似,例如两张图片是不是类似,两段文本表达的含义是否类似,则需要将非结构化的数据先转成向量数据,然后再进行相似度比较。

如何通过向量化技术比较非结构化数据,可以参考:https://www.cnblogs.com/twosedar/p/18973770

问题来了,在一群数据中找到两个相似度最高的向量数据,最常用的是暴力搜索法,也就是逐一遍历所有向量,计算距离(如欧氏距离、余弦相似度),虽准确,但时间复杂度高,无法处理百万级以上数据。

这个问题在2015年严重困扰了Facebook公司的技术团队,因为作为当时世界上最大的社交网站,时刻要处理数十亿的图片,然后根据用户喜好推荐相似的内容。

于是Facebook成立专门的项目组开展了研究,最终在2017年取得重大突破,研发出了Faiss(Facebook AI Similarity Search),专门用于解决大规模向量数据的快速搜索问题。Faiss可以在17.7微秒完成10亿图像搜索。而传统的暴力搜索算法,往往需要数小时。

2017年3月项目组发表论文《Billion-scale similarity search with GPUs》公开了核心技术(论文地址 https://arxiv.org/pdf/1702.08734 ),开源了源代码(代码地址:https://github.com/facebookresearch/faiss)。

Faiss的发布引起了业界轰动。

2. Faiss具体是什么?

Faiss本质是一个算法库,核心能力是快速完成大规模(例如十亿规模)向量数据的相似度搜索。它的关键能力是解决了大规模向量检索慢的问题。

它使用 C++语言 实现,并提供 Python封装的库和接口。

业界有人会称Faiss是向量数据库,但Faiss不是传统意义上的数据库,因为它并不具备数据持久化存储的能力,但它是很多向量数据库(例如Milvus)的核心引擎,因为向量数据库最核心的能力就是相似度搜索。

Faiss有点像向量搜索时代的“Linux内核”。

3. Faiss具体长什么样子?

可以通过一个Python代码中调用Faiss库看一下Faiss具体长什么样子。

首先,如果想在python中使用Faiss,则需要安装Faiss库。

Faiss提供CPU和GPU版本,如果做简单验证,可以使用CPU版本。可以使用pip安装

# pip install faiss-cpu

然后编写一段代码,利用Faiss在模拟数据(10个4维向量)中找到和被搜索向量相似度最近的3个向量,并打印出来。

# 步骤1(前置条件):安装Faiss(CPU版)
# pip install faiss-cpu import numpy as np
import faiss # 步骤2:创建模拟数据(10个4维向量)
dim = 4 # 向量维度
database = np.array([
[0.1, 0.2, 0.3, 0.4],
[0.5, 0.6, 0.7, 0.8],
[0.9, 1.0, 1.1, 1.2],
[0.3, 0.2, 0.1, 0.1],
[1.0, 0.5, 0.0, 0.5],
[0.2, 0.3, 0.4, 0.5],
[0.7, 0.8, 0.9, 1.0],
[0.0, 0.1, 0.2, 0.3],
[0.4, 0.5, 0.6, 0.7],
[0.6, 0.7, 0.8, 0.9]
], dtype='float32') # 步骤3:创建Faiss索引(最简单的平面索引)
index = faiss.IndexFlatL2(dim) # 指定Faiss通过计算向量间L2距离(欧氏距离)作为索引类型
# 其他的索引类型还有很多,例如IndexIVFFlat(倒排索引),IndexIVFPQ(量化索引)等 # 步骤4:添加模拟数据到索引中
index.add(database)
print(f"索引包含向量数: {index.ntotal}") # 步骤5:执行相似度搜索
query_vector = np.array([[0.25, 0.25, 0.25, 0.25]], dtype='float32') # 自定义一个被查询的向量
k = 3 # 返回最相似的3个结果 distances, indices = index.search(query_vector, k) # 核心代码,使用Faiss索引搜索相识度最近的3个结果 # 步骤6:解读结果
print("\n=== 搜索结果 ===")
print(f"查询向量: {query_vector[0]}")
print(f"最相似的{k}个向量索引: {indices[0]}")
print(f"对应距离: {distances[0]}") # 打印具体向量
print("\n匹配的向量:")
for i, idx in enumerate(indices[0]):
print(f"Top {i+1}: {database[idx]} (距离: {distances[0][i]:.4f})")

以上代码的打印结果

索引包含向量数: 10

=== 搜索结果 ===

查询向量: [0.25 0.25 0.25 0.25]

最相似的3个向量索引: [0 3 7]

对应距离: [0.05 0.05 0.09]

匹配的向量:

Top 1: [0.1 0.2 0.3 0.4] (距离: 0.0500)

Top 2: [0.3 0.2 0.1 0.1] (距离: 0.0500)

Top 3: [0. 0.1 0.2 0.3] (距离: 0.0900)

4. Faiss发展里程碑

1)2017年:横空出世

论文《Billion-scale similarity search with GPUs》发表

首秀即巅峰:在Deep1B数据集刷新10亿向量搜索速度纪录。

2)2020年:催生新物种

基于Faiss 的专业向量数据库崛起,典型代表是 Milvus。

3)2023至今:大模型时代基础设施

Faiss成为RAG(检索增强生成)的核心组件。

Faiss能解决什么问题?Faiss是什么?的更多相关文章

  1. Faiss in python and GPU报错:NotImplementedError: Wrong number or type of arguments for overloaded function 'new_GpuIndexFlatL2'.

    最近在玩faiss,运行这段代码的时候报错了: res = faiss.StandardGpuResources()flat_config = 0index = faiss.GpuIndexFlatL ...

  2. faiss学习

    faiss 学习 github wiki 介绍 Faiss:Facebook开源的相似性搜索类库 安装 在Mac系统编译安装Faiss faiss教程跟进--Makefile 编译 faiss安装 m ...

  3. Faiss流程与原理分析

    1.Faiss简介 Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库.它包含多种搜索任意大 ...

  4. milvus和faiss安装及其使用教程

    写在前面 高性能向量检索库(milvus & faiss)简介 Milvus和Faiss都是高性能向量检索库,可以让你在海量向量库中快速检索到和目标向量最相似的若干个向量,这里相似度量标准可以 ...

  5. Faiss教程:入门

    Faiss处理固定维度d的数据,矩阵每一行表示一个向量,每列表示向量的一项.Faiss采用32-bit浮点型存储. 假设xb为数据集,维度为\(nb\times{d}\):xq是查询数据,维度为\(n ...

  6. Faiss学习:一

    在多个GPU上运行Faiss以及性能测试 一.Faiss的基本使用 1.1在CPU上运行 Faiss的所有算法都是围绕index展开的.不管运行搜索还是聚类,首先都要建立一个index. import ...

  7. faiss的简单使用

    简介 faiss是为稠密向量提供高效相似度搜索和聚类的框架.由Facebook AI Research研发. 具有以下特性. 1.提供多种检索方法 2.速度快 3.可存在内存和磁盘中 4.C++实现, ...

  8. [python] 向量检索库Faiss使用指北

    Faiss是一个由facebook开发以用于高效相似性搜索和密集向量聚类的库.它能够在任意大小的向量集中进行搜索.它还包含用于评估和参数调整的支持代码.Faiss是用C++编写的,带有Python的完 ...

  9. IndexFlatL2、IndexIVFFlat、IndexIVFPQ三种索引方式示例

    上文针对Faiss安装和一些原理做了简单说明,本文针对标题所列三种索引方式进行编码验证. 首先生成数据集,这里采用100万条数据,每条50维,生成数据做本地化保存,代码如下: import numpy ...

  10. Centos 7.3 编译 & 安装 & 测试 facebook faiss

    许多 AI 系统训练完毕,正式上线时的基本操作往往可以抽象为:在高维向量空间中,给定一个向量,寻找与之最相近的 k 个向量.当向量数目异常巨大时,如何快速地执行这一基本操作,便成为 AI 系统在工程应 ...

随机推荐

  1. 解决 windows 10 WSL 安装Ubuntu后 屏幕亮度飙至最高 且屏幕亮度无法调节 外接显示器无法显示 的问题

    转载请注明出处:博客园 博主Bubgit https://www.cnblogs.com/Bubgit/p/16367937.html 问题现象 自从windows 10推出了 wsl (Window ...

  2. 请详细描述 MySQL 的 B+ 树中查询数据的全过程

    MySQL 的 B+ 树中查询数据的全过程 在 MySQL 中,B+ 树被广泛用于实现索引,特别是 InnoDB 存储引擎中的聚簇索引.B+ 树是一种平衡树,具有良好的查询性能.本文将详细描述在 B+ ...

  3. JVM 垃圾回收时产生的 concurrent mode failure 的原因是什么?

    JVM 垃圾回收时产生的 concurrent mode failure 的原因是什么? 在 JVM 中,concurrent mode failure 是垃圾回收器(通常是 CMS,即 Concur ...

  4. ArcGIS拼接、镶嵌同一空间位置的不同遥感影像

      本文介绍在ArcGIS下属的ArcMap软件中,对处于同一空间位置的多幅栅格图像加以拼接.融合与叠加等操作的方法.   假如现在我们分别有以下三幅栅格图像,三者分别是独立的三个图层.第一个图层如下 ...

  5. 操作系统综合题之“用记录型信号量机制的wait和signal操作来解决了由北向南和由南向北过河人的同步问题(独木桥问题-代码补充)”

    1.问题:一条哦东西走向河流上,有一根南北走向的独木桥,要想过河只能通过这根独木桥.只要人们朝着相同的方向过独木桥,同一时刻允许有多个人可以通过.如果在相反的方向上同时有两个人过独木桥则会发生死锁.如 ...

  6. TensorFlow 基础 (02)

    前面对 tensorflow 的基础数据类型, 数值, 字符串, 布尔等, 有初步认识,尤其是重点的 tensor 张量, 包含了, 标量, 向量, 矩阵 ... 这样的基本概念. 我现在回过头来看, ...

  7. K8S+nginx+MYSQL+TOMCAT高可用架构企业自建网站

    以下是基于 多Master高可用Kubernetes集群 的企业级部署详细步骤,涵盖 Nginx Ingress + MySQL高可用集群 + Tomcat负载均衡 的完整流程: 一.前置条件准备 1 ...

  8. golang+gin实现api接口开发

    一.简介: Gin是Go语言的一个微框架,也是是一个用 Go (Golang) 编写的 HTTP Web 框架,封装比较优雅,API相对友好.Gin具有性能优异和灵活快速等优点.它具有类似 Marti ...

  9. 告别安装烦恼!Linux下MySQL一站式部署宝典

    前言 本次安装部署主要针对Linux环境进行安装部署操作,系统位数64 getconf LONG_BIT 64 MySQL版本: v5.7.38 一.下载MySQL MySQL下载地址:https:/ ...

  10. Java catch多重异常捕获

    摘要:Java中多重异常捕获机制可以更加简洁.有效地处理多个异常,提高了程序的鲁棒性,是编写高质量代码的重要技巧之一.   小编在<浅谈Java异常处理机制>中梳理了异常处理机制,在< ...