FAISS 的定位
FAISS 是面向稠密向量的相似度检索库,不是服务:它提供索引结构、量化与 GPU 加速能力,作为库被嵌入到应用进程中使用。集合管理、元数据过滤、副本与持久化服务这些数据库特性它一概没有,需要应用自己实现。常见用法是离线评测的精确基线、批量去重,或数据量不大且希望零运维的嵌入式检索。索引驻留在进程内存里,多实例部署时每个实例各持一份,内存要按实例数乘算。
基本信息
| 定位 | 库(library),非独立数据库服务 |
|---|---|
| 核心对象 | Index(索引)、IndexIDMap(id 映射)、量化器 |
| 安装 | pip install faiss-cpu;GPU 版为 faiss-gpu |
| 持久化 | write_index / read_index 手动保存与加载 |
| 训练要求 | IVF、PQ 等索引需要先 train,Flat/HNSW 可直接 add |
典型使用场景
- 评测基线:用 IndexFlat 的精确结果衡量近似索引的召回损失
- 批量去重:对海量文本向量做近邻查找,识别重复与近似重复内容
- 嵌入式检索:数据量在百万级内、不想额外运维数据库服务的场景
- 索引选型实验:同一份数据在 Flat、IVF、HNSW、IVFPQ 上对比召回与延迟
- 本地开发:离线环境无外部依赖即可跑通检索链路
安装与索引持久化
安装与索引持久化
import faiss, numpy as np
print(faiss.__version__)
index = faiss.IndexFlatIP(384)
index.add(np.random.rand(1000, 384).astype('float32'))
faiss.write_index(index, 'kb.faiss') # 落盘
loaded = faiss.read_index('kb.faiss') # 加载
print(loaded.ntotal) # 向量条数,用于校验常用索引与取舍
| 索引 | 是否需训练 | 特点 |
|---|---|---|
| IndexFlatL2/IP | 否 | 精确检索,数据量小时首选基线 |
| IndexIVFFlat | 是 | 聚类粗排,nprobe 控制精度与速度 |
| IndexHNSWFlat | 否 | 图索引,查询快、内存占用高 |
| IndexIVFPQ | 是 | 量化压缩,内存大幅下降、精度有损 |
工程配套做法
- ID 映射:需要业务侧主键时用 IndexIDMap 包一层,避免自己维护位置到下标的映射
- 加载校验:读取索引后比对 ntotal 与预期条数,防止读错版本
- 启动耗时:索引较大时加载需要时间,放入常驻服务而非每次请求重建
- 版本记录:把构建时间、数据快照标识写进索引元数据文件,便于判断新鲜度
索引文件常随应用镜像分发会造成体积失控:把索引放到对象存储或数据卷,启动时按需加载,并记录索引的构建时间与版本,便于判断是否需要重建。