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. Die Quantisierung wird zum Reduzieren der Vektorgröße empfohlen, da sie den Speicherplatzverbrauch im Arbeitsspeicher und auf dem Datenträger für float16- und float32-Einbettungen verringert. Um die Auswirkungen der verlustbehafteten Komprimierung zu verrechnen, können Sie Überquotierung und Bewertung über unkomprimierte Vektoren 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 mithilfe des Oversampling-Parameters quantisierte Daten abfragen, wenn Sie die Standardeinstellung außer Kraft setzen möchten.

Voraussetzungen

  • Vektorfelder in einem Suchindex mit einer vectorSearch Konfiguration unter Verwendung der Algorithmen „Hierarchical Navigable Small Worlds“ (HNSW) oder „Exhaustive K-Nearest Neighbor“ (eKNN) und eines neuen Vektorprofils.

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

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.

Enthält sowohl scalarQuantization als auch 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 neue Optionen für die Speicheroptimierung sowie Änderungen an der vorhandenen Syntax hinzufügt. Die Abwärtskompatibilität bleibt durch interne API-Zuordnungen erhalten, Sie sollten jedoch die neue Syntax in Code ü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": [ ],
        "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 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 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 der k Abfrage mit einem Oversampling-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 erschöpfende KNN in der REST-API 2024-11-01-Preview verwenden. Verwenden Sie für die stabile Version nur HNSW.

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

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.

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