首页/AI/RAG 与向量库速查/FAISS 定位与核心对象

FAISS 定位与核心对象

FAISS 是面向稠密向量的相似度检索库(不是服务):提供索引结构、量化与 GPU 加速,嵌入到应用进程内使用;没有集合管理、过滤与持久化服务,这些需要自行实现。

RAG 与向量库速查AI更新于 2026-10-13

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 与预期条数,防止读错版本
  • 启动耗时:索引较大时加载需要时间,放入常驻服务而非每次请求重建
  • 版本记录:把构建时间、数据快照标识写进索引元数据文件,便于判断新鲜度
索引文件常随应用镜像分发会造成体积失控:把索引放到对象存储或数据卷,启动时按需加载,并记录索引的构建时间与版本,便于判断是否需要重建。

易错点

  • 把 FAISS 当独立服务规划高可用,忽略它不是服务端的定位
  • 索引文件随应用镜像分发,镜像体积失控且更新需要重新构建镜像
  • IVF/PQ 忘记先 train 直接 add,运行时报错或索引无效
  • 多进程部署时每个进程各加载一份完整索引,内存被成倍消耗
  • 索引加载后未校验 ntotal,读到旧版本索引却毫无察觉

数据来源与参考

  • FAISS 官方文档(Getting started / Faiss indexes)
  • FAISS wiki(Guidelines to choose an index)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌