Вопрос проверяет понимание особенностей векторной базы данных Milvus, её архитектуры и причин популярности среди open-source решений для работы с векторными представлениями.
Milvus — это open-source векторная база данных, предназначенная для эффективного хранения, индексации и поиска векторных представлений (embeddings), которые генерируются моделями машинного обучения. Её главное отличие от других векторных БД (например, Pinecone, Weaviate, Qdrant) — это архитектура, основанная на разделении хранения и вычислений, что позволяет горизонтально масштабироваться. Milvus поддерживает несколько типов индексов для приближённого поиска ближайших соседей (ANN), включая IVF, HNSW, DiskANN, и может работать как с GPU, так и с CPU.
Milvus использует модель "log-structured merge-tree" (LSM) для записи данных и поддерживает гибридный поиск, который комбинирует векторный поиск с фильтрацией по скалярным полям (например, метаданным). Это позволяет выполнять запросы вида: "найди 10 похожих изображений, где тег = 'кошка'". В отличие от Pinecone, который является проприетарным, Milvus полностью open-source и может быть развёрнут локально.
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
# Подключение к Milvus
connections.connect(host='localhost', port='19530')
# Определение схемы
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128),
FieldSchema(name="category", dtype=DataType.VARCHAR, max_length=50)
]
schema = CollectionSchema(fields, description="Image search")
collection = Collection(name="images", schema=schema)
# Вставка данных
import numpy as np
vectors = np.random.random([10, 128]).tolist()
ids = list(range(10))
categories = ["cat"] * 5 + ["dog"] * 5
collection.insert([ids, vectors, categories])
# Поиск с фильтром
collection.load()
query_vector = np.random.random([1, 128]).tolist()
results = collection.search(
data=query_vector,
anns_field="embedding",
param={"metric_type": "L2", "params": {"nprobe": 10}},
limit=3,
expr="category == 'cat'"
)
print(results)Вывод: Milvus стоит применять, когда требуется высокопроизводительный поиск по векторным представлениям в масштабируемой open-source системе, особенно в задачах рекомендательных систем, поиска изображений или семантического поиска.