核心功能
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 学习向量分布,冷启动多一步训练环节