Auswählen eines Ansatzes zur Optimierung der Vektorspeicherung und -verarbeitung
Einbettungen oder die numerische Darstellung heterogener Inhalte sind die Grundlage von Workloads für die Vektorsuche, aber aufgrund der Größe lassen sich die Einbettungen nur schwer skalieren und ihre Verarbeitung ist kostspielig. Umfangreiche Forschungen und Produktentwicklungen haben zahlreiche Lösungen für eine bessere Skalierbarkeit und kürzere Verarbeitungszeiten erbracht. Azure KI-Suche nutzt eine Reihe dieser Funktionen für schnellere und kostengünstigere Vektorworkloads.
In diesem Artikel werden alle Optimierungstechniken in Azure KI-Suche aufgelistet, mit denen Sie Vektorgrößen und Abfrageverarbeitungszeiten reduzieren können.
Die Einstellungen für die Vektoroptimierung werden in den Definitionen der Vektorfelder in einem Suchindex angegeben. Die meisten der Features, die in diesem Artikel beschrieben werden, sind in der REST-API 2024-07-01 und in den Azure SDK-Paketen für diese Version allgemein verfügbar. Die aktuelle Vorschauversion bietet Unterstützung für abgeschnittene Dimensionen, wenn Sie „text-embedding-3-large“ oder „text-embedding-3-small“ für die Vektorisierung verwenden.
Auswerten der Optionen
Folgen Sie zunächst den drei Ansätzen in Azure KI-Suche zum Reduzieren der Speichermenge, die von Vektorfeldern belegt wird. Diese Ansätze schließen sich nicht gegenseitig aus und können kombiniert werden, um eine maximale Reduzierung der Vektorgröße zu erzielen.
Wir empfehlen die integrierte Quantisierung, da sie die Vektorgröße im Arbeitsspeicher und auf dem Datenträger mit minimalem Aufwand komprimiert und in den meisten Szenarien den größten Nutzen bietet. Schmale Typen (mit Ausnahme von „float16“) erfordern dagegen zusätzlichen Aufwand. Zudem speichert stored
auf Datenträgerspeicher, was kostengünstiger ist als Arbeitsspeicher.
Vorgehensweise | Warum sollten Sie diese Option verwenden? |
---|---|
Hinzufügen der skalaren oder binären Quantisierung | Verwenden Sie die Quantisierung, um native float32- oder float16-Einbettungen in „int8“ (skalar) oder „Byte“ (binär) zu komprimieren. Mit dieser Option wird der Speicher im Arbeitsspeicher und auf dem Datenträger reduziert, ohne dass die Abfrageleistung beeinträchtigt wird. Kleinere Datentypen wie „int8“ oder „Byte“ führen beispielsweise zu Vektorindizes mit weniger Inhalt als Datentypen mit größeren Einbettungen. Um den Informationsverlust zu verrechnen, enthält die integrierte Komprimierung Optionen für die Nachabfrageverarbeitung mit nicht komprimierten Einbettungen und Oversampling, um relevantere Ergebnisse zurückzugeben. Neubewertung (Neusortierung) und Überquotierung sind spezifische Features der integrierten Quantisierung von float32- oder float16-Felder und können nicht für Einbettungen verwendet werden, die einer benutzerdefinierten Quantisierung unterzogen werden. |
Abschneiden von Dimensionen für MRL-fähige „text-embedding-3“-Modelle (Vorschau) | Nutzen Sie die Möglichkeit, bei „text-embedding-3“-Modellen weniger Dimensionen zu verwenden. In Azure OpenAI wurden diese Modelle mit der Matryoshka Representation Learning (MRL)-Technik neu trainiert, die mehrere Vektordarstellungen mit unterschiedlichen Komprimierungsgraden erzeugt. Dieser Ansatz beschleunigt Suchvorgänge und reduziert die Speicherkosten bei minimalem Verlust semantischer Informationen. In Azure KI-Suche ergänzt die MRL-Unterstützung die Skalar- und Binärquantisierung. Wenn Sie eine dieser Quantisierungsmethoden verwenden, können Sie auch eine truncateDimension -Eigenschaft für Ihre Vektorfelder angeben, um die Dimensionalität von Texteinbettungen zu verringern. |
Zuweisen kleinerer primitiver Datentypen zu Vektorfeldern | Schmale Datentypen wie „float16“, „int16“, „int8“ und „Byte“ (binär) verbrauchen weniger Speicherplatz im Arbeitsspeicher und auf dem Datenträger. Sie müssen jedoch über ein Einbettungsmodell verfügen, das Vektoren in einem schmalen Datenformat ausgibt. Oder Sie müssen über eine benutzerdefinierte Quantisierungslogik verfügen, die kleine Daten ausgibt. Ein dritter Anwendungsfall, der weniger Aufwand erfordert, ist die Umwandlung von nativen float32-Einbettungen, die von den meisten Modellen erzeugt werden, in „float16“. Weitere Informationen zu binären Vektoren finden Sie unter Index-Binärvektoren. |
Entfernen optionaler Speicher von abrufbaren Vektoren | In einer Abfrageantwort zurückgegebene Vektoren werden getrennt von Vektoren gespeichert, die während der Abfrageausführung verwendet werden. Wenn Sie keine Vektoren zurückgeben müssen, können Sie den abrufbaren Speicher deaktivieren, wodurch der gesamte Datenträgerspeicher pro Feld um bis zu 50 Prozent reduziert wird. |
Alle diese Optionen werden für einen leeren Index definiert. Verwenden Sie zum Implementieren dieser Optionen das Azure-Portal, REST-APIs oder ein Azure SDK-Paket für diese API-Version.
Nachdem der Index definiert wurde, können Sie Dokumente als separaten Schritt laden und indiziert werden.
Beispiel: Vektorgröße durch Vektorkomprimierungstechnik
Codebeispiel: Vektorquantisierungs- und Speicheroptionen mithilfe von Python ist ein Python-Codebeispiel, das mehrere Suchindizes erstellt, die je nach Verwendung von Vektorspeicherquantisierung, schmalen Datentypen und Speichereigenschaftenvariieren.
Dieser Code erstellt und vergleicht die Speicher- und Vektorindexgröße für jede Option zur Vektorspeicheroptimierung. Anhand dieser Ergebnisse können Sie sehen, dass die Vektorgröße durch die Quantisierung am meisten reduziert wird, die größten Speicherplatzeinsparungen werden jedoch erzielt, wenn Sie mehrere Optionen verwenden.
Indexname | Speichergröße | Vektorgröße |
---|---|---|
compressiontest-baseline | 21,3613 MB | 4,8277 MB |
compressiontest-scalar-compression | 17,7604 MB | 1,2242 MB |
compressiontest-narrow | 16,5567 MB | 2,4254 MB |
compressiontest-no-stored | 10,9224 MB | 4,8277 MB |
compressiontest-all-options | 4,9192 MB | 1,2242 MB |
Such-APIs melden die Speicher- und Vektorgröße auf Indexebene. Der Vergleich muss daher auf der Grundlage von Indizes durchgeführt werden, nicht mit Feldern. Verwenden Sie GET Index Statistics oder eine entsprechende API in den Azure SDKs, um die Vektorgröße abzurufen.