Milvus și Zilliz Cloud: arhitectură distribuită pentru căutare vectorială în Baze de Date Vectoriale & Căutare Semantică

Arhitecturi de Producție, Pinecone & Căutare Hibridă Nivel: avansat (Milvus 3.0, pymilvus 3.0)

Milvus este o bază de date vectorială open-source cu stocare și calcul separate; rulează local (Milvus Lite), standalone sau distribuit, iar Zilliz Cloud este varianta administrată.

Sintaxă & interogare
from pymilvus import MilvusClient

client = MilvusClient("milvus_demo.db")                  # Milvus Lite, într-un fișier local
# client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
client.create_collection(collection_name="demo", dimension=768)   # metrica implicită: COSINE

Milvus este o bază de date vectorială open-source, gândită pentru colecții mari. Același API funcționează în Milvus Lite (bibliotecă Python, datele într-un fișier local), în modul standalone (Docker) și în modul distribuit (Kubernetes). Zilliz Cloud este serviciul administrat bazat pe Milvus.

Documentația Milvus 3.0 descrie patru straturi, independente ca scalare și recuperare: access layer (proxy-uri fără stare, care validează cererile și agregă rezultatele), Coordinator (un singur coordonator activ în cluster: DDL, timestamp-uri, gestionarea WAL, a nodurilor de interogare și a sarcinilor de compactare și indexare), worker nodes (Streaming Node pentru datele noi și WAL, Query Node pentru datele istorice din object storage, Data Node pentru compactare și construcția indecșilor) și storage (etcd pentru metadate, object storage MinIO / S3 / Azure Blob, WAL pe Kafka, Pulsar sau Woodpecker).

Milvus suportă mai multe tipuri de index (de exemplu HNSW, IVF_FLAT, DISKANN). DISKANN combină un graf Vamana ținut pe disc cu Product Quantization în memorie, pentru colecții mai mari decât memoria disponibilă. O colecție trebuie încărcată în memorie (load_collection) pentru căutare; dacă o creezi cu parametri de index, Milvus o încarcă automat.

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
MilvusClient(uri, token) Clientul Python; cu un nume de fișier ("milvus_demo.db") pornește Milvus Lite.
create_schema / add_field Schema colecției: câmp primar, câmp vectorial (FLOAT_VECTOR cu dim) și câmpuri scalare.
prepare_index_params / add_index Tipul indexului (HNSW, IVF_FLAT, DISKANN etc.), metrica (COSINE, L2, IP) și parametrii (M, efConstruction).
search(..., filter=, search_params=) Căutare cu filtru pe câmpuri scalare ("subject == 'biology'") și parametri de index (ef, cel puțin cât limit).
load_collection / release_collection Încarcă în memorie indexul și datele câmpurilor, sau le eliberează.
partition key Repartizarea automată a datelor în partiții după un câmp, de exemplu pentru multitenancy.

Exemple practice și scenarii reale

Exemplul 1: Schemă, index HNSW și căutare

from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")

schema = MilvusClient.create_schema(auto_id=True)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=1536)
schema.add_field(field_name="categorie", datatype=DataType.VARCHAR, max_length=64)

index_params = client.prepare_index_params()
index_params.add_index(field_name="vector", index_type="HNSW", metric_type="COSINE",
                       params={"M": 16, "efConstruction": 200})
client.create_collection("catalog", schema=schema, index_params=index_params)

res = client.search(
    collection_name="catalog",
    data=[vector_intrebare],
    anns_field="vector",
    filter="categorie == 'carti'",
    limit=10,
    search_params={"params": {"ef": 64}},
    output_fields=["categorie"],
)

Greșeli frecvente și capcane

  • Folosești API-ul ORM vechi (connections.connect, Collection, FieldSchema) din exemplele mai vechi. Documentația actuală folosește MilvusClient.
  • Cauți într-o colecție neîncărcată. Dacă ai creat colecția fără parametri de index, apelează load_collection înainte de căutare.
  • Setezi ef mai mic decât limit. Documentația cere ef cel puțin cât numărul de rezultate.

Noțiuni și module înrudite