Cuantizare vectorială: scalară, binară și pe produs (PQ) în Baze de Date Vectoriale & Căutare Semantică

Fundamente & Algoritmi de Indexare Nivel: avansat (Qdrant 1.20)

Cuantizarea păstrează o copie comprimată a vectorilor pentru căutare rapidă; oversampling-ul și rescoring-ul cu vectorii originali recuperează o parte din precizie.

Sintaxă & interogare
# Compresie față de float32 (documentația Qdrant)
Scalar (int8)                 : 4x    (32 -> 8 biți per componentă)
Binary (1, 1,5 sau 2 biți)    : până la 32x
Product Quantization          : până la 64x
TurboQuant (Qdrant)           : 4x - 32x, după numărul de biți

Un vector float32 ocupă 4 octeți pe componentă: 1 milion de vectori cu 1536 de dimensiuni înseamnă aproximativ 6,1 GB doar pentru valori, fără index și metadate. Cuantizarea păstrează o copie comprimată a vectorilor, folosită la căutare; în Qdrant vectorii originali rămân și ei în colecție.

Cuantizarea scalară reduce fiecare componentă de la 32 la 8 biți (4x), cu o pierdere mică de precizie. Cuantizarea binară păstrează 1 bit (sau 1,5 ori 2 biți în Qdrant) pe componentă, până la 32x; Qdrant o recomandă pentru vectori cu multe dimensiuni și distribuție centrată și listează modele testate (de exemplu OpenAI text-embedding-3-small și -large) cu recall de cel puțin 0,98 cu oversampling și rescoring. Product Quantization (Jégou, Douze și Schmid, 2011) împarte vectorul în segmente și înlocuiește fiecare segment cu indexul celui mai apropiat centroid (Qdrant folosește 256 de centroizi, deci 1 octet pe segment); compresia ajunge la 64x, dar căutarea e mai lentă și precizia scade mai mult.

Pentru a recupera precizia, se face oversampling (se aleg mai mulți candidați cu vectorii comprimați) și rescoring (primii candidați se renotează cu vectorii originali). În Qdrant, cu oversampling=2.4 și limit=100 se preselectează 240 de candidați; rescoring-ul este implicit doar la cuantizarea binară și la TurboQuant cu 1, 1,5 sau 2 biți. De la Qdrant 1.19, locul datelor (RAM sau disc) se alege cu parametrul memory (pinned, cached, cold), iar vechiul always_ram este depreciat. În pgvector există tipul halfvec (16 biți) și cuantizarea binară cu binary_quantize().

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
ScalarQuantizationConfig(type=INT8, quantile=0.99) quantile exclude valorile extreme din calculul limitelor (0,99 = 1% din valori).
memory pinned (în RAM), cached, cold (pe disc). Înlocuiește always_ram și on_disk de dinainte de 1.19.
rescore Renotează candidații cu vectorii originali; poate încetini căutarea dacă originalele sunt pe disc.
oversampling Multiplicatorul de candidați preselectați față de limit.
ignore Ignoră vectorii cuantizați la o interogare; util pentru a compara calitatea cu și fără cuantizare.
halfvec / binary_quantize (pgvector) Vectori cu precizie pe 16 biți; cuantizare binară folosită într-un index pe expresie.

Exemple practice și scenarii reale

Exemplul 1: Colecție cu cuantizare scalară (Qdrant)

client.create_collection(
    collection_name="articole",
    vectors_config=models.VectorParams(size=768, distance=models.Distance.COSINE),
    quantization_config=models.ScalarQuantization(
        scalar=models.ScalarQuantizationConfig(
            type=models.ScalarType.INT8,
            quantile=0.99,
            memory=models.Memory.PINNED,
        ),
    ),
)

Exemplul 2: Interogare cu oversampling și rescoring

client.query_points(
    collection_name="articole",
    query=vector_intrebare,
    search_params=models.SearchParams(
        quantization=models.QuantizationSearchParams(rescore=True, oversampling=2.0)
    ),
    limit=10,
)

Exemplul 3: Cuantizare binară cu reordonare în pgvector

CREATE INDEX ON items USING hnsw ((binary_quantize(embedding)::bit(3)) bit_hamming_ops);

SELECT * FROM (
    SELECT * FROM items
    ORDER BY binary_quantize(embedding)::bit(3) <~> binary_quantize('[1,-2,3]') LIMIT 20
) ORDER BY embedding <=> '[1,-2,3]' LIMIT 5;

Greșeli frecvente și capcane

  • Activezi cuantizarea binară pe vectori cu puține dimensiuni. Documentația Qdrant arată pierderi mari de precizie sub aproximativ o mie de dimensiuni la 1 bit; încearcă 1,5 sau 2 biți ori cuantizarea scalară.
  • Pui vectorii originali pe disc și lași rescoring-ul activ pe un disc lent. Rescoring-ul citește originalele; poate deveni gâtul de sticlă.
  • Folosești parametrii vechi (always_ram, on_disk) pe Qdrant 1.19+. Sunt depreciați și nu se convertesc automat la memory.

Noțiuni și module înrudite