当前位置: 首页 > news >正文

Faiss能解决什么问题?Faiss是什么?

1. Faiss能解决什么问题?

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

如何通过向量化技术比较非结构化数据,可以参考:如何通过向量化技术比较两段文本是否相似? - 两棵雪松 - 博客园

问题来了,在一群数据中找到两个相似度最高的向量数据,最常用的是暴力搜索法,也就是逐一遍历所有向量,计算距离(如欧氏距离、余弦相似度),虽准确,但时间复杂度高,无法处理百万级以上数据。这个问题在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-cpuimport 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是什么? - 两棵雪松 - 博客园

体验地址:JNPF快速开发平台

http://www.lryc.cn/news/588085.html

相关文章:

  • 【数据结构初阶】--单链表(二)
  • Kafka Broker源码解析(上篇):存储引擎与网络层设计
  • 【html基本界面】
  • [spring6: ResolvableType TypeDescriptor ConversionService]-类型系统
  • [笔记] 动态 SQL 查询技术解析:构建灵活高效的企业级数据访问层
  • 电力协议处理框架C++版(三)
  • 打破空间边界!Nas-Cab用模块化设计重构个人存储逻辑
  • SwiftUI 全面介绍与使用指南
  • AI数字人正成为医药行业“全场景智能角色”,魔珐科技出席第24届全国医药工业信息年会
  • 【微信小程序】
  • 1.2.2 高级特性详解——AI教你学Django
  • vue3 服务端渲染时请求接口没有等到数据,但是客户端渲染是请求接口又可以得到数据
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘sqlite3’问题
  • 第一章编辑器开发基础第一节绘制编辑器元素_4输入字段(4/7)
  • Django基础(一)———创建与启动
  • Django Admin 配置详解
  • uni-app 选择国家区号
  • 第二章 uniapp实现兼容多端的树状族谱关系图,封装tree-item子组件
  • 《星盘接口2:NVMe风暴》
  • Python 变量与简单输入输出:从零开始写你的第一个交互程序
  • Spring的`@Value`注解使用详细说明
  • vue3+uniapp 使用vue-plugin-hiprint中实现打印效果
  • 【数据同化案例1】ETKF求解参数-状态联合估计的同化系统(完整MATLAB实现)
  • 微算法科技技术创新,将量子图像LSQb算法与量子加密技术相结合,构建更加安全的量子信息隐藏和传输系统
  • 简单易用的资产跟踪器DumbAssets
  • uni-app在安卓设备上获取 (WIFI 【和】以太网) ip 和 MAC
  • 游戏设备软件加密锁复制:技术壁垒与安全博弈
  • 高安全前端架构:Rust-WASM 黑盒技术揭秘
  • 多云环境下的统一安全架构设计
  • 从 JSON 到 Python 对象:一次通透的序列化与反序列化之旅