[ PROMPT_NODE_22972 ]
index_types
[ SKILL_DOCUMENTATION ]
# FAISS 索引类型指南
选择和使用 FAISS 索引类型的完整指南。
## 索引选择指南
| 数据集大小 | 索引类型 | 训练 | 准确度 | 速度 |
|--------------|------------|----------|----------|-------|
| 10M | IVF+PQ | 是 | 90-95% | 快,低内存 |
## Flat 索引 (精确搜索)
### IndexFlatL2 - L2 (欧几里得) 距离
python
import faiss
import numpy as np
d = 128 # 维度
index = faiss.IndexFlatL2(d)
# 添加向量
vectors = np.random.random((1000, d)).astype('float32')
index.add(vectors)
# 搜索
k = 5
query = np.random.random((1, d)).astype('float32')
distances, indices = index.search(query, k)
**适用场景:**
- 数据集 < 10,000 个向量
- 需要 100% 准确度
- 作为基准测试
### IndexFlatIP - 内积 (余弦相似度)
python
# 对于余弦相似度,先归一化向量
import faiss
d = 128
index = faiss.IndexFlatIP(d)
# 归一化向量 (余弦相似度必需)
faiss.normalize_L2(vectors)
index.add(vectors)
# 搜索
faiss.normalize_L2(query)
distances, indices = index.search(query, k)
**适用场景:**
- 需要余弦相似度
- 推荐系统
- 文本嵌入
## IVF 索引 (倒排文件)
### IndexIVFFlat - 基于聚类的搜索
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 # 搜索 10 个最接近的聚类
distances, indices = index.search(query, k)
**参数:**
- `nlist`: 聚类数量 (建议 √N 到 4√N)
- `nprobe`: 要搜索的聚类数 (1-nlist,越高越准确)
**适用场景:**
- 数据集 10K-1M 个向量
- 需要快速近似搜索
- 可以承担训练时间
### 调整 nprobe
python
# 测试不同的 nprobe 值
for nprobe in [1, 5, 10, 20, 50]:
index.nprobe = nprobe
distances, indices = index.search(query, k)
# 衡量召回率/速度的权衡
**准则:**
- `nprobe=1`: 最快,约 50% 召回率
- `nprobe=10`: 良好的平衡,约 95% 召回率
- `nprobe=nlist`: 精确搜索 (与 Flat 相同)
## HNSW 索引 (基于图)
### IndexHNSWFlat - 分层 NSW
python
# HNSW 索引
M = 32 # 每层的连接数 (16-64)
index = fa