Im Inneren von Vektordatenbanken: IVF, Bäume, HNSW und Produktquantisierung
Im Inneren von Vektordatenbanken: exakte versus annähernde Suche, IVF-Cluster, Baumwälder, HNSW-Schichten und ihre Parameter sowie welche Kosten durch Produktquantisierung entstehen.
Quellen: The RAG Story — About Vector DB’s
Begriffe wie RAG, Vektordatenbanken, Abrufverfahren und Chunking werden ständig verwendet und klingen komplizierter, als sie tatsächlich sind. Dieser Artikel beginnt mit Vektordatenbanken: Was sie speichern und wie die Suche darin eigentlich funktioniert.
Woher die Vektoren stammen
Embedding-Modelle, die anhand riesiger Textsammlungen trainiert wurden, wandeln die Bedeutung eines Satzes in eine Liste von Zahlen um. Einige davon sind in der Cloud verfügbar, wie OpenAI’s Text-Embeddings und Google’s Gemini-Embedding-Modelle. Andere laufen lokal, wie die Qwen3-Embedding-Familie in den Größen 8B, 4B und 0,6B oder Jina’s v5-text-small-Modell mit etwa 677 M Parametern. Wenn man seinen Text durch eines dieser Modelle leitet, erhält man einen Vektor, den man speichern und später abrufen kann.
Das Vokabular
Einige wenige Begriffe tauchen in jeder Vektordatenbank immer wieder auf:
- Sammlung. Ein Namensraum, der Punkte enthält, die eine feste Dimension und eine gemeinsame Abstandsmetrik teilen.
- Punkt. Ein Vektor zusammen mit seiner ID und einem Metadaten-Teil.
- Abstandsmetrik. Die Methode zur Messung der Nähe, in der Regel Kosinusähnlichkeit, Skalarprodukt oder euklidischer Abstand.
- Upsert. Die Operation, bei der Daten eingefügt werden, indem neue Punkte hinzugefügt und vorhandene aktualisiert werden.
- Suche. Die Abfragemethode, für die alles andere bestimmt ist.
Die Intuition: exakt versus annähernd
Die naive Methode, um unter 10.000 oder mehr Vektoren die mit einer Abfrage verbundenen Vektoren zu finden, besteht darin, die Kosinusähnlichkeit mit jedem gespeicherten Vektor zu berechnen und die k besten zu behalten. Das Ergebnis ist die Menge der exakten nächsten Nachbarn. Bei Millionen von Vektoren wird jedoch diese brute-Force-Suche aufgrund von Speicher- und Zeitbeschränkungen unpraktisch. Deshalb wechselten Systeme auf die Suche nach annähernden nächsten Nachbarn (ANN), bei der ein geringer Genauigkeitsverlust im Austausch für eine erhebliche Geschwindigkeitssteigerung in Kauf genommen wird.
Dieser Kompromiss kann auf zwei grundlegende Weisen erreicht werden. Indexierung verringert die Anzahl der notwendigen Vergleiche. Quantisierung senkt die Kosten pro Vergleich. Gemeinsam bilden sie das Werkzeugset für ANN.
Indexierung, Option eins: Clustering mit IVF
Ein umgekehrter Dateinachweis (IVF) teilt die Vektoren in Cluster auf, von denen jeder einen Schwerpunkt hat. Zunächst wird die Abfrage nur mit den Schwerpunkten verglichen. Sobald der nächstgelegene Cluster gefunden wurde, wird die Abfrage ausschließlich mit den Vektoren in diesem Cluster verglichen, und die besten k Ergebnisse werden ausgewählt.
Die Schwächen sind bekannt zu machen:
- Nachbarn in der Nähe der Zellgrenzen werden übersehen. Wenn die tatsächliche Übereinstimmung in einer Zelle liegt, die nicht überprüft wurde, wird sie niemals gefunden. Das Überprüfen mehrerer Zellen hilft, verlangsamt aber die Suche und untergräbt den Zweck.
- Die Qualität nimmt mit Datenänderungen ab. Die Cluster werden zur Erstellung festgelegt, sodass neue Daten ständig in alten Zellen landen und die Suchqualität nachlässt. Regelmäßige Neuerstellungen sind erforderlich.
In einem Satz: IVF ist einfach und spart Speicher, verliert aber bei Rändern an Genauigkeit und leidet unter häufigen Aktualisierungen, weshalb es in der Milliarden-Skala in Kombination mit Produktquantisierung hervorragt, während HNSW bei Echtzeit-Suchen mit hoher Genauigkeit vorteilhaft ist.
Indexierung, Option zwei: baumbasierte Partitionierung
Die baumbasierte Indexierung übernimmt das Konzept der binären Suche. Anstatt die Abfrage mit jedem Vektor zu vergleichen, wird der Speicherbereich immer wieder halbiert, und nur die Hälfte, die die Abfrage enthält, wird untersucht.
Zum Erstellen des Indexes nimmt man den gesamten Bereich und teilt ihn mit einer Trennlinie, teilt anschließend jede Hälfte erneut, bis jede kleine Region nur noch wenige Vektoren enthält. Jede Region ist ein Blatt. In zwei Dimensionen könnte die erste Teilung entlang der x-Achse erfolgen, die nächste entlang der y-Achse und so weiter. Alle Teilungen bilden einen Binärbaum, bei dem jeder Knoten eine Ja-oder-Nein-Frage darstellt, wie zum Beispiel ob x unter 5 liegt, wobei die Blätter am unteren Ende liegen.
Wenn eine Abfrage eintrifft, beginnt man am Wurzelknoten und beantwortet nacheinander eine Frage: Links oder rechts dieser Teilung? Jede Antwort eliminiert die Hälfte des verbleibenden Bereichs. Nach etwa log n Fragen, ungefähr 20 für eine Million Vektoren, erreicht man ein kleines Blatt und vergleicht die Abfrage mit den wenigen Vektoren darin.
Es gibt jedoch einen Haken. Der wahre nächste Nachbar könnte sich direkt jenseits einer Trennlinie befinden – in geringer Entfernung, aber in einem anderen „Blatt“ – und ein einzelner Baum würde ihn niemals erkennen. Daher erstellen Bibliotheken wie Spottys Annoy viele Bäume, wobei jeder Baum unterschiedliche zufällige Aufteilungen verwendet. Jeder Baum schlägt Kandidaten vor, diese Vorschläge werden zusammengeführt und die besten ausgewählt. Was ein Baum übersehen hat, bemerkt in der Regel ein anderer.
Die Nachteile:
- Das Grenzproblem ist schlimmer als bei IVF. Bei IVF bedeutet ein Verpassen der Grenze, dass eine weitere Zelle überprüft werden muss. In einem Baum führt ein falscher Weg in der Nähe der Spitze die Suche in eine völlig andere Region.
- Die Lösung kostet Speicherplatz und Rechenzeit. Ein Wald aus 50 Bäumen bedeutet, dass der Index 50 Mal gespeichert und bei jeder Abfrage 50 Mal durchsucht werden muss, wodurch Genauigkeit auf Kosten von Ressourcen erreicht wird.
Kurz gesagt sind Bäume einfach und schnell zu erstellen, doch hochdimensionale Embeddings zerstören ihre Struktur und ermöglichen keine Aktualisierungen, weshalb sie heute hauptsächlich als Zwischenstufe für Erklärungen dienen und keine Wahl für die Produktion sind.
Indexierung, Option drei: HNSW
Hierarchical Navigable Small Worlds, kurz HNSW, ist die Technik hinter den meisten Vektordatenbanken. Sie organisiert Vektoren als Graph mit mehreren Ebenen. Die oberen Ebenen enthalten nur wenige Vektoren mit langreichweiten Verbindungen, ähnlich Autobahnen zwischen Städten, während die unteren Ebenen allmählich mehr Vektoren mit kürzeren Verbindungen enthalten, bis hin zur untersten Ebene, die alle Vektoren enthält.
Die Suche beginnt an der Oberfläche und bewegt sich gierig zu dem Nachbarn, der der Abfrage am nächsten ist. Wenn kein Nachbar näher liegt, geht sie eine Ebene tiefer und wiederholt den Vorgang von dort aus mit feinerer Gliederung der Verbindungen. In der untersten Ebene erkundet sie ein größeres Umfeld und gibt die besten Ergebnisse zurück. Lange Sprünge überbrücken große Entfernungen schnell, während kurze Schritte die Ergebnisse präzisieren – deshalb bleibt die Anzahl der Vergleiche auch bei riesigen Datensätzen gering.
Mehrere Parameter steuern das Gleichgewicht zwischen Geschwindigkeit und Genauigkeit:
- M legt fest, wie viele Verbindungen jeder Vektor beibehält. Mehr Verbindungen verbessern Genauigkeit und Vollständigkeit, kosten aber mehr Speicherplatz.
- efConstruction bestimmt, wie breit das Suchgebiet während des Aufbaus des Graphen ist. Höhere Werte ergeben einen besseren Graphen, führen aber zu einem langsameren Aufbau.
Wenn man sieht, wie eine Abfrage durch die verschiedenen Ebenen geht und wie diese Einstellungen den Ablauf beeinflussen, wird klar, wie sich Änderungen an ihnen auf das Suchverhalten auswirken.
Quantisierung: Jede Vergleich wird günstiger
Das Indexieren verringert die Anzahl der Vergleiche. Die Quantisierung senkt den Kosten pro Vergleich. Ein einzelner 1536-dimensionaler Vektor aus 32-Bit-Flotten nimmt 1536 mal 4, also 6144 Bytes ein. Für eine Milliarde Vektoren bedeutet das Terabyte an Speicherplatz – weitaus mehr, als in der RAM untergebracht werden kann.
Produktquantisierung
Die Quantisierung von Produkten teilt jeden großen Vektor in kleinere, gleich große Abschnitte auf. Ein 16-dimensionaler Vektor könnte beispielsweise in vier 4-dimensionalen Abschnitte unterteilt werden. Für jede Abschnittsposition wird ein Codebuch anhand der gespeicherten Daten mit 256 Einträgen trainiert, wobei jeder Eintrag einen typischen Teilvektor darstellt. Jeder Abschnitt wird anschließend durch die Nummer seines nächsten Codebuch-Eintrags ersetzt, wofür lediglich ein Byte benötigt wird.
So wird ein Vektor, der ursprünglich Tausende von Bytes in Anspruch nahm, zu einer kurzen Folge kleiner Ganzzahlen. Zur Suche wird die Abfrage auf dieselbe Weise aufgeteilt, und die Entfernungen zu den Codebuch-Einträgen werden einmal berechnet und bei der Abfrage jedes gespeicherten Vektors wiederverwendet. Die Berechnung ist stark annähernd, doch die Geschwindigkeitssteigerung und der Speichereinsparungseffekt sind erheblich.
Die Auswahl unter ihnen
Ein kurzer Vergleich fasst alles zusammen:
- IVF ist einfach und erfordert wenig Speicher. Kombinieren Sie es mit Produktquantisierung für sehr große, statische Sammlungen.
- Bäume sind leicht verständlich und kostengünstig zu erstellen, eignen sich aber nur für niedrige Dimensionen und unveränderliche Daten.
- HNSW bietet hohe Genauigkeit und schnelle Suchfunktionen in Echtzeit, kommt aber mit höherem Speicherverbrauch daher.
- Produktquantisierung komprimiert Vektoren und beschleunigt die Distanzberechnungen, führt dabei zu einem kontrollierten Verlust an Präzision, und kann mit den oben genannten Indizes kombiniert werden.
Diese Abwägungen zu kennen hilft Ihnen dabei, zu entscheiden, wann eine annähernde Suche angebracht ist, welcher Algorithmus zu einer bestimmten Arbeitslast passt und wann brute force weiterhin die richtige Lösung ist – beispielsweise bei kleinen Sammlungen, bei denen Genauigkeit wenig kostet.