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 lamemory.