向量数据库简介

06-09-2025

向量数据库是一种存储和管理向量数据的数据库。向量数据是表示为向量的数据,例如空间中的点或时间序列中的向量。向量数据库在各种应用中使用,如图像和视频搜索、自然语言处理和推荐系统。在机器学习中,我们通常使用向量数据库来存储来自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)应用中的具体用例。