[ PROMPT_NODE_22970 ]
faiss
[ SKILL_DOCUMENTATION ]
# FAISS - 高效相似度搜索
Facebook AI 开发的用于十亿级向量相似度搜索的库。
## 何时使用 FAISS
**在以下情况使用 FAISS:**
- 需要在大规模向量数据集(百万/十亿级)上进行快速相似度搜索
- 需要 GPU 加速
- 纯向量相似度(无需元数据过滤)
- 高吞吐量、低延迟要求
- 嵌入的离线/批处理
**指标**:
- **31,700+ GitHub stars**
- Meta/Facebook AI Research
- **支持数十亿向量**
- **C++** 核心,提供 Python 绑定
**可替代方案**:
- **Chroma/Pinecone**: 需要元数据过滤
- **Weaviate**: 需要完整的数据库功能
- **Annoy**: 更简单,功能较少
## 快速开始
### 安装
bash
# 仅 CPU
pip install faiss-cpu
# GPU 支持
pip install faiss-gpu
### 基本用法
python
import faiss
import numpy as np
# 创建示例数据 (1000 个向量,128 维度)
d = 128
nb = 1000
vectors = np.random.random((nb, d)).astype('float32')
# 创建索引
index = faiss.IndexFlatL2(d) # L2 距离
index.add(vectors) # 添加向量
# 搜索
k = 5 # 查找 5 个最近邻
query = np.random.random((1, d)).astype('float32')
distances, indices = index.search(query, k)
print(f"最近邻索引: {indices}")
print(f"距离: {distances}")
## 索引类型
### 1. Flat (精确搜索)
python
# L2 (欧几里得) 距离
index = faiss.IndexFlatL2(d)
# 内积 (如果归一化则为余弦相似度)
index = faiss.IndexFlatIP(d)
# 最慢,但最准确
### 2. IVF (倒排文件) - 快速近似
python
# 创建量化器
quantizer = faiss.IndexFlatL2(d)
# 具有 100 个聚类的 IVF 索引
nlist = 100
index = faiss.IndexIVFFlat(quantizer, d, nlist)
# 在数据上训练
index.train(vectors)
# 添加向量
index.add(vectors)
# 搜索 (nprobe = 要搜索的聚类数)
index.nprobe = 10
distances, indices = index.search(query, k)
### 3. HNSW (分层 NSW) - 质量/速度最佳平衡
python
# HNSW 索引
M = 32 # 每层的连接数
index = faiss.IndexHNSWFlat(d, M)
# 无需训练
index.add(vectors)
# 搜索
distances, indices = index.search(query, k)
### 4. 乘积量化 (PQ) - 内存高效
python
# PQ 可减少 16-32 倍内存占用
m = 8 # 子量化器数量
nbits = 8
index = faiss.IndexPQ(d, m, nbits)
# 训练并添加
index.train(vectors)
index.add(vectors)
## 保存与加载
python
# 保存索引
faiss.write_index(index, "large.index")
# 加载索引
index = faiss.read_i