向量数据库是专门用于存储、索引和查询向量数据(嵌入)的数据库系统。以下是构建一个基本向量数据库的关键步骤:
1. 确定核心需求- 向量维度:确定你将处理的向量维度(如768维、1024维等)
- 距离度量:选择相似度计算方法(余弦相似度、欧氏距离、内积等)
- 规模预估:预计存储的向量数量和查询负载
- 向量存储:设计高效的向量存储格式(二进制、浮点数组等)
- 元数据存储:存储与向量关联的ID、标签和其他元数据
- 持久化:实现磁盘存储和内存缓存机制
- 索引结构:选择或实现适合的索引算法:
- 精确搜索:线性扫描(小规模)
- 近似搜索:HNSW、IVF、PQ、LSH等
- 索引构建:实现索引构建和更新逻辑
- 查询接口:设计查询API(单向量查询、批量查询、过滤查询等)
- 结果排序:根据相似度得分排序返回结果
from typing import List, Dict
import heapq
import os
import json
class VectorDatabase:
def __init__(self, dim: int, distance_metric: str = 'cosine'):
self.dim = dim
self.vectors = []
self.metadata = []
self.index = None
self.distance_metric = distance_metric
def add_vector(self, vector: np.ndarray, metadata: Dict = None):
if len(vector) != self.dim:
raise ValueError(f"Vector dimension must be {self.dim}")
self.vectors.append(vector)
self.metadata.append(metadata or {})
def cosine_similarity(self, a: np.ndarray, b: np.ndarray) -> float:
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def euclidean_distance(self, a: np.ndarray, b: np.ndarray) -> float:
return np.linalg.norm(a - b)
def query(self, query_vector: np.ndarray, k: int = 5) -> List[Dict]:
if len(query_vector) != self.dim:
raise ValueError(f"Query vector dimension must be {self.dim}")
scores = []
for i, vec in enumerate(self.vectors):
if self.distance_metric == 'cosine':
score = self.cosine_similarity(query_vector, vec)
elif self.distance_metric == 'euclidean':
score = -self.euclidean_distance(query_vector, vec) # 使用负值以便最大堆排序
else:
raise ValueError("Unsupported distance metric")
scores.append((score, i))
# 获取top-k结果
top_k = heapq.nlargest(k, scores, key=lambda x: x[0])
return [{
'vector': self.vectors[idx],
'metadata': self.metadata[idx],
'score': score
} for score, idx in top_k]
def build_index(self):
"""未来可以添加更高效的索引结构"""
pass
def save(self, path: str):
data = {
'dim': self.dim,
'vectors': [v.tolist() for v in self.vectors],
'metadata': self.metadata,
'distance_metric': self.distance_metric
}
with open(path, 'w') as f:
json.dump(data, f)
@classmethod
def load(cls, path: str):
with open(path, 'r') as f:
data = json.load(f)
db = cls(data['dim'], data['distance_metric'])
db.vectors = [np.array(v) for v in data['vectors']]
db.metadata = data['metadata']
return db
进阶优化方向
索引优化:
- 实现HNSW(分层可导航小世界)图索引
- 或IVF(倒排文件)与乘积量化结合
并行查询:
- 使用多线程/进程并行计算相似度
- 批量查询优化
持久化与压缩:
- 高效序列化格式(如Protocol Buffers)
- 向量压缩技术(标量量化、乘积量化)
过滤支持:
- 在相似度搜索基础上添加元数据过滤
- 在相似度搜索基础上添加元数据过滤
- 分布式架构:数据分片和分布式查询
- 容错机制:数据复制和故障恢复
- 增量更新:支持动态添加/删除向量而不重建整个索引
- 性能监控:查询延迟、吞吐量监控
如果想基于现有方案构建:
- FAISS (Facebook AI相似度搜索)
- Annoy (Spotify的近似最近邻库)
- HNSWLib (纯HNSW实现)
- Milvus、Weaviate、Qdrant等完整向量数据库
从零构建向量数据库是一个复杂的工程任务,建议从小规模原型开始,逐步添加高级功能。对于大多数应用场景,使用现有优化库(如FAISS)作为基础可能是更高效的选择。


雷达卡




京公网安备 11010802022788号







