Reduzieren der Vektorgröße durch Quantisierung, schmale Datentypen und Speicheroptionen
In diesem Artikel werden die Vektorquantisierung und andere Techniken zum Reduzieren der Vektorgröße in Azure KI-Suche beschrieben. Der Suchindex gibt Vektorfelddefinitionen an, einschließlich Eigenschaften, die verwendet werden, um schmale Datentypen anzugeben oder zu steuern, ob eine Kopie des Vektorinhalts für Suchergebnisse aufbewahrt wird. Die Quantisierung wird ebenfalls im Index angegeben und dem Vektorfeld über das Vektorprofil zugewiesen.
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.
Das Beispiel am Ende dieses Artikels zeigt die Variationen der Vektorgröße für jeden der in diesem Artikel beschriebenen Ansätze.
Auswerten der Optionen
Überprüfen Sie zunächst die drei Ansätze 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 skalare und binäre Quantisierung. 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.
Option 1: Konfigurieren der Quantisierung
Die Quantisierung wird zum Reduzieren der Vektorgröße empfohlen, da sie den Speicherplatzbedarf im Arbeitsspeicher und auf dem Datenträger für float16- und float32-Einbettungen verringert. Um die Auswirkungen eines kleineren Index auszugleichen, können Sie die Überquotierung und Neubewertung für nicht komprimierte Vektoren hinzufügen.
Die Quantisierung gilt für Vektorfelder, die Vektoren vom Typ „float“ empfangen. In den Beispielen in diesem Artikel wird der Felddatentyp Collection(Edm.Single)
für eingehende float32-Einbettungen verwendet, „float16“ wird jedoch ebenfalls unterstützt. Wenn die Vektoren in einem Feld mit konfigurierter Komprimierung empfangen werden, führt die Engine automatisch eine Quantisierung durch, um den Speicherbedarf der Vektordaten im Arbeitsspeicher und auf dem Datenträger zu reduzieren.
Zwei Quantisierungstypen werden unterstützt:
Die skalare Quantisierung komprimiert Float-Werte in schmalere Datentypen. Azure KI Suche unterstützt derzeit den Typ „int8“, der 8 Bit belegt und die Größe des Vektorindex um das Vierfache reduziert.
Die binäre Quantisierung konvertiert float-Typen in binäre Bits, die 1 Bit belegen. Dies führt zu einer bis zu 28-mal geringeren Vektorindexgröße.
Um die integrierte Quantisierung zu verwenden, gehen Sie wie folgt vor:
- Verwenden Sie die API zum Erstellen eines Index (Create Index) oder Erstellen oder Aktualisieren eines Index (Create Or Update Index), um die Vektorkomprimierung anzugeben.
- Fügen Sie einem Suchindex
vectorSearch.compressions
hinzu. - Fügen Sie eine
scalarQuantization
- oderbinaryQuantization
-Konfiguration hinzu, und benennen Sie sie. - Legen Sie optionale Eigenschaften fest, um die Auswirkungen einer verlustbehafteten Indizierung zu verringern.
- Erstellen Sie ein neues Vektorprofil, das die benannte Konfiguration verwendet.
- Erstellen Sie ein neues Vektorfeld mit dem neuen Vektorprofil.
- Laden Sie den Index mit float32- oder float16-Daten, die während der Indizierung mit der von Ihnen definierten Konfiguration quantisiert werden.
- Optional können Sie mithilfe des Oversampling-Parameters quantisierte Daten abfragen, wenn Sie die Standardeinstellung außer Kraft setzen möchten.
Hinzufügen von „compressions“ (Komprimierungen) zu einem Suchindex
Das folgende Beispiel zeigt eine partielle Indexdefinition mit einer Feldsammlung, die ein Vektorfeld und einen Abschnitt vectorSearch.compressions
enthält.
Dieses Beispiel umfasst sowohl scalarQuantization
als auch binaryQuantization
. Sie können beliebig viele Komprimierungskonfigurationen angeben und einem Vektorprofil dann die gewünschten Konfigurationen zuweisen.
POST https://[servicename].search.windows.net/indexes?api-version=2024-07-01
{
"name": "my-index",
"fields": [
{ "name": "Id", "type": "Edm.String", "key": true, "retrievable": true, "searchable": true, "filterable": true },
{ "name": "content", "type": "Edm.String", "retrievable": true, "searchable": true },
{ "name": "vectorContent", "type": "Collection(Edm.Single)", "retrievable": false, "searchable": true, "dimensions": 1536,"vectorSearchProfile": "vector-profile-1"},
],
"vectorSearch": {
"profiles": [ ],
"algorithms": [ ],
"compressions": [
{
"name": "use-scalar",
"kind": "scalarQuantization",
"scalarQuantizationParameters": {
"quantizedDataType": "int8"
},
"rerankWithOriginalVectors": true,
"defaultOversampling": 10
},
{
"name": "use-binary",
"kind": "binaryQuantization",
"rerankWithOriginalVectors": true,
"defaultOversampling": 10
}
]
}
}
Die wichtigsten Punkte:
kind
muss aufscalarQuantization
oderbinaryQuantization
festgelegt werden.rerankWithOriginalVectors
verwendet die ursprünglichen, nicht komprimierten Vektoren, um Die Ähnlichkeit neu zu berechnen und die top-Ergebnisse zu reranken, die von der ursprünglichen Suchabfrage zurückgegeben werden. Die nicht komprimierten Vektoren sind im Suchindex vorhanden, auch wennstored
"false" ist. Diese Eigenschaft ist optional. Der Standardwert ist korrekt.defaultOversampling
betrachtet eine breitere Reihe potenzieller Ergebnisse, um die Verringerung der Informationen aus der Quantisierung zu verrechnen. Die Formel für potenzielle Ergebnisse besteht aus derk
Abfrage mit einem Oversampling-Multiplikator. Wenn die Abfrage beispielsweise einenk
Wert von 5 angibt und die Oversampling 20 ist, fordert die Abfrage effektiv 100 Dokumente für die Verwendung in Reranking an, wobei der ursprüngliche nicht komprimierte Vektor zu diesem Zweck verwendet wird. Es werden nur die top rerangiertenk
Ergebnisse zurückgegeben. Diese Eigenschaft ist optional. Der Standardwert ist 4.quantizedDataType
ist optional und gilt nur für die skalare Quantisierung. Wenn Sie diesen Typ hinzufügen, muss er aufint8
festgelegt werden. Dies ist der einzige primitive Datentyp, der derzeit für die skalare Quantisierung unterstützt wird. Der Standardwert istint8
.
Hinzufügen des HNSW-Algorithmus
Stellen Sie sicher, dass Ihr Index über den Hierarchical Navigable Small Worlds (HNSW)-Algorithmus verfügt. Integrierte Quantisierung wird nicht mit erschöpfenden KNN unterstützt.
"vectorSearch": {
"profiles": [ ],
"algorithms": [
{
"name": "use-hnsw",
"kind": "hnsw",
"hnswParameters": {
"m": 4,
"efConstruction": 400,
"efSearch": 500,
"metric": "cosine"
}
}
],
"compressions": [ <see previous section>]
}
Erstellen und Zuweisen eines neuen Vektorprofils
Um eine neue Quantisierungskonfiguration zu verwenden, müssen Sie ein neues Vektorprofil erstellen. Die Erstellung eines neuen Vektorprofils ist erforderlich, um komprimierte Indizes im Arbeitsspeicher zu erstellen. Das neue Profil verwendet HNSW.
Erstellen Sie in derselben Indexdefinition ein neues Vektorprofil, und fügen Sie eine Komprimierungseigenschaft sowie einen Algorithmus hinzu. Das folgende Beispiel zeigt zwei Profile, eins für jeden Quantisierungsansatz.
"vectorSearch": { "profiles": [ { "name": "vector-profile-hnsw-scalar", "compression": "use-scalar", "algorithm": "use-hnsw", "vectorizer": null }, { "name": "vector-profile-hnsw-binary", "compression": "use-binary", "algorithm": "use-hnsw", "vectorizer": null } ], "algorithms": [ <see previous section> ], "compressions": [ <see previous section> ] }
Weisen Sie einem neuenVektorfeld ein Vektorprofil zu. Der Datentyp des Felds ist „float32“ oder „float16“.
Die Entity Data Model (EDM)-Entsprechungen der Typen „float32“ and „float16“ in Azure KI-Suche sind
Collection(Edm.Single)
bzw.Collection(Edm.Half)
.{ "name": "vectorContent", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "vector-profile-hnsw-scalar", }
Laden Sie den Index mithilfe von Indexern für die Pullmodellindizierung oder APIs für die Pushmodellindizierung.
Funktionsweise der skalaren Quantisierung in Azure KI Search
Die skalare Quantisierung reduziert die Auflösung jeder Zahl innerhalb der Vektoreinbettung. Anstatt jede Zahl als 16-Bit- oder 32-Bit-Gleitkommazahl zu beschreiben, wird eine ganze 8-Bit-Zahl verwendet. Er identifiziert einen Zahlenbereich (in der Regel 99. Quantil Minimum und Maximum) und dividiert sie in eine begrenzte Anzahl von Ebenen oder Bins, wobei jedem Bin ein Bezeichner zugewiesen wird. In der 8-Bit-Skalar-Quantisierung gibt es 2^8 oder 256 mögliche Bins.
Jede Komponente des Vektors wird dem nächstgelegenen repräsentativen Wert innerhalb dieses Satzes von Quantisierungsebenen in einem Prozess zugeordnet, der einer reellen Zahl auf die nächste ganze Zahl entspricht. Im quantisierten 8-Bit-Vektor steht die Bezeichnernummer anstelle des ursprünglichen Werts. Nach der Quantisierung wird jeder Vektor durch ein Array von Bezeichnern für die Bins dargestellt, zu denen seine Komponenten gehören. Diese quantisierten Vektoren erfordern im Vergleich zum ursprünglichen Vektor viel weniger Bits zu speichern, wodurch die Speicheranforderungen und der Speicherbedarf reduziert werden.
Funktionsweise der binären Quantisierung in Azure KI-Suche
Die binäre Quantisierung komprimiert hochdimensionale Vektoren, indem jede Komponente als einzelnes Bit (0 oder 1) dargestellt wird. Diese Methode reduziert den Speicherbedarf erheblich und beschleunigt Vorgänge zum Vergleichen von Vektoren, die für Such- und Abrufaufgaben von entscheidender Bedeutung sind. Benchmarktests zeigen eine Verringerung der Vektorindexgröße um bis zu 96 %.
Die binäre Quantisierung ist besonders effektiv für Einbettungen mit Dimensionen, die größer als 1.024 sind. Für kleinere Dimensionen wird empfohlen, die Qualität der binären Quantisierung zu testen oder stattdessen die skalare Quantisierung auszuprobieren. Darüber hinaus haben wir festgestellt, dass die binäre Quantisierung sehr gut funktioniert, wenn Einbettungen um Null zentriert sind. Die beliebtesten Einbettungsmodelle wie OpenAI, Cohere und Mistral sind um Null zentriert.
Verwenden der MRL-Komprimierung und von abgeschnittenen Dimensionen (Vorschau)
Die mehrstufige MRL-Komprimierung reduziert den Bedarf an Vektorspeicher und verbessert die Antwortzeiten für Vektorabfragen auf der Grundlage von Texteinbettungen. In Azure KI-Suche wird die MRL-Unterstützung nur in Verbindung mit einer anderen Quantisierungsmethode angeboten. Die Verwendung der binären Quantisierung mit MRL ermöglicht eine maximale Reduzierung der Vektorindexgröße. Um eine maximale Speicherreduzierung zu erzielen, verwenden Sie die binäre Quantisierung mit MRL, und legen Sie stored
auf „false“ fest.
Dieses Feature befindet sich in Vorschau. Es ist in 2024-09-01-preview
und in SDK-Betapaketen für diese API-Vorschauversion verfügbar.
Anforderungen
- Text-embedding-3-small, text-embedding-3-large (nur Textinhalte)
- Neue Vektorfelder vom Typ
Edm.Half
oderEdm.Single
(vorhandenen Feldern kann keine MRL-Komprimierung hinzugefügt werden) - HNSW-Algorithmus (ein vollständiger KNN-Algorithmus wird in dieser Vorschauversion nicht unterstützt)
- Konfiguration der skalaren oder binären Quantisierung (die binäre Quantisierung wird empfohlen)
Unterstützte Clients
- REST-API 2024-09-01-preview
- Überprüfen Sie die Änderungsprotokolle für jedes Azure SDK-Betapaket: Python, .NET, Java und JavaScript.
Für das Azure-Portal oder Azure KI Studio ist derzeit keine Unterstützung verfügbar.
Verwenden von Texteinbettungen mit MRL-Erweiterung
MRL ist eine Funktion des textembedding-Modells. Führen Sie die folgenden Schritte aus, um diese Funktionen in Azure KI-Suche nutzen zu können.
- Geben Sie in Ihrer Indexdefinition ein
vectorSearch.compressions
-Objekt an. - Schließen Sie eine Quantisierungsmethode ein, entweder skalar oder binär (empfohlen).
- Fügen Sie den Parameter
truncationDimension
mit dem Wert 512 hinzu, oder verringern Sie den Wert auf bis zu 256, wenn Sie das Modell „text-embedding-3-large“ verwenden. - Geben Sie ein Vektorprofil an, das den HNSW-Algorithmus und das Vektorkomprimierungsobjekt angibt.
- Weisen Sie das Vektorprofil einem Vektorfeld vom Typ
Edm.Half
oderEdm.Single
in der Feldsammlung zu.
Für die Verwendung eines MRL-fähigen Texteinbettungsmodells sind keine Änderungen der Abfrage erforderlich. Integrierte Vektorisierung, Text-in-Abfrage-Konvertierungen zur Abfragezeit, semantische Rangfolge und andere Features zum Verbessern der Relevanz wie die Neusortierung mit ursprünglichen Vektoren und die Überquotierung sind von der MRL-Unterstützung nicht betroffen.
Die Indizierung nimmt aufgrund der zusätzlichen Schritte mehr Zeit in Anspruch, Abfragen werden jedoch schneller ausgeführt.
Beispiel für eine Vektorsuchkonfiguration, die MRL unterstützt
Das folgende Beispiel zeigt eine Vektorsuchkonfiguration, die die Anforderungen und Empfehlungen von MRL erfüllt.
truncationDimension
ist eine Komprimierungseigenschaft. Sie gibt an, wie stark der Vektorgraph im Speicher in Verbindung mit einer Komprimierungsmethode wie der skalaren oder binären Komprimierung verkleinert werden soll. Wir empfehlen einen Wert von mindestens 1.024 für truncationDimension
mit binärer Quantisierung. Eine Dimensionalität von weniger als 1.000 verschlechtert die Qualität der Suchergebnisse, wenn MRL und die binäre Komprimierung verwendet werden.
{
"vectorSearch": {
"profiles": [
{
"name": "use-bq-with-mrl",
"compression": "use-mrl,use-bq",
"algorithm": "use-hnsw"
}
],
"algorithms": [
{
"name": "use-hnsw",
"kind": "hnsw",
"hnswParameters": {
"m": 4,
"efConstruction": 400,
"efSearch": 500,
"metric": "cosine"
}
}
],
"compressions": [
{
"name": "use-mrl",
"kind": "truncation",
"rerankWithOriginalVectors": true,
"defaultOversampling": 10,
"truncationDimension": 1024
},
{
"name": "use-bq",
"kind": "binaryQuantization",
"rerankWithOriginalVectors": true,
"defaultOversampling": 10
}
]
}
}
Im Folgenden sehen Sie ein Beispiel für eine vollständig angegebene Vektorfelddefinition, die die Anforderungen für MRL erfüllt.
Denken Sie daran, dass Vektorfelder vom Typ Edm.Half
oder Edm.Single
sein müssen. Vektorfelder müssen über eine vectorSearchProfile
-Eigenschaft verfügen, die die Algorithmus- und Komprimierungseinstellungen bestimmt. Vektorfelder verfügen über eine dimensions
-Eigenschaft, mit der die Anzahl von Dimensionen für die Bewertung und Sortierung von Ergebnissen angegeben wird. Der Wert sollte auf die maximale Anzahl von Dimensionen des verwendeten Modells festgelegt werden (1.536 für „text-embedding-3-small“).
{
"name": "text_vector",
"type": "Collection(Edm.Single)",
"searchable": true,
"filterable": false,
"retrievable": false,
"stored": false,
"sortable": false,
"facetable": false,
"key": false,
"indexAnalyzer": null,
"searchAnalyzer": null,
"analyzer": null,
"normalizer": null,
"dimensions": 1536,
"vectorSearchProfile": "use-bq-with-mrl",
"vectorEncoding": null,
"synonymMaps": []
}
Option 2: Zuweisen schmaler Datentypen zu Vektorfeldern
Eine einfache Möglichkeit zum Verringern der Vektorgröße ist das Speichern von Einbettungen in einem kleineren Datenformat. Die meisten Einbettungsmodelle geben 32-Bit-Gleitkommazahlen aus. Wenn Sie Ihre Vektoren jedoch quantisieren oder dies nativ von Ihrem Einbettungsmodell unterstützt wird, ist eine float16-, int16- oder int8-Ausgabe möglich, die deutlich kleiner ist als „float32“. Sie können diese kleineren Vektorgrößen verwenden, indem Sie einem Vektorfeld einen schmalen Datentyp zuweisen. Im Vektorindex belegen schmale Datentypen weniger Speicherplatz.
Informationen zur empfohlenen Verwendung finden Sie unter EDM-Datentypen für Vektorfelder:
Collection(Edm.Single)
32-Bit-Gleitkomma (Standard)Collection(Edm.Half)
16-Bit-Gleitkommazahl (schmal)Collection(Edm.Int16)
ganze 16-Bit-Zahl mit Vorzeichen (schmal)Collection(Edm.SByte)
ganze 8-Bit-Zahl mit Vorzeichen (schmal)Collection(Edm.Byte)
ganze 8-Bit-Zahl ohne Vorzeichen (nur zulässig bei gepackten Binärdatentypen)
Bestimmen Sie anhand dieser Liste, welcher Datentyp für die Ausgabe Ihres Einbettungsmodells oder für Vektoren mit benutzerdefinierter Quantisierung gültig ist.
Die folgende Tabelle enthält Links zu mehreren Einbettungsmodellen, die einen schmalen Datentyp (
Collection(Edm.Half)
) ohne zusätzliche Quantisierung verwenden. Sie können „float32“ ohne zusätzlichen Aufwand in „float16“ umwandeln (mitCollection(Edm.Half)
).Einbettungsmodell Native Ausgabe Diesen Typ in Azure KI-Suche zuweisen text-embedding-ada-002 Float32
Collection(Edm.Single)
oderCollection(Edm.Half)
text-embedding-3-small Float32
Collection(Edm.Single)
oderCollection(Edm.Half)
text-embedding-3-large Float32
Collection(Edm.Single)
oderCollection(Edm.Half)
Cohere V3 Einbettungsmodell mit int8 Einbettungstyp Int8
Collection(Edm.SByte)
Andere schmale Datentypen können verwendet werden, wenn Ihr Modell Einbettungen im kleineren Datenformat ausgibt oder wenn Sie eine benutzerdefinierte Quantisierung verwenden, die Vektoren in ein kleineres Format konvertiert.
Stellen Sie sicher, dass Sie die Kompromisse eines schmalen Datentyps verstehen.
Collection(Edm.Half)
hat weniger Informationen, was zu einer niedrigeren Auflösung führt. Wenn Ihre Daten homogen oder dicht sind, kann der Verlust zusätzlicher Details oder Nuancen zu inakzeptablen Ergebnissen zur Abfragezeit führen, da es weniger Details gibt, die verwendet werden können, um nahe gelegene Vektoren voneinander zu unterscheiden.Definieren und erstellen Sie den Index. Sie können für diesen Schritt das Azure-Portal, die REST-API zum Erstellen oder Aktualisieren eines Index (Create or Update Index) oder ein Azure SDK-Paket verwenden.
Prüfen Sie die Ergebnisse. Wenn das Vektorfeld als abrufbar gekennzeichnet ist, überprüfen Sie mit dem Suchexplorer oder mit Search – POST, ob der Feldinhalt dem Datentyp entspricht.
Verwenden Sie zum Überprüfen der Vektorindexgröße das Azure-Portal oder die REST-API zum Abrufen von Statistiken (GET Statistics).
Hinweis
Der Datentyp des Felds wird verwendet, um die physische Datenstruktur zu erstellen. Wenn Sie später einen Datentyp ändern möchten, legen Sie den Index ab, und erstellen Sie ein zweites Feld mit der neuen Definition.
Option 3: Festlegen der stored
-Eigenschaft zum Entfernen des abrufbaren Speichers
Die stored
-Eigenschaft ist ein boolescher Wert für eine Vektorfelddefinition, der bestimmt, ob Speicher für abrufbare Vektorfeldinhalte zugeordnet wird. Die stored
-Eigenschaft ist standardmäßig „true“. Wenn Sie Vektorinhalte in einer Abfrageantwort nicht benötigen, können Sie bis zu 50 Prozent Speicherplatz pro Feld sparen, indem Sie auf "false" festlegen stored
.
Überlegungen zum Festlegen von stored
auf „false“:
Da Vektoren nicht für Menschen lesbar sind, können Sie sie aus den Ergebnissen, die in RAG-Szenarien an LLMs gesendet werden, und aus den Ergebnissen, die auf einer Suchseite angezeigt werden, weglassen. Behalten Sie sie jedoch bei, wenn Sie Vektoren in nachgelagerten Prozessen verwenden, die Vektorinhalte nutzen.
Wenn Ihre Indizierungsstrategie jedoch teilweise Dokumentaktualisierungen enthält, z. B. „merge“ oder „mergeOrUpload“ in einem Dokument, beachten Sie, dass das Festlegen von
stored
auf „false“ dazu führt, dass Vektoren im nicht gespeicherten Feld während der Zusammenführung ausgelassen werden. Bei jedem „merge“- oder „mergeOrUpload“-Vorgang müssen Sie zusätzlich zu anderen Nichtvektorfeldern, die Sie aktualisieren, die Vektorfelder bereitstellen, da der Vektor andernfalls gelöscht wird.
Denken Sie daran, dass die stored
-Zuordnung nicht rückgängig gemacht werden kann. Sie wird während der Indexerstellung für Vektorfelder festgelegt, wenn physische Datenstrukturen erstellt werden. Wenn Sie später abrufbare Vektorinhalte benötigen, müssen Sie den Index löschen und neu erstellen oder ein neues Feld mit der neuen Zuordnung erstellen und laden.
Das folgende Beispiel zeigt die Fields-Auflistung eines Suchindexes. Legen Sie stored
diesen Wert auf "false" fest, um den abrufbaren Speicher für das Vektorfeld dauerhaft zu entfernen.
PUT https://[service-name].search.windows.net/indexes/demo-index?api-version=2024-07-01
Content-Type: application/json
api-key: [admin key]
{
"name": "demo-index",
"fields": [
{
"name": "vectorContent",
"type": "Collection(Edm.Single)",
"retrievable": false,
"stored": false,
"dimensions": 1536,
"vectorSearchProfile": "vectorProfile"
}
]
}
Die wichtigsten Punkte:
Gilt nur für Vektorfelder.
Wirkt sich auf den Speicher auf dem Datenträger, nicht auf den Arbeitsspeicher aus, und hat keine Auswirkungen auf Abfragen. Die Abfrageausführung verwendet einen separaten Vektorindex, der von der
stored
Eigenschaft nicht betroffen ist.Die
stored
Eigenschaft wird während der Indexerstellung für Vektorfelder festgelegt und ist unumkehrbar. Wenn Sie später abrufbare Inhalte abrufen möchten, müssen Sie den Index ablegen und neu erstellen oder ein neues Feld erstellen und laden, das über die neue Zuordnung verfügt.Standardwerte sind
stored
auf "true" festgelegt undretrievable
auf "false" festgelegt. In einer Standardkonfiguration wird eine abrufbare Kopie gespeichert, aber sie wird nicht automatisch in Ergebnissen zurückgegeben. Wennstored
dies der Fall ist, können Sie jederzeit zwischen "true" und "false" umschaltenretrievable
, ohne einen Index neu erstellen zu müssen. Iststored
"false",retrievable
muss "false" sein und kann nicht geändert werden.
Beispiel: Techniken zur Vektorkomprimierung
Der folgende Python-Code veranschaulicht die Quantisierung, schmale Datentypen und die Verwendung der stored-Eigenschaft: Codebeispiel: Vektorquantisierung und Speicheroptionen mit Python.
Dieser Code erstellt und vergleicht die Speicher- und Vektorindexgröße für jede Option:
****************************************
Index Name: compressiontest-baseline
Storage Size: 21.3613MB
Vector Size: 4.8277MB
****************************************
Index Name: compressiontest-compression
Storage Size: 17.7604MB
Vector Size: 1.2242MB
****************************************
Index Name: compressiontest-narrow
Storage Size: 16.5567MB
Vector Size: 2.4254MB
****************************************
Index Name: compressiontest-no-stored
Storage Size: 10.9224MB
Vector Size: 4.8277MB
****************************************
Index Name: compressiontest-all-options
Storage Size: 4.9192MB
Vector Size: 1.2242MB
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.
Abfragen eines quantisierten Vektorfelds mithilfe von Oversampling
Die Abfragesyntax für ein komprimiertes oder quantisiertes Vektorfeld ist identisch mit der für nicht komprimierte Vektorfelder, es sei denn, Sie möchten Parameter im Zusammenhang mit der Überquotierung oder Neubewertung mit ursprünglichen Vektoren überschreiben.
Beachten Sie, dass die Vektorkomprimierungsdefinition im Index Einstellungen für rerankWithOriginalVectors
und defaultOversampling
enthält, um die Auswirkungen eines kleineren Vektorindex zu verringern. Sie können die Standardwerte überschreiben, um das Verhalten zur Abfragezeit zu ändern. Wenn defaultOversampling
z. B. 10,0 ist, können Sie ihn in eine andere Abfrageanforderung ändern.
Sie können den Oversampling-Parameter auch dann festlegen, wenn der Index nicht explizit über eine rerankWithOriginalVectors
Oder defaultOversampling
Definition verfügt. Wenn Sie oversampling
zur Abfragezeit angeben, werden die Indexeinstellungen für diese Abfrage außer Kraft gesetzt und die Abfrage mit einem effektiven rerankWithOriginalVectors
Wert als "true" ausgeführt.
POST https://[service-name].search.windows.net/indexes/demo-index/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: [admin key]
{
"vectorQueries": [
{
"kind": "vector",
"vector": [8, 2, 3, 4, 3, 5, 2, 1],
"fields": "myvector",
"oversampling": 12.0,
"k": 5
}
]
}
Die wichtigsten Punkte:
Gilt für Vektorfelder, die sich einer Vektorkomprimierung pro Vektorprofilzuweisung unterziehen.
Überschreibt den
defaultOversampling
Wert oder führt die Oversampling zur Abfragezeit ein, auch wenn die Komprimierungskonfiguration des Indexes keine Oversampling- oder Reranking-Optionen angegeben hat.