Blog/Retrieval & Suche

Embedding-Quantisierung: Binär-, int8- und Matryoshka-Vektoren ohne Qualitätsverlust beim Retrieval

Wie Binär- und int8-Quantisierung und Matryoshka-Kürzung Vektorindizes 4- bis 32-mal verkleinern, was das an Recall kostet und wie Rescoring es zurückholt.

··5 Min. Lesezeit

  • Embeddings
  • Vector search
  • Quantization
  • pgvector
  • RAG
Ein float32-Embedding schrumpft zu halber Genauigkeit, int8 und Binärbits, mit einem Rescoring-Schritt, der die Ranking-Qualität wiederherstellt.

Das Wichtigste in Kürze

  • Binäre Quantisierung speichert ein Bit pro Dimension, 32-mal weniger als float32; int8 speichert ein Byte, 4-mal weniger.
  • In den Tests von Hugging Face behielten binäre Embeddings rund 92,5 % der Retrieval-Leistung, Rescoring mit der float-Anfrage hob das auf rund 96 %.
  • Matryoshka-Modelle erlauben, nur die ersten Dimensionen zu behalten; OpenAIs text-embedding-3-large behielt bei 12-facher Kompression 93,1 %.
  • pgvector unterstützt halfvec bis 4.000 Dimensionen, bit bis 64.000 und binäre Quantisierung über einen Ausdrucksindex mit Re-Ranking.
  • Den Index quantisieren, die vollen Vektoren auf der Platte behalten und den Recall vorher und nachher an eigenen Anfragen messen.

Diesen Artikel anhören

0:000:00

Vektorindizes werden schneller teuer, als man denkt. Zehn Millionen Chunks mit 1.024-dimensionalen float32-Embeddings sind rund 41 GB reine Vektoren, vor jedem Index-Overhead, und HNSW-Indizes wollen im Arbeitsspeicher liegen. Lange bevor Embedding-Modell oder Datenbank zum Problem werden, wird es der RAM. Quantisierung verkleinert diese Vektoren um den Faktor 2 bis 32 und kostet mit einem zusätzlichen Schritt überraschend wenig Retrieval-Qualität.

Dieser Artikel vergleicht halbe Genauigkeit, int8, binäre Quantisierung und Matryoshka-Kürzung mit gemessenen Erhaltungswerten, zeigt die Umsetzung in pgvector und endet mit einem Testplan für den eigenen Korpus. Die Wahl des Speichers selbst behandelt pgvector oder eine Vektordatenbank.

Was macht Embedding-Quantisierung eigentlich?

Es ist ein Nachbearbeitungsschritt an den Vektoren, nicht am Modell. Wie der Beitrag von Hugging Face erklärt, wandelt binäre Quantisierung jeden float32-Wert per Schwelle bei null in ein Bit um, was Speicher um den Faktor 32 senkt; skalare int8-Quantisierung bildet jeden Wert auf einen von 256 Bereichen ab, Faktor 4. Binäre Vektoren vergleicht man per Hamming-Distanz, die sehr billig zu berechnen ist.

FormatBytes für 1.024 Dim.10 Mio. VektorenReduktion
float324,096~41 GB1×
float16 (halfvec)2,048~20 GB2×
int81,024~10 GB4×
binär (bit)128~1.3 GB32×

Die Zahlen sind reine Vektorgrößen; Indizes kommen grob proportional obendrauf. Entscheidend ist die Größenordnung: Binär macht aus einem Problem für einen eigenen Server etwas, das neben die Anwendung passt.

Wie viel Retrieval-Qualität verliert man?

Hugging Face hat das mit mxbai-embed-large-v1 auf MTEB Retrieval gemessen. Binäre Embeddings allein behielten rund 92,5 % der float32-Leistung. Ein Rescoring-Schritt, Kandidaten mit der binären Anfrage holen und dann mit dem float32-Anfrage-Embedding bewerten, hob das auf rund 96 %, bei 32-facher Speicherersparnis für den Index. int8 liegt dazwischen und ist die sicherere Wahl, wenn kein Rescoring-Durchgang möglich ist.

Binäres Retrieval mit RescoringDie Anfrage wird einmal in float32 eingebettet. Eine binäre Kopie durchsucht den Binärindex nach einem Mehrfachen der benötigten Kandidaten. Diese werden mit der float32-Anfrage gegen ihre gespeicherten vollen Vektoren neu bewertet, und die Top-Ergebnisse gehen an Reranker oder Modell.Anfragefloat32BinärsucheHamming, k×4Rescoringvolle VektorenRerankoptionalTop kans Modell
Nur der Binärindex muss im Speicher liegen; volle Vektoren werden pro Anfrage für einige hundert Kandidaten gelesen.

Was bringen Matryoshka-Embeddings?

Quantisierung reduziert die Bits pro Dimension. Matryoshka Representation Learning reduziert die Zahl der Dimensionen: Modelle werden so trainiert, dass die ersten Dimensionen die meiste Information tragen und ein Präfix des Vektors allein ein brauchbares Embedding ist. Das Originalpaper berichtet bis zu 14-mal kleinere Embeddings bei gleicher Genauigkeit in der ImageNet-Klassifikation. Für Text zitiert der Hugging-Face-Beitrag OpenAIs text-embedding-3-large mit 93,1 % Leistung bei 12-facher Kompression und nomic-embed-text-v1.5 mit 95,8 % bei 3-facher und 90 % bei 6-facher.

Kürzen funktioniert nur bei so trainierten Modellen. Bei einem gewöhnlichen Modell Dimensionen abzuschneiden verschlechtert es stark, und klassische Dimensionsreduktion wie PCA schneidet bei Embeddings meist schlecht ab, wie derselbe Beitrag festhält. Vor dem Schneiden die Model Card prüfen.

Wie setzt man das in pgvector um?

Die pgvector-README nennt die Grenzen für HNSW-Indizes: vector bis 2.000 Dimensionen, halfvec bis 4.000 und bit bis 64.000. Binäre Quantisierung geht über einen Ausdrucksindex auf binary_quantize(embedding) mit Hamming-Distanz, und dieselbe Abfrage kann die Kandidaten mit den Originalvektoren neu ordnen. Subvektor-Ausdrucksindizes liefern Matryoshka-Kürzung ohne zweite Spalte.

-- Binary index for candidate search, full vectors for rescoring
CREATE INDEX chunks_bq ON chunks
  USING hnsw ((binary_quantize(embedding)::bit(1024)) bit_hamming_ops);

SELECT id, text FROM (
  SELECT id, text, embedding FROM chunks
  ORDER BY binary_quantize(embedding)::bit(1024) <~> binary_quantize($1::vector)
  LIMIT 200                                   -- 4–10x the final k
) candidates
ORDER BY embedding <=> $1::vector             -- rescore with the float query
LIMIT 20;

-- Matryoshka: index only the first 512 dimensions of a model trained for it
CREATE INDEX chunks_mrl ON chunks
  USING hnsw ((subvector(embedding, 1, 512)::vector(512)) vector_cosine_ops);

-- Half precision: half the memory, nearly no loss
CREATE INDEX chunks_half ON chunks
  USING hnsw ((embedding::halfvec(1024)) halfvec_cosine_ops);

Die Abfrage muss denselben Ausdruck wie der Index verwenden, sonst fällt Postgres auf einen sequenziellen Scan zurück. Einmal pro Abfrageform mit EXPLAIN prüfen. Spezialisierte Vektordatenbanken wie Qdrant bieten skalare und binäre Quantisierung als Collection-Einstellung mit eingebautem Rescoring; die Abwägungen sind dieselben.

Welche Technik sollte man wählen?

SituationBeginnen mit
Index passt in den Speicher, sicherer Gewinn gesuchtHalbe Genauigkeit
Speicher ist Engpass, kein Rescoring möglichint8
Sehr großer Korpus, Rescoring in OrdnungBinär + float-Rescoring
Modell hat mehr Dimensionen als der Index erlaubtMatryoshka-Kürzung, falls unterstützt; sonst halfvec

Wie testet man Quantisierung an eigenen Daten?

  1. Das eigene Retrieval-Eval-Set nehmen, Fragen mit bekannten relevanten Chunks, wie in RAG evaluieren beschrieben.
  2. Recall@10 und Recall@50 mit float32 als Basislinie messen.
  3. Für halfvec, int8, binär ohne Rescoring und binär mit Rescoring beim 4- und 10-Fachen des finalen k wiederholen.
  4. Indexgröße, Abfragelatenz im p95 und Recall in einer Tabelle festhalten und die günstigste Option innerhalb des Recall-Budgets wählen.

Danach die ganze Pipeline laufen lassen, inklusive hybrider Suche und Reranker aus Eine produktive RAG-Pipeline. Ein Reranker verdeckt oft kleine Recall-Verluste der ersten Stufe, ein weiterer Grund, warum quantisiertes Retrieval in der ersten Stufe in der Praxis gut funktioniert.

Quellen

  1. Hugging Face: Binary and Scalar Embedding Quantization for Significantly Faster and Cheaper Retrieval (Mar 2024)
  2. Kusupati et al.: Matryoshka Representation Learning (2022)
  3. pgvector README: halfvec, bit, binary quantization and subvector indexing

Häufige Fragen

Was ist Embedding-Quantisierung?

Sie speichert jeden Embedding-Wert mit weniger Bits, nachdem das Modell ihn erzeugt hat: 16-Bit-Floats, 8-Bit-Ganzzahlen oder ein einzelnes Bit pro Dimension. Das Modell bleibt gleich; nur die gespeicherten Vektoren und der Index werden kleiner und schneller zu vergleichen.

Wie viel Retrieval-Qualität kostet binäre Quantisierung?

In den Experimenten von Hugging Face mit mxbai-embed-large-v1 behielten binäre Embeddings rund 92,5 % der Retrieval-Leistung auf MTEB Retrieval. Das Rescoring der Top-Kandidaten mit dem float32-Anfrage-Embedding hob das auf rund 96 %. Andere Modelle und Domänen können abweichen, also an eigenen Daten testen.

Was sind Matryoshka-Embeddings?

Embeddings, die so trainiert sind, dass die ersten Dimensionen die meiste Information tragen, sodass man sie kürzen und den Großteil der Qualität behalten kann. Modelle wie die text-embedding-3-Familie von OpenAI und nomic-embed-text-v1.5 unterstützen das.

Kann ich binäre Quantisierung in PostgreSQL nutzen?

Ja. pgvector hat eine Funktion binary_quantize, einen Typ bit und Hamming-Distanz-Operatoren, also kann man einen HNSW-Ausdrucksindex auf die Binärversion bauen und die Kandidaten in derselben Abfrage mit den Originalvektoren neu ordnen.

Erst quantisieren oder erst kürzen?

Mit halber Genauigkeit beginnen, die fast nichts kostet, dann int8 oder binär mit Rescoring versuchen, wenn Speicher noch der Engpass ist. Matryoshka-Kürzung nutzen, wenn das Modell sie unterstützt und die Zahl der Dimensionen das Limit ist, nicht die Genauigkeit, etwa pgvectors Indexgrenze von 2.000 Dimensionen für vector.

Klingt nach dem, was du suchst?

Erzähl mir von deinem Projekt oder deiner Stelle – ich freue mich, von dir zu hören.