Faiss HNSW

安装Faiss库

确保已安装Faiss库及其依赖(如GPU版本需额外配置)。可通过conda或pip安装:

conda install -c conda-forge faiss-gpu  # GPU版本
conda install -c conda-forge faiss-cpu  # CPU版本
准备数据

生成或加载待索引的向量数据,格式为numpy.ndarray,维度需一致。

import numpy as np
dimension = 128  # 向量维度
num_vectors = 10000
data = np.random.rand(num_vectors, dimension).astype('float32')
初始化HNSW索引

设置HNSW参数并创建索引对象:

import faiss
hnsw_m = 32  # 每个节点的连接数
index = faiss.IndexHNSWFlat(dimension, hnsw_m)
添加数据到索引

将向量数据添加到索引中(可选:在添加前训练索引,但HNSW通常无需训练):

index.add(data)
搜索近邻

执行K近邻搜索,返回相似向量及其距离:

query_vector = np.random.rand(1, dimension).astype('float32')
k = 5  # 返回最近邻数量
distances, indices = index.search(query_vector, k)
保存与加载索引

将索引保存到磁盘或从磁盘加载:

faiss.write_index(index, "hnsw_index.faiss")
loaded_index = faiss.read_index("hnsw_index.faiss")
参数调优(可选)

调整HNSW参数以平衡速度和精度:

  • efSearch:控制搜索时的候选池大小(越大越精确但越慢)。
  • efConstruction:控制构建时的精度(影响索引质量)。
index.hnsw.efSearch = 32  # 默认值通常为16
index.hnsw.efConstruction = 40  # 默认值通常为40
性能验证

通过查询延迟和召回率评估索引效果:

# 示例:计算查询时间
import time
start = time.time()
index.search(query_vector, k)
print(f"Search time: {time.time() - start:.4f}s")
注意事项
  • 确保输入数据为float32类型。
  • HNSW适合高维数据,但内存占用较高,可通过量化(如IndexHNSWSQ)优化。
  • GPU加速需使用faiss.GpuIndexHNSW(需额外配置)。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐