Faiss(Facebook AI Similarity Search)是由Meta(原Facebook)开发的高效相似性搜索和密集向量聚类库,专为处理大规模向量数据设计。以下是其核心要点:


1. 核心功能与优势

  • 高效检索:支持亿级向量的毫秒级搜索,尤其适合高维数据(如文本、图像嵌入向量)。
  • 多算法支持:提供多种索引类型(如IVFHNSWPQ),平衡速度、精度和内存。
  • 跨平台:支持CPU/GPU加速,提供PythonC++接口,适配不同硬件环境。
  • 内存优化:通过量化(如乘积量化)减少内存占用,支持非RAM数据。

2. 安装方法

  • Linux
    1
    2
    3
    4
    # CPU版本
    pip install faiss-cpu
    # GPU版本(需CUDA)
    pip install faiss-gpu
  • Windows:需通过Conda安装:
    1
    2
    conda install -c pytorch faiss-cpu  # CPU
    conda install -c pytorch faiss-gpu # GPU

3. 基础使用示例

3.1 创建索引与添加数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import faiss
import numpy as np

d = 64 # 向量维度
nb = 10000 # 数据库向量数

# 生成随机数据(需转为float32)
np.random.seed(42)
xb = np.random.random((nb, d)).astype('float32')

# 创建L2距离索引
index = faiss.IndexFlatL2(d)
index.add(xb) # 添加数据到索引
print(index.ntotal) # 输出:10000

3.2 相似性搜索

1
2
3
4
5
6
7
8
nq = 5  # 查询数量
k = 3 # 返回最近邻数量
xq = np.random.random((nq, d)).astype('float32')

# 执行搜索(返回距离和ID)
D, I = index.search(xq, k)
print("距离矩阵:\n", D)
print("索引ID矩阵:\n", I)

输出示例:

1
2
距离矩阵: [[15.3 16.1 18.9] ... ]
索引ID矩阵: [[234 642 860] ... ]

4. 高级索引与优化

  • IVF(倒排文件):通过聚类加速,减少搜索范围:
    1
    2
    3
    4
    5
    nlist = 100  # 聚类中心数
    quantizer = faiss.IndexFlatL2(d)
    index = faiss.IndexIVFFlat(quantizer, d, nlist)
    index.train(xb) # 需先训练
    index.add(xb)
  • PQ(乘积量化):压缩向量,降低内存:
    1
    2
    3
    m = 8  # 子向量数
    bits = 8 # 每子向量比特数
    index = faiss.IndexIVFPQ(quantizer, d, nlist, m, bits)

5. 适用场景

  • 人脸识别:快速匹配人脸特征向量。
  • 推荐系统:检索相似用户/物品嵌入。
  • NLP:查找语义相近的文本向量(如BERT输出)。

6. 性能对比

  • vs 纯NumPyFaiss在亿级数据下快数百倍,尤其GPU版本优势显著。
  • 精度权衡:部分索引(如IVF)牺牲少量精度换取速度/内存优化。

参考资料

  • Faiss安装与基础使用
  • 索引原理与高级功能
  • 实际应用案例与性能优化