facebookresearch/faiss
数据用于稠密向量相似度检索与聚类的 C++/Python 库,可选 GPU 加速。
项目介绍
Faiss 解决的是稠密向量的相似度检索与聚类问题:每个实例表示为一个向量加一个整数 id,查询时按 L2 距离、点积,或对归一化向量按余弦相似度返回最接近的向量。它的索引类型覆盖检索速度、召回质量、每个向量的内存占用和建索时间的权衡。基于二进制向量和紧凑量化码的索引只保留压缩表示,可以在单台服务器主存中容纳数十亿向量,代价是精度下降;HNSW、NSG 等图索引则在原始向量之上增加索引结构以加快检索。
核心用 C++ 实现,提供完整的 Python/numpy 封装,并通过 CUDA 或 AMD ROCm 提供可选 GPU 实现。GPU 索引基本可以直接替换 CPU 索引(例如用 GpuIndexFlatL2 替代 IndexFlatL2),显存拷贝会自动处理;输入输出都留在 GPU 上时速度最好。项目主要由 Meta 基础 AI 研究团队开发,适用于推荐、图像或文本 embedding 检索、去重和聚类等场景。
快速使用
README 指向预编译的 Conda 包:CPU 使用 faiss-cpu,GPU 有 faiss-gpu 和 faiss-gpu-cuvs 两个变体。安装对应包后即可在 Python 中导入 Faiss 并建立索引。
下面是最小 CPU 示例,向量用 float32 numpy 数组表示:
import numpy as np
import faiss
d, nb, nq, k = 128, 10000, 5, 10
xb = np.random.random((nb, d)).astype('float32')
xq = np.random.random((nq, d)).astype('float32')
index = faiss.IndexFlatL2(d)
index.add(xb)
D, I = index.search(xq, k) # 返回最近邻的距离和 id
print(I)
从源码构建使用 CMake,前置条件和编译选项见 INSTALL.md。其他索引类型和评估流程可参考入门教程。Faiss 本身不包含 embedding 模型,需要由调用方提供向量,因此实际应用要在建索引前准备自己的编码流程。
使用约束
CPU 构建唯一的硬依赖是 BLAS 实现;GPU 支持是可选的,需要 CUDA 或 ROCm。Python 接口同样是可选的,C++ 库可以独立使用。索引类型的选择取决于数据规模、内存预算、延迟和可接受的召回损失;压缩索引用精度换规模,部分近似索引在添加向量前需要训练数据。项目采用 MIT 许可证。
社区与资料
问题和 bug 反馈可到 GitHub Discussions 和 issue 列表。由于觉得学习资料偏少,Pinecone 曾整理过一份非官方 Faiss 手册供深入学习。HN 讨论中有用户提到读博期间用 Faiss 做基于 AI 的 LiDAR 地图构建,大量依赖其 wiki 和示例代码查阅资料。另有一位 Milvus 贡献者说明 Faiss 是 Milvus 向量数据库可选的索引引擎之一与其它库并列。
HotRepo 点评
在 2026-11-11 的 C++ 日榜中,Faiss 新增 68 星,排名第 2,总星数达到 41,402。站内的讨论记录跨度较长:2023 年 3 月的一个 HN 帖子拿到 263 分和 52 条评论(source:3),更早的 2021 年和 2017 年也有帖子。评论并非一边倒的推荐:2023 年讨论中有人表示 hnswlib 更简单、在 CPU 上更快依据自己的使用经验,也有评论描述 Faiss 是 Milvus 背后多个索引引擎之一与其它库并列。对正在选型的读者来说,这些讨论比星数更有参考价值:Faiss 提供丰富的索引类型和 GPU 路径;如果场景是嵌入式、吞吐不高,简单的 CPU 库可能更合适。
本文由 AI 根据项目 README 生成,更新于 ,以项目官方文档为准。