以下是一个简单的 FAISS 使用示例,展示如何构建一个向量数据库并进行相似性搜索。我们将使用 Python 和 FAISS 的 CPU 版本。
示例:使用 FAISS 进行相似性搜索
1. 安装依赖
确保已经安装了 FAISS 和 NumPy:
pip install faiss-cpu numpy
2. 示例代码
import numpy as np
import faiss
# 生成随机向量数据
np.random.seed(1234)
d = 64 # 向量维度
nb = 1000 # 数据集大小
nq = 10 # 查询向量数量
k = 5 # 每个查询返回的最近邻数量
# 生成随机数据
xb = np.random.random((nb, d)).astype('float32')
xq = np.random.random((nq, d)).astype('float32')
# 创建 FAISS 索引
index = faiss.IndexFlatL2(d) # 使用 L2 距离的精确搜索
# 添加数据到索引
index.add(xb)
# 执行相似性搜索
distances, indices = index.search(xq, k)
# 输出结果
print("查询向量的最近邻索引:")
print(indices)
print("\n查询向量的最近邻距离:")
print(distances)
3. 代码说明
生成数据:
xb
是一个包含 1000 个 64 维向量的随机数据集。
xq
是 10 个查询向量,用于搜索。
创建索引:
- 使用
faiss.IndexFlatL2
创建一个基于 L2 距离的精确搜索索引。
添加数据:
- 使用
index.add(xb)
将数据添加到索引中。
执行搜索:
- 使用
index.search(xq, k)
执行搜索,返回每个查询向量的最近邻索引和对应的距离。
输出结果:
indices
是每个查询向量的最近邻在数据集中的索引。
distances
是对应的距离值。
4. 运行结果
运行代码后,你会看到类似以下输出:
查询向量的最近邻索引:
[[ 544 925 822 428 202]
[ 151 371 708 345 393]
[ 83 119 698 749 835]
...
[ 569 659 656 645 301]]
查询向量的最近邻距离:
[[ 35.81 38.22 39.01 39.10 39.18]
[ 35.96 36.07 36.12 36.22 36.34]
[ 35.87 36.04 36.14 36.24 36.33]
...
[ 35.95 36.05 36.07 36.13 36.15]]
5. 更高级的索引(可选)
如果你需要更高效的搜索,可以尝试使用其他索引类型,例如 IVF(倒排文件)或 HNSW(分层导航小世界图)。以下是 IVF 的示例:
# 使用 IVF 索引
nlist = 100 # 聚类中心数量
quantizer = faiss.IndexFlatL2(d) # 基础索引
index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)
# 训练索引(必须在添加数据之前)
index.train(xb)
# 添加数据
index.add(xb)
# 搜索结果
distances, indices = index.search(xq, k)