Faiss — Facebook 向量检索库
简介
Faiss 是 Meta 开源的高性能向量相似度搜索库,支持十亿级向量检索,适合对性能要求极高的场景。
bash
pip install faiss-cpu # CPU 版本
# pip install faiss-gpu # GPU 版本基础使用
python
import faiss
import numpy as np
# 创建索引
dimension = 512 # 向量维度
index = faiss.IndexFlatL2(dimension) # L2 距离(精确搜索)
# 添加向量
vectors = np.random.randn(10000, dimension).astype(np.float32)
index.add(vectors)
print(f"索引中向量数: {index.ntotal}")
# 搜索
query = np.random.randn(1, dimension).astype(np.float32)
k = 5 # 返回最近的 5 个
distances, indices = index.search(query, k)
print(f"最近邻索引: {indices[0]}")
print(f"距离: {distances[0]}")余弦相似度索引
python
# 归一化后使用 IP(内积)= 余弦相似度
index = faiss.IndexFlatIP(dimension)
# 归一化向量
vectors = vectors / np.linalg.norm(vectors, axis=1, keepdims=True)
index.add(vectors)
query = query / np.linalg.norm(query)
scores, indices = index.search(query, k)IVF 索引(大规模加速)
python
# 百万级向量推荐使用 IVF
nlist = 100 # 聚类中心数
quantizer = faiss.IndexFlatL2(dimension)
index = faiss.IndexIVFFlat(quantizer, dimension, nlist)
# 必须先训练
index.train(vectors)
index.add(vectors)
# 搜索时探测的聚类数(越大越准确但越慢)
index.nprobe = 10
distances, indices = index.search(query, k)持久化
python
# 保存
faiss.write_index(index, "finance_vectors.index")
# 加载
index = faiss.read_index("finance_vectors.index")与 LangChain 集成
python
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
# 从文档构建
vectorstore = FAISS.from_documents(chunks, embeddings)
# 保存和加载
vectorstore.save_local("faiss_index")
vectorstore = FAISS.load_local("faiss_index", embeddings, allow_dangerous_deserialization=True)
# 检索
docs = vectorstore.similarity_search_with_score("不良贷款率", k=3)
for doc, score in docs:
print(f"相似度: {score:.3f} | {doc.page_content[:100]}")