Freigeben über


Komprimieren von Vektoren mit skalarer oder binärer Quantisierung

Azure KI-Suche unterstützt skalare und binäre Quantisierung, um die Größe von Vektoren in einem Suchindex zu verringern. Quantisierung wird empfohlen, da sowohl Arbeitsspeicher als auch Datenträgerspeicher für float16- und float32-Einbettungen reduziert werden. Um die Auswirkungen der verlustbehafteten Komprimierung zu verrechnen, können Sie Übersampling und Rescoring hinzufügen.

Um die integrierte Quantisierung zu verwenden, gehen Sie wie folgt vor:

  • Beginnen Sie mit Vektorfeldern und einer vectorSearch Konfiguration in einem Index
  • Fügen Sie vectorSearch.compressions hinzu.
  • Fügen Sie eine scalarQuantization- oder binaryQuantization-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 quantisierte Daten mithilfe des Oversampling-Parameters abfragen. Wenn das Vektorfeld in seiner Definition kein Oversampling angibt, können Sie es während der Abfrage hinzufügen.

Voraussetzungen

  • Vektorfelder in einem Suchindex, mit einer Konfiguration, die entweder den Algorithmus "Hierarchical Navigable Small Worlds" (HNSW) oder den erschöpfenden "K-nächste Nachbarn"-Algorithmus (eKNN) sowie ein neues Vektorprofil angibt.

Unterstützte Quantisierungstechniken

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 das Modul eine Quantisierung durch, um den Speicherbedarf der Vektordaten im Arbeitsspeicher und auf dem Datenträger zu verringern.

Zwei Quantisierungstypen werden unterstützt:

  • Die skalare Quantisierung komprimiert Float-Werte in schmalere Datentypen. KI-Suche unterstützt derzeit den Typ „int8“, der 8 Bit belegt und die Größe des Vektorindex vierfach verkleinert.

  • 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.

Hinweis

Während kostenlose Dienste die Quantisierung unterstützen, zeigen sie nicht die vollständigen Speichereinsparungen aufgrund des eingeschränkten Speicherkontingents.

Rescoring ist eine Technik, die verwendet wird, um Informationsverluste aufgrund der Vektorkomprimierung zu verrechnen. Es verwendet Überquotierung, um zusätzliche Vektoren aufzufangen, und ergänzende Informationen, um die anfänglichen Ergebnisse, die von der Abfrage gefunden wurden, neu zu bewerten. Zusätzliche Informationen sind entweder unkomprimierte originale Vollpräzisionsvektoren – oder ausschließlich für die binäre Quantisierung – Sie haben die Möglichkeit, mithilfe der binär quantisierten Dokumentkandidaten eine Neubewertung gegen den Abfragevektor vorzunehmen. Rescoring-Optionen werden im Index angegeben, aber Sie können das Rescoring zur Abfragezeit aktivieren, wenn der Index es unterstützt.

API-Versionen bestimmen, welches Rescoring-Verhalten für Ihren Code wirksam ist. Die neueste Vorschau-API unterstützt einen neuen Korrekturansatz für die binäre Quantisierung. Mit 2025-03-01-preview erstellte Indizes können das Verhalten der Neubewertung nutzen.

API-Version Quantisierungstyp Neubewertungs-Eigenschaften
2024-07-01 Skalare und binäre Quantisierung auf Vektorindizes, die mit hierarchischen Navigable Small World (HNSW)-Graphen für die Ähnlichkeitssuche erstellt wurden. rerankWithOriginalVectors
2024-11-01-preview Skalare und binäre Quantisierung auf HNSW-Diagrammen rescoringOptions.enableRescoring und rescoreStorageMethod.preserveOriginals
2025-03-01-preview Binäre Quantisierung auf HNSW-Diagrammen Frühere Parameterkombinationen werden weiterhin unterstützt, aber die binäre Quantisierung kann jetzt erneut gescoret werden, wenn ursprüngliche Einbettungen gelöscht werden: rescoringOptions.enableRescoring und rescoringOptions.rescoreStorageMethod=discardOriginals

Nur HNSW-Graphen ermöglichen die Neubewertung. Umfassende K Nearest Neighbors (eKNN) unterstützt keine Neubewertung.

Der allgemeine Prozess für die Neupunktevergabe ist:

  1. Die Vektorabfrage wird über komprimierte Vektorfelder ausgeführt.
  2. Die Vektorabfrage gibt die wichtigsten k übersampelten Kandidaten zurück.
  3. Übersampelte k Kandidaten werden neu bewertet, entweder mit den unkomprimierten Originalvektoren oder dem Punktprodukt der binären Quantisierung. 1. Nach der Korrektur werden die Ergebnisse so angepasst, dass zuerst relevantere Übereinstimmungen angezeigt werden.

Fügen Sie „compressions“ zu einem Suchindex hinzu

In diesem Abschnitt wird erläutert, wie Sie einen vectorsSearch.compressions Abschnitt im Index angeben. Das folgende Beispiel zeigt eine partielle Indexdefinition mit einer Feldauflistung, die ein Vektorfeld enthält.

Das Komprimierungsbeispiel enthält beide scalarQuantization oder binaryQuantization. Sie können beliebig viele Komprimierungskonfigurationen angeben und einem Vektorprofil dann die gewünschten Konfigurationen zuweisen.

Die Syntax für vectorSearch.Compressions variiert zwischen stabilen und Vorschau-REST-APIs, wobei die Vorschau zusätzliche Optionen für die Speicheroptimierung sowie Änderungen an der bestehenden Syntax hinzufügt. Die Abwärtskompatibilität wird über interne API-Zuordnungen beibehalten. Es wird jedoch empfohlen, die neueren Eigenschaften im Code zu übernehmen, der auf 2024-11-01-Preview und zukünftige Versionen abzielt.

Verwenden Sie die REST-API Index erstellen oder Index erstellen oder Index aktualisieren, um Komprimierungseinstellungen zu konfigurieren.

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": [ 
      {
          "name": "vector-profile-1",
          "algorithm": "use-hnsw",
          "compression": "use-scalar"
      }
    ],
    "algorithms": [ 
      {
        "name": "use-hnsw",
        "kind": "hnsw",
        "hnswParameters": { },
        "exhaustiveKnnParameters": null
      }
    ],
    "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 auf scalarQuantization oder binaryQuantization festgelegt werden.

  • rerankWithOriginalVectors verwendet die ursprünglichen unkomprimierten Vektoren, um die Ähnlichkeit neu zu berechnen und die Top-Ergebnisse der ursprünglichen Suchanfrage neu zu ordnen. Die nicht komprimierten Vektoren sind im Suchindex vorhanden, auch wenn stored "false" ist. Diese Eigenschaft ist optional. Der Standardwert ist "true".

  • defaultOversampling betrachtet eine breitere Reihe potenzieller Ergebnisse, um die Verringerung der Informationen aus der Quantisierung auszugleichen. Die Formel für potenzielle Ergebnisse besteht aus der k Abfrage mit einem Überquotierungs- Multiplikator. Wenn die Abfrage beispielsweise einen k 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 rerangierten k 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 auf int8 festgelegt werden. Dies ist der einzige primitive Datentyp, der derzeit für die skalare Quantisierung unterstützt wird. Der Standardwert ist int8.

Hinzufügen des Vektorsuchalgorithmus

Sie können den HNSW-Algorithmus oder vollständige KNN in der REST-API 2024-11-01-Preview oder höher verwenden. Verwenden Sie für die stabile Version nur HNSW. Wenn Sie Neubewertung wünschen, müssen Sie HNSW auswählen.

"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.

  1. 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> ] 
    }
    
  2. 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",
    }
    
  3. Laden Sie den Index mithilfe von Indexern für die Pullmodellindizierung oder APIs für die Pushmodellindizierung.

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 dem Runden einer reellen Zahl auf die nächste ganze Zahl ähnelt. 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.

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 Methode 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.

Abfragen eines quantisierten Vektorfelds mithilfe von Oversampling

Die Abfragesyntax für ein komprimiertes oder quantisiertes Vektorfeld ist identisch mit nicht komprimierten Vektorfeldern, es sei denn, Sie möchten Parameter außer Kraft setzen, die mit Übersampling und Rescoring verknüpft sind. Sie können einen o-Parameterversampling hinzufügen, um Oversampling und Rescoring während der Abfrage auszuführen.

Beachten Sie, dass die Vektorkomprimierungsdefinition im Index Einstellungen für rerankWithOriginalVectors und defaultOversampling enthält, um die Auswirkungen von verlustbehafteter Komprimierung 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

{    
    "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 gemäß der Vektorprofilzuweisung komprimiert werden.

  • Überschreibt den defaultOversampling-Wert oder führt ein Oversampling bei der Abfrage ein, auch wenn die Komprimierungskonfiguration des Indexes weder Oversampling- noch Reranking-Optionen angegeben hat.