进阶 11 分钟Stack

FAISS:为检索提供支持的库 vectorielle

直接回答

FAISS(Facebook AI Similarity Search)是由Meta人工智能研究团队开发、采用MIT许可证的开源库,用于查找与给定向量最接近的向量。它不是数据库:没有服务器、没有元数据过滤,也没有内置持久化功能。截至2026年9月底,其GitHub星标数超过41,000,并被多个向量数据库用作内部引擎。

FAISS 是一个稠密向量相似性搜索库,主要由 Meta 的基础人工智能研究团队开发,被众多从不提及它的工具用作内部组件。它不是数据库:没有服务器、元数据过滤、访问控制或持久化功能。对于单进程的本地文档处理链,它是能满足需求的最轻量方案——但一旦涉及访问权限或多个写入进程,它就不再是合适的工具。

作者: Mohamed Meguedmi·更新于 2026-09-28·已在 Windows、macOS 和 Linux 上测试

#一个库,而非一个数据库

人们常将 FAISS 与向量数据库相提并论,仿佛它们是替代品。但它们不属于同一类别。向量数据库是一项服务,具备 API、存储、过滤和权限管理功能。FAISS 则是一个组件:用 C++ 编写,并配有完整的 Python 和 NumPy 封装。你给它输入向量,它在内存中构建索引,并回答“哪些向量与这个向量最接近”这一问题。许多向量数据库在内部使用 FAISS 或类似技术。该项目采用 MIT 许可证发布,截至 2026 年 9 月底,GitHub 星标数超过 41 000,其作者指出,其部分方法可在单台服务器上扩展至主内存中数十亿个向量的规模。

实际而言,选择 FAISS 就意味着接受自行负责其余所有工作:将索引保存到磁盘、重新加载索引、确保索引与您的文档保持一致、建立向量位置与其来源文本之间的关联,以及决定两个进程同时尝试写入时该如何处理。这些功能都不是默认提供的;这是项目有意作出的架构选择,而非疏漏。

#具有实际价值的索引

本地 RAG 工具包

你的文档,你的 AI:基于你的 PDF、笔记和邮件的可靠本地 RAG——无需向云端发送任何内容。

  • 在线空间,终身可用
  • PDF + 文件
  • 30 天内退款
四类索引,三项权衡
Index它如何搜索何时使用
精确搜索(Flat)与所有向量进行比较可达数万级:结果精确,无需调整,实际运行速度足够快
IVF(倒排分区)将空间划分为多个簇,仅搜索其中少数分区适用于数十万及以上的规模;需要先用有代表性的数据进行训练
HNSW(近邻图)在链接图中导航可用 RAM 充足或语料库较小:速度快、精度高,但不支持删除向量
PQ / OPQ(乘积量化)以M字节编码存储压缩向量当索引无法再装入内存时:精度有所下降,内存占用则下降得更多
RaBitQ(最大压缩)每维压缩至1位,额外增加少量开销内存不足时的最后手段,通过随机旋转步骤保持良好的精度

最能节省时间的建议是:先从精确搜索开始。近似索引是为解决规模问题而设计的;在还没有遇到这个问题时就采用它们,相当于用增加参数调优和召回率测量工作的代价,换取谁都没有察觉的几毫秒提升。对于本地语料库的规模而言,检索几乎从来不是耗时的环节——最终用户感受到的响应时间,主要由语言模型的生成过程决定。

#使用 Python 起步所需的基本内容

  1. 01
    安装库
    pip install faiss-cpu installe le paquet officiel PyPI (version 1.15.1 fin septembre 2026). Pour la variante GPU, le projet documente une installation via conda : conda install -c pytorch -c nvidia -c conda-forge faiss-gpu=1.15.1.
  2. 02
    构建精确索引
    index = faiss.IndexFlatL2(dimension) 创建一个用于向量检索的精确索引,向量维度与您嵌入模型的维度一致。
  3. 03
    添加向量
    index.add(vecteurs),其中 vecteurs 是形状为 (n, dimension) 的 NumPy 数组,数据类型为 32 位浮点数。
  4. 04
    查询
    distances, indices = index.search(requete, k) 返回距离最近的 k 个邻居及其距离;您需要自行将 indices 与原始文本片段对应起来。
  5. 05
    保存并重新加载
    先使用 faiss.write_index(index, chemin),再使用 faiss.read_index(chemin),可将索引持久化到磁盘,在两次运行之间保存并重新加载,因为 FAISS 不会自行完成这一操作。

#根据语料库大小选择索引

该项目的官方 Wiki 发布了精确的参考值,表述为需传入其索引工厂(index_factory)的字符串。当向量数量少于一百万时,IVF_K 即可满足需求,其中 K 根据向量数 N 在 4×√N 至 16×√N 之间选取,训练集大小为 30×K 至 256×K 个向量。在一百万至一千万之间,推荐的组合是 IVF65536_HNSW32,它利用 HNSW 加速簇分配。在一千万至一亿之间,使用 IVF262144_HNSW32;超过一亿直至十亿,则使用 IVF1048576_HNSW32——在此阶段,训练速度明显变慢,通常需在 GPU 上进行,而其余部分在 CPU 上运行。

官方参考指标(按语料库规模划分)
语料库大小推荐配置
少于100万IVF_K(K 在 4×√N 到 16×√N 之间)
100 万至 1000 万IVF65536_HNSW32
1000 万至 1 亿IVF262144_HNSW32
1亿到10亿IVF1048576_HNSW32

对于本地文档语料库——几千到几十万个文本片段——这些参考指标主要证实,我们距离必须使用近似索引的门槛还很远:精确索引,或者退而求其次的简单 IVF_K,就能覆盖几乎所有实际情况,而需要几十万条训练数据的配置仍超出了常规文档应用的范围。

#用数据看内存占用

一个采用 32 位浮点数的 1 024 维向量大约占用 4 KB。因此,一百万个向量大约占用 4 GB,这还没有计入索引结构本身。具体到 HNSW 索引,官方 wiki 给出的公式是每个向量占用 (d×4 + M×2×4) 字节,其中 d 是维度,M 是每个向量的链接数(介于 4 和 64 之间:链接越多,精度越高,内存占用也越大)。这笔内存账决定了大多数架构的选择:这就是需要压缩的原因,也解释了为什么同时承载语言模型的机器,其剩余内存空间比人们想象的更少。

在压缩方面,乘积量化(PQ)将每个向量编码为 M 个字节,通常最多为 64 字节——超过此值时,标量量化(SQ)通常同样精确且更快。当压缩质量至关重要时,官方指南建议在量化前添加 OPQ 变换:它首先通过线性变换降低向量的维度,使其更易于压缩,然后对结果应用乘积量化。这会在建立索引时增加一个计算步骤,但相比直接进行乘积量化,在相同编码长度下能减少精度损失。RaBitQ 是压缩程度最高的选项,仅保留每个维度的一个比特,可将每个向量的编码大小降至约 (d/8 + 8) 字节;代价是需要进行随机旋转,以保持较好的精度。也有每个维度保留多个比特的变体,可以用稍多的存储空间换回一些精度。

i
索引在系统内存中,模型在显存中
FAISS 索引默认存储在系统内存中。对于超大规模数据,也可以在 GPU 上运行——官方文档明确说明,它既能接受来自 CPU 内存的数据,也能接受来自 GPU 内存的数据——但在本地部署中,让它与语言模型争用显卡资源通常并不划算。另请注意,HNSW 索引只支持顺序添加(除非用 IDMap 包装,否则不能使用自定义标识符),而且不能逐个删除向量;IVF 则可以。

#那个缺失却起决定性作用的功能

实际问题往往带有条件:只查询这个客户的文档、只查询这个日期之后的内容、只查询这个人有权阅读的信息。FAISS 没有元数据的概念。常见的变通办法是先获取比所需数量更多的结果,再用 Python 过滤,但这种做法存在一个具体问题:如果排名前五十的结果全部属于另一个部门,过滤后就什么也不剩,您的助手便会声称没有找到任何信息,而不是说没有找到您有权查看的信息。

尤其要注意,权限过滤不应在检索完成之后才进行。这是选择在搜索过程中就进行过滤的系统的最有力的实际理由:可以使用向量数据库,也可以将向量存储在 PostgreSQL 中,通过 WHERE 子句实现过滤。

#何时选择 FAISS

单进程应用程序
启动时加载索引并对其进行查询,例如桌面工具、批处理程序或计算笔记本。
固定语料库
按照时间表重建,而非持续更新。
不按用户进行筛选
或者,筛选粒度足够粗,按类别分别建立索引仍是合理的做法。
对延迟要求严格的场景
当您要消除的恰好就是通过网络访问数据库所产生的往返开销时,例如在无法保证网络连接的嵌入式工具中。

除这些情况外,从长期来看,那个您原本想省去安装的服务,通常比随着项目发展而最终不得不自行重写的持久化、过滤和并发处理代码成本更低。

做决定前,还有最后一点值得了解:您在其他地方遇到的若干向量数据库,并不是凭空就能取代 FAISS;它们要么封装 FAISS,要么借鉴同类索引(IVF、HNSW、乘积量化),再通过网络 API、托管的持久化系统和过滤引擎提供服务。因此,理解 FAISS,也就理解了向量数据库自身内部运作机制的很大一部分——即使最终项目使用的是 Qdrant 或 Milvus,而不是直接使用 FAISS,花时间了解它仍然有益,因为相同的内存与精度权衡也存在于这些系统中,只是参数名称不同。

#FAQ

FAISS 是一个向量数据库吗?+
不是,它是一个用 C++ 编写的相似性搜索库,带有 Python 和 NumPy 封装。它没有服务器、元数据过滤、访问控制,也没有内置持久性保障——这些正是 Qdrant 或 Milvus 等向量数据库在类似引擎之上添加的功能,而这类引擎通常借鉴相同的索引原理。
FAISS 是免费且开源的吗?+
是的。该项目以 MIT 许可证发布,这是一种允许商业使用且无需支付许可使用费的宽松许可证,项目主要由 Meta 的基础人工智能研究团队开发。无需预算许可证费用,只需投入时间,将该库集成到您的技术栈中、运行它并持续保持其更新。
它能处理多少个向量?+
据项目作者所述,数量可达数百万甚至数十亿,前提是索引设置得当且具备足够的内存。限制因素是 RAM:在全精度下,每个 1024 维向量需约 4 KB 内存,不包含索引结构,而使用乘积量化或 RaBitQ 量化后,对于大规模数据可显著减少内存占用。
能否根据元数据过滤结果?+
无法在搜索过程中进行过滤。需要在搜索完成后,在自己的代码中进行过滤;如果排名最靠前的结果都未通过过滤,就可能一个结果也不剩。要按权限过滤,需要使用在检索过程本身就进行过滤的系统,例如 pgvector 或专用向量数据库。
使用 FAISS 还是向量数据库?+
FAISS 适用于单进程、静态语料库且无过滤场景。一旦存在多个客户端、持续更新、持久化或需要在搜索过程中实时控制访问权限(而非在应用代码中事后处理),则应使用数据库。
从哪个索引开始?+
从精确索引开始(根据距离度量选择 IndexFlatL2 或 IndexFlatIP)。无需调参,无需训练,也无需衡量召回率;即使数据规模远大于大多数本地语料库,它仍然足够快——官方 Wiki 只建议在向量数量超过一百万时使用近似索引。
HNSW能否在所有情况下替代IVF?+
不能。HNSW 适合内存充足或语料库规模较小的情况,但仅支持顺序添加,不支持删除向量。IVF 的纯查询速度较慢,但对于不断变化的语料库更灵活,向量数量超过一百万时还可以与 HNSW 结合使用。使用 GPU 运行时,可以直接以对应的 GPU 索引替换 CPU 索引(例如用 GpuIndexFlatL2 替换 IndexFlatL2),但对于本地语料库的规模而言,这通常用处不大。
这份指南对您有帮助吗?

有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。