向量数据库是一种存储和管理向量数据的数据库。向量数据是表示为向量的数据,例如空间中的点或时间序列中的向量。向量数据库在各种应用中使用,如图像和视频搜索、自然语言处理和推荐系统。在机器学习中,我们通常使用向量数据库来存储来自BERT或OpenAI等模型的嵌入文本数据;图像数据(来自CNN或CLIP的嵌入)以及音频/视频/基因组数据。与SQL的WHERE子句等传统精确匹配查询不同,向量数据库支持相似性搜索,例如”查找与自注意力论文最相似的10篇文档”。向量数据库用于涉及语义搜索、推荐系统、异常检测和检索增强生成(RAG)的应用。
Milvus是一个开源的向量数据库,专为存储和检索嵌入向量而优化。它是一个分布式向量数据库,可以扩展以处理大量数据。它构建在Apache Arrow之上,并使用列式存储格式存储数据。它还提供gRPC和REST API,便于与其他应用程序集成。它用Go编写,可在Linux、Windows和macOS上使用。它能够使用近似最近邻(ANN)算法(如HNSW、IVF和ANNOY)处理大规模(数十亿向量)的相似性搜索。
Milvus lite是Milvus的轻量级、仅本地版本。它可以在内存中或文件系统上运行。它非常适合小型应用程序或测试目的。
典型操作
连接
from pymilvus import connections
connections.connect("default", host="localhost", port="19530")
定义模式和创建集合
from pymilvus import CollectionSchema, FieldSchema, DataType, Collection
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)
]
schema = CollectionSchema(fields, description="我的向量集合")
collection = Collection(name="my_collection", schema=schema)
插入向量数据
import numpy as np
ids = [1, 2, 3]
vectors = np.random.rand(3, 128).tolist()
collection.insert([ids, vectors])
创建索引
index_params = {
"index_type": "IVF_FLAT",
"metric_type": "L2",
"params": {"nlist": 128}
}
collection.create_index(field_name="embedding", index_params=index_params)
加载和搜索
collection.load()
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
query_vector = [np.random.rand(128).tolist()]
results = collection.search(query_vector, "embedding", search_params, limit=2)
for hit in results[0]:
print(f"ID: {hit.id}, 距离: {hit.distance}")
混合搜索过滤
Milvus允许将向量搜索与结构化过滤器(例如WHERE id > 10)结合使用。如果模式支持,您可以在search()方法中包含一个过滤器。
在未来的博客中,我们将讨论向量数据库在RAG(Deepsearcher)应用中的具体用例。