FAISS

FAISS

Meta 开源的稠密向量相似度检索与聚类 C++ 库,带完整 Python 封装

核心功能

FAISS 由 Meta FAIR 团队开发,用 C++ 编写并提供完整的 Python/numpy 封装。它围绕 Index 对象组织,把向量集合按不同索引结构存储,支持 L2 距离与内积(归一化后即余弦)。它是嵌入进程内的算法库,没有服务端和网络协议,常被向量数据库与检索系统当作底层引擎。相比同类库,它的索引类型覆盖面最广,并自带 GPU 实现。

功能亮点

索引即核心抽象

一切围绕 Index 对象,add 添加向量、search 做 k 近邻查询,是否需要 train 由索引类型决定

GPU 直接替换

把 IndexFlatL2 换成 GpuIndexFlatL2 即可切到 GPU,CPU 与显存之间的拷贝由库自动完成

压缩到十亿级

官方说明紧凑量化码方案不保留原始向量,代价是精度下降,换来单机内存承载十亿量级数据

倒排配乘积量化

官方 wiki 称 IndexIVFPQ 是大规模检索最有用的索引结构,查询时用 nprobe 调速度与召回

适用场景

• 为 RAG 或语义搜索系统构建本地向量索引,直接跑在 Python 服务进程内,不额外部署服务
• 在千万到十亿量级向量上做召回,用 IVF 分区加 PQ 压缩把索引内存压到可接受范围
• 对 embedding 做 k-means 聚类和检索质量评测,用官方自动调参 demo 挑选索引结构

安装配置

bash
官方支持的安装方式是 conda(INSTALL.md 原文:The supported way to install Faiss is through conda):

CPU 版(Linux x86-64/aarch64、macOS arm64、Windows x86-64):
conda install -c pytorch -c conda-forge faiss-cpu

GPU(含 CPU)版,仅 Linux x86-64:
conda install -c pytorch -c nvidia -c conda-forge faiss-gpu

带 NVIDIA cuVS 后端的 GPU 版,仅 Linux x86-64:
conda install -c pytorch -c nvidia -c rapidsai -c conda-forge libnvjitlink faiss-gpu-cuvs

夜间预发布包:
conda install -c pytorch/label/nightly -c conda-forge faiss-cpu

conda-forge 通道是必需的,用于获取最新的 BLAS 依赖(x86-64 上是 MKL,ARM 上是 OpenBLAS)。

pip 渠道:PyPI 上有 faiss-cpu wheel,官方仓库中也存在 build-pip.yml 构建工作流,但 INSTALL.md 未把 pip 列为受支持的安装方式:
pip install faiss-cpu

从源码构建(INSTALL.md):需要 C++20 编译器与 BLAS 实现,用 CMake:
cmake -B build .
make -C build -j faiss

使用方法

python
官方 wiki Getting started 的 Python 教程(代码在仓库 tutorial/ 目录下可直接运行):

import numpy as np
import faiss

d = 64                           # dimension
nb = 100000                      # database size
nq = 10000                       # nb of queries
np.random.seed(1234)             # make reproducible
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.

index = faiss.IndexFlatL2(d)   # build the index
print(index.is_trained)
index.add(xb)                  # add vectors to the index
print(index.ntotal)

k = 4                          # we want to see 4 nearest neighbors
D, I = index.search(xq, k)     # actual search
print(I[:5])                   # neighbors of the 5 first queries

数据量大时改用倒排 + 乘积量化索引(wiki 的 Faiss indexes 章节):

coarse_quantizer = faiss.IndexFlatL2(d)
index = faiss.IndexIVFPQ(coarse_quantizer, d, ncentroids, code_size, 8)
index.nprobe = 5

说明:IndexFlatL2 可以跳过训练;IVF、PQ 这类索引需要先 train 学习向量分布再 add。Python 侧矩阵必须是 float32 的 numpy 数组。

关键指标

尚未核验对标产品,此处只列本工具自身指标,不做对比结论。

指标FAISS
价格免费
开源
上手难度进阶

相关工具

优点

  • 索引类型最全:精确检索、IVF 倒排、PQ/标量量化、HNSW、LSH、残差量化在官方 wiki 索引表中都有对应类
  • GPU 实现可作为 CPU 索引的 drop-in 替换并支持多卡,README 称其是高维向量上已知最快的精确与压缩域近邻搜索实现(原文标注截至 2017 年 3 月)
  • 紧凑量化码方案不保留原始向量,官方明确其可在单台服务器内存中扩展到十亿量级
  • MIT 许可,由 Meta FAIR 持续维护,conda 通道同时提供稳定版与 nightly 预发布包

缺点

  • 官方 INSTALL.md 只把 conda 列为受支持的安装方式,pip 安装没有写进官方安装文档
  • GPU 包(faiss-gpu、faiss-gpu-cuvs)仅在 Linux x86-64 上提供,macOS 与 Windows 用不了 GPU 索引;AMD ROCm 版官方标注 not yet available
  • IndexHNSW 不支持从索引中删除向量,官方说明这会破坏图结构
  • 除 Flat 系列外,IVF、PQ 等索引都需要先 train 学习向量分布,冷启动多一步训练环节