Baze de date vectoriale: concepte și metrici de distanță (cosinus, L2, produs scalar) în Baze de Date Vectoriale & Căutare Semantică

Ce stochează o bază de date vectorială, cum se măsoară apropierea dintre vectori și cum se numesc metricile în Qdrant, Pinecone, Chroma și pgvector.

Sintaxă & interogare
# u, v = vectori de embedding
Similaritate cosinus : cos(u, v) = (u · v) / (||u|| * ||v||)    distanța cosinus = 1 - cos(u, v)
Distanța euclidiană  : ||u - v||   (L2)
Produs scalar        : u · v
# Pentru vectori normalizați (||u|| = ||v|| = 1):
#   u · v = cos(u, v)   și   ||u - v||² = 2 - 2 · cos(u, v)

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.

Noțiuni și module înrudite