写点什么

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

  • 2025-07-14
    福建
  • 本文字数:1911 字

    阅读完需:约 6 分钟

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 npimport 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(检索增强生成)的核心组件。


文章转载自:两棵雪松

原文链接:https://www.cnblogs.com/twosedar/p/18982109

体验地址:http://www.jnpfsoft.com/?from=001YH


用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Faiss能解决什么问题?Faiss是什么?_Faiss_不在线第一只蜗牛_InfoQ写作社区