faiss的使用

1.faiss.IndexFlatL2

IndexFlatL2索引方式
为向量集构建IndexFlatL2索引,它是最简单的索引类型,只执行强力L2距离搜索
index = faiss.IndexFlatL2(d) # build the index

import mkl
import math
import time
import faiss
import numpy as np

d = 768  # 向量维数

data = [[i] * d for i in range(2000)]
data = np.array(data).astype('float32')  # 注意,只能插入float32类型的向量
ids = np.arange(0, 2000)
data_length = len(ids)  # 自定义向量的Id

nlist = int(4 * math.sqrt(data_length))  # 聚类中心的个数
time1 = time.time()

quantizer = faiss.IndexFlatL2(d)  # 内部的索引方式依然不变
print("quantizer:",quantizer)
# 打印结果:quantizer <faiss.swigfaiss_avx2.IndexFlatL2; proxy of <Swig Object of type 'faiss::IndexFlatL2 *' at 0x7f77660abb10> >

index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)  # 倒排索引
index.train(data)  # 注意,倒排索引一定要进行train
index.add_with_ids(data, ids)
print(index.is_trained)
time2 = time.time()
print(f'构建索引插入数据的时间为{time2 - time1}')

query_vector = np.array([[1] * 768]).astype('float32')
dis, ind = index.search(query_vector, 1)  # 1代表返回的结果数
print(f'全1向量的最近的向量id为{ind}')
print(dis)

打印结果:
quantizer <faiss.swigfaiss_avx2.IndexFlatL2; proxy of <Swig Object of type ‘faiss::IndexFlatL2 *’ at 0x7f77660abb10> >
WARNING clustering 2000 points to 178 centroids: please provide at least 6942 training points
True
构建索引插入数据的时间为0.11389470100402832
全1向量的最近的向量id为[[1]]
[[0.]]
(torch)

### Faiss与大模型的整合方案 Faiss 是 Facebook 开源的一个高效相似度搜索库,特别适合处理大规模向量数据集中的最近邻查询[^1]。它能够加速基于嵌入空间(embedding space)的检索操作,在结合大模型的应用场景下具有显著优势。 #### 1. 数据预处理阶段 在使用 Faiss 和大模型之前,通常需要先通过大模型生成高质量的数据表示(embeddings)。这些 embeddings 可以由自然语言处理模型(如 BERT 或其他 Transformer 架构)、图像编码器或其他模态的大规模学习框架生成。具体来说: - **文本数据**:可以利用预训练的语言模型提取语义特征。 - **图片或视频数据**:可以通过卷积神经网络 (CNN) 提取视觉特征。 此过程的核心在于确保 embedding 的维度适配于后续索引构建的需求[^2]。 #### 2. 建立 Faiss 索引 一旦获得了 embeddings 向量集合,则可将其传递给 Faiss 来创建高效的近似最近邻索引结构。以下是建立索引的一些常见选项及其适用情况: - **Flat Indexes**: 对小型到中型数据库非常有效,提供精确的结果但计算成本较高。 - **IVF (Inverted File)**: 将整个数据划分为若干子簇(cluster),从而减少每次比较的数量;适用于更大规模的数据集。 - **HNSW (Hierarchical Navigable Small Worlds)**: 支持快速高维稀疏数据上的 ANN 查询[^3]。 对于超大型数据集推荐采用复合策略比如 `IndexIVFPQ` 结合量化技术进一步降低存储需求并提升性能。 ```python import faiss import numpy as np d = 128 # dimension of the vectors nb = 100000 # number of vectors to index nlist = 100 # number of clusters in IVF # Generate random data for demonstration purposes only. np.random.seed(1234) xb = np.random.random((nb, d)).astype('float32') quantizer = faiss.IndexFlatL2(d) # Define quantizer used within IVF structure index = faiss.IndexIVFFlat(quantizer, d, nlist) assert not index.is_trained # Check if training is required before adding any vector index.train(xb[:5000]) # Train using a subset of your dataset index.add(xb) # Add all remaining points after successful train step print(f"Total indexed items count={index.ntotal}") ``` 上述代码片段展示了如何初始化一个简单的 IVF Flat 索引实例,并完成基本配置流程[^4]。 #### 3. 集成至实际应用环境 当 Faiss 已经准备好之后就可以无缝集成进入各种在线服务或者离线批处理作业当中去了。例如在一个问答系统里边,每当接收到新的提问时就调用相应的大模型得到其对应的 embedding 表达形式然后再交给预先搭建好的 Faiss 搜索引擎去寻找最接近的历史记录作为候选答案返回给前端展示出来。 值得注意的是为了保证实时响应速度可能还需要考虑缓存机制以及分布式部署等问题来优化整体架构设计[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值