Arhitecturi Multitenancy & Izolare Date în Vector DB în Baze de Date Vectoriale & Căutare Semantică

Cum separi în siguranță datele a mii de clienți sau utilizatori diferiți: strategii Colecție per Tenant, Payload Filtering cu Partition Keys și Namespaces.

Sintaxă & interogare
# Strategii de Multitenancy în Vector DB:
1. Collection-per-Tenant -> Izolare fizică totală (cost mare pe resurse)
2. Namespaces (Pinecone/Qdrant) -> Partiționare logică integrată în index
3. Payload Filtering cu Tenant Index -> O singură colecție cu filtru must: {tenant_id: X}

Descriere & Utilizare

Când construiești o platformă SaaS bazată pe AI utilizată de sute de companii diferite, izolarea datelor este o cerință critică de securitate și conformitate GDPR: un utilizator al companiei A nu trebuie sub nicio formă să primească fragmente de text aparținând companiei B în răspunsul RAG.

Există trei strategii principale de arhitectură:

1) Filtrare pe Payload cu Partition Key (Recomandat): toate datele stau într-o singură colecție mare, dar fiecare punct are un câmp indexat tenant_id. Qdrant și Milvus optimizează graful HNSW pe baza acestui câmp. 2) Namespaces: sub-spații logice în cadrul aceluiași index (nativ în Pinecone și Qdrant). 3) Colecție per Tenant: izolare fizică completă, dar greu de scalat la peste câteva sute de clienți din cauza overhead-ului de memorie.

Cum să o reții ușor

💡 Este diferența între a construi un bloc separat pentru fiecare chiriaș (cost uriaș), a da fiecărui chiriaș un apartament încuiat cu cheie proprie în același bloc (Namespaces), sau a folosi carduri de acces pe fiecare etaj (Payload Filtering).

Opțiuni și parametri tehnici

  • tenant_id / workspace_id: cheia unică de identificare a organizației sau a utilizatorului.
  • Tenant Partitioning (Qdrant): permite crearea de micro-indecși HNSW independenți per tenant în interiorul aceleiași colecții.
  • Izolare la nivel de interogare: injectează întotdeauna parametrul tenant_id direct din sesiunea securizată JWT a backend-ului, niciodată din datele primite de la utilizator!

Exemple practice și cazuri de utilizare

  • Filtru forțat pe tenant în Qdrant: query_filter=models.Filter(must=[models.FieldCondition(key="tenant_id", match=models.MatchValue(value=current_user.tenant_id))])
  • Creare partiție automată în Qdrant: setează is_tenant=True la crearea indexului pe câmpul tenant_id.
  • Ștergere rapidă a tuturor datelor când un client își închide contul: client.delete(collection_name="...", points_selector=models.FilterSelector(filter=...))

Sfaturi de configurare & capcane

Nu lăsa niciodată clientul de frontend să trimită tenant_id ca parametru liber în corpul cererii — validează-l și extrage-l exclusiv din tokenul de autentificare verificat de backend!

Comenzi și ghiduri înrudite