Vektor-Datenbank-Innern ermöglichen skalierbare Suchleistungen
Was ich beim Aufschluss der Interna einer verteilten Vektordatenbank gelernt habe Als ich anfing, die Vektorsuche in mein semantisches Engine-Prototype zu integrieren, wurde mir schnell klar, dass das Problem nicht nur darin bestand, eine Top-k-Accuracy zu erreichen. Es ging auch um Infrastruktur: Wie kann man die Aufnahme skaliert, Indizes effizient bauen, Lesekonsistenz aufrechterhalten und gleichzeitig Latenzziele unter Druck erfüllen? Dafür verbrachte ich Tage damit, in die Interna von Open-Source-Systemen wie Milvus zu tauchen, um herauszufinden, wie sie es schaffen, ANN-Suche in großem Maßstab bereitzustellen. Dieser Beitrag ist mein Versuch, das Zusammengefasste darzustellen – beginnend mit der Systemarchitektur, hinunter zu den Knoten, Komponenten und den Designentscheidungen, die den Erfolg bei der Vektorsuche in der Praxis entscheiden. Warum eine Vektordatenbank eine neue Architektur braucht Die meisten traditionellen Datenbanken sind für transaktionale Workloads wie Schlüssel-Wert-Paare, Dokumente oder relationale Daten optimiert. Vektordatenbanken hingegen sind eine andere Spezies. Sie sind darauf ausgelegt, rechenintensive Operationen wie Ähnlichkeitssuche und Indexerstellung zu handhaben. Wenn man diese Aufgaben in ein monolithisches OLTP-System quetscht, landet man mit brüchiger Performance und schlechtem Parallellismus. Eine gute Architektur für Vektoraufgaben sieht so aus: Systeme wie Milvus setzen eine vierstufige Architektur ein, die gut mit den Prinzipien verteilter Datenverarbeitung harmoniert: Anwendungsschicht (Application Layer) Koordinierungsschicht (Coordinator Layer) Berechnungsschicht (Compute Layer) Speicherschicht (Storage Layer) Diese Architektur ermöglicht es, schreib- und leseintensive Komponenten unabhängig voneinander zu skalieren – besonders wichtig, wenn man die 10 Millionen Vektoren-Grenze überschreitet. Abfrage-, Daten- und Indexknoten: Warum man drei Arten von Knoten benötigt Was mich überraschte, war, wie die Berechnungsschicht in spezialisierte Dienste aufgeteilt wird: QueryNode: In meinen Tests mit 50 Millionen Vektoren führte das Hinzufügen von zwei zusätzlichen QueryNodes unter einer Last von 300 Anfragen pro Sekunde dazu, dass die 95-Prozentil-Latenz von 780 ms auf etwa 420 ms sank. DataNode: Für Streaming-Anwendungen wie Echtzeit-Dokumentuploads oder Vektordaten-Logs ist dies entscheidend. Man will nicht, dass die Suchperformance von der Ingestion-Performance abhängt. IndexNode: Bei der Verwendung von HNSW mit hohem efConstruction ist es häufig, dass die CPUs ausgelastet sind. Indizes auf separaten Knoten zu isolieren vermeidet, dass die Suchlatenz dadurch beeinträchtigt wird. Segmente: Die Einheit der Daten und Isolation Ein Konzept, das ich erst nach dem Benchmarking der Insert- vs. Abfrageperformance zu würdigen lernte, sind Segmente. Anstatt einen globalen Index zu unterhalten, teilt Milvus die Daten in unveränderliche Blöcke (Standard: 512 MB) auf. Jeder Block wird unabhängig indiziert und durchsuchbar. Warum ist das wichtig? Auf einem Datensatz mit 100 Millionen Vektoren stellte ich fest, dass die Anpassung der Segmentgröße (von 512 MB auf 256 MB) die Recall-Rate für aktuelle Daten verbesserte, während die gesamte Abfragelatenz stabil blieb. Kleinere Segmente bedeuten frischere Daten, aber auch mehr Indexoverhead. Das Gleichgewicht hängt vom Anwendungsfall ab. Konsistenzebenen: Ignorierbare Handicaps gibt es nicht Milvus unterstützt beispielsweise vier Konsistenzebenen – von stark konsistent bis schlussendlich konsistent. Wenn man Chatbots mit RAG baut, sollte man standardmäßig "Sitzungskonsistenz" wählen, um sicherzustellen, dass sequentielle Benutzeranfragen ihre eigenen Schreibvorgänge sehen. Bei großen Batch-Inferenzprozessen könnte "schlussendlich konsistent" bessere Performance mit akzeptabler Veraltung bieten. Hier ist, wie ich das normalerweise sehe: Stark konsistent: Verwaltungspanel, Dashboards (höhere Latenz) Begrenzt veraltet: Überwachung, Stream-Replays (Lesen könnte veraltet sein) Sitzungskonsistent: Interaktive RAG, personalisierte Suche (Sitzungs-ID erforderlich) Schlussendlich konsistent: Offline-Bearbeitung, Logs (könnte aktuelle Einfügungen verpassen) Indizierung ist kein Hintergrundjob Eine Designentscheidung, die ich zu schätzen weiß: Milvus behandelt Indizierung nicht als schwarz gekastetes Batch-Job. Man hat Kontrolle über: Indizierungsmethoden Indizierungszeiten Parallelität der Indizierung Dies ist entscheidend für Anwendungsfälle wie die Produkt-Suche im E-Commerce, wo die Verteilung der Embeddings häufig wechselt. Deterministische Indizierungskontrolle ermöglicht es, folgende Aspekte zu optimieren: Accuracy Latenz Ressourcenverbrauch Deployment-Notizen Hier sind einige Erkenntnisse, die ich während des Testens gewann: Horizontale Skalierung: Füge mehr Knoten hinzu, um Last zu verteilen. Virtuelle Maschinen: Verwende dedizierte VMs für jede Art von Knoten. Netzwerklatenz: Minimiere die Netzwerklatenz zwischen den Knoten. Caching: Nutze Caching, um häufig abgefragte Vektoren schneller zur Verfügung zu stellen. Was ich als Nächstes erforsche Nachdem ich einige Prototypen und Benchmarks um diese Architektur herum gebaut habe, untersuche ich nun: Skalierung bei Milliarden von Vektoren Erweiterte Konsistenzmodelle Optimierungen für spezielle Anwendungsfälle Ich werde Benchmarks und Fallstricke teilen, sobald ich diese Schwellenwerte erreicht habe. Aber wenn Sie heute Vektordatenbanken evaluiert, vergleichen Sie nicht nur Recall und Latenz – graben Sie tief in die Systeminterna ein. Denn wenn die Architektur nicht skaliert, ist alles andere irrelevant. Diese Geschichte wurde auf Generative AI veröffentlicht. Verbinden Sie sich mit uns auf LinkedIn und folgen Sie Zeniteq, um auf dem Laufenden zu bleiben, was die neuesten KI-Geschichten angeht. Abonnieren Sie unseren Newsletter und unser YouTube-Kanal, um sich über die neuesten Nachrichten und Updates zum generativen KI informieren zu können. Lassen Sie uns gemeinsam die Zukunft der KI gestalten!