O bază de date vectorială stochează vectori de embedding (liste de numere reale produse de un model de embedding), împreună cu un identificator și metadate, și răspunde la întrebarea „care sunt cei mai apropiați k vectori de acesta?”. Dimensiunea vectorului este fixată de model: text-embedding-3-small (OpenAI) produce implicit 1536 de valori, iar text-embedding-3-large 3072.
Apropierea se măsoară cu o metrică: similaritatea cosinus (unghiul dintre vectori, fără lungimea lor), distanța euclidiană (L2) sau produsul scalar. Pentru vectori normalizați la lungimea 1, cele trei dau aceeași ordine a rezultatelor. Qdrant, de exemplu, implementează metrica Cosine ca produs scalar pe vectori pe care îi normalizează automat la încărcare.
Metrica se alege la crearea colecției sau a indexului și trebuie să fie cea recomandată pentru modelul de embedding. Numele diferă între motoare: Cosine / Euclid / Dot / Manhattan în Qdrant, cosine / euclidean / dotproduct în Pinecone, cosine / l2 (L2 la pătrat, implicit) / ip în Chroma, operatorii <=> / <-> / <#> în pgvector.
Concepte cheie și caracteristici
| Concept / Parametru | Descriere practică |
|---|---|
Dimensiunea vectorului |
Fixată de modelul de embedding; colecția sau coloana se declară cu aceeași dimensiune. Modelele text-embedding-3 pot întoarce vectori mai scurți prin parametrul dimensions. |
Similaritate cosinus |
Între -1 și 1. Distanța cosinus (1 – similaritatea) este între 0 și 2. |
L2 |
Distanța în linie dreaptă; valoare mai mică = mai apropiat. |
Produs scalar |
Depinde și de lungimea vectorilor; pentru vectori normalizați este egal cu similaritatea cosinus. |
k-NN exact / ANN |
Căutarea exactă compară interogarea cu toți vectorii; un index aproximativ (HNSW, IVF) compară doar cu o parte și renunță la puțină precizie pentru viteză. |
Exemple practice și scenarii reale
Exemplul 1: Similaritate cosinus și normalizare în NumPy
import numpy as np
def cos_sim(u, v):
return float(np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v)))
u_norm = u / np.linalg.norm(u) # vector de lungime 1
Exemplul 2: Metrica la crearea colecției (Qdrant)
models.VectorParams(size=1536, distance=models.Distance.COSINE)
Exemplul 3: Metrica la crearea indexului (Pinecone)
pc.create_index(name="articole", vector_type="dense", dimension=1536, metric="cosine",
spec=ServerlessSpec(cloud="aws", region="eu-central-1"))
Greșeli frecvente și capcane
- Declari colecția cu altă dimensiune decât cea a modelului. Inserarea eșuează; iar dacă scurtezi vectorii manual, trebuie renormalizați (documentația OpenAI arată cum).
- Folosești altă metrică decât cea potrivită modelului de embedding. Când vectorii nu sunt normalizați, ordinea rezultatelor se schimbă între metrici.
- Compari scoruri între motoare fără să verifici dacă e similaritate sau distanță. La Pinecone cu
euclideanși la operatorii pgvector, valoarea mai mică înseamnă mai apropiat.