Sdílet prostřednictvím


Komprese vektorů pomocí skalárního nebo binárního kvantování

Azure AI Search podporuje skalární a binární kvantování pro zmenšení velikosti vektorů v indexu vyhledávání. Kvantování se doporučuje pro zmenšení velikosti vektoru, protože snižuje spotřebu paměti i úložiště disku pro vkládání float16 a float32. Chcete-li odsadit efekty ztráty komprese, můžete přidat převzorkování a pře bodování nad nekomprimovanými vektory.

Pokud chcete použít předdefinované kvantování, postupujte takto:

  • Začínáme s vektorovými poli a vectorSearch konfigurací indexu
  • Přidat vectorSearch.compressions
  • scalarQuantization Přidání nebo binaryQuantization konfigurace a jeho pojmenování
  • Nastavení volitelných vlastností pro zmírnění dopadů indexování ztráty
  • Vytvoření nového vektorového profilu, který používá pojmenovanou konfiguraci
  • Vytvoření nového vektorového pole s novým vektorovým profilem
  • Načtení indexu s daty float32 nebo float16, která jsou během indexování kvantována pomocí konfigurace, kterou jste definovali
  • Volitelně můžete dotazovat kvantovaná data pomocí parametru převzorkování, pokud chcete přepsat výchozí hodnotu.

Požadavky

  • Vektorová pole v indexu vyhledávání s vectorSearch konfigurací, pomocí hierarchických pohyblivých malých světů (HNSW) nebo vyčerpávajících algoritmů nejbližšího souseda (eKNN) a nového vektorového profilu.

Podporované techniky kvantování

Kvantování se vztahuje na vektorová pole, která přijímají vektory typu float. V příkladech v tomto článku se datový typ pole používá Collection(Edm.Single) pro příchozí vkládání float32, ale podporuje se také float16. Při přijetí vektorů v poli s nakonfigurovanou kompresí modul automaticky provede kvantování, aby snížil nároky vektorových dat v paměti a na disku.

Podporují se dva typy kvantování:

  • Skalární kvantování komprimuje hodnoty float do užších datových typů. AI Search v současné době podporuje int8, což je 8 bitů, což snižuje velikost vektorového indexu čtyřikrát.

  • Binární kvantování převádí plovoucí hodnoty na binární bity, které zabíjí 1 bit. Výsledkem je až 28krát menší velikost indexu vektoru.

Přidání "komprese" do indexu vyhledávání

Následující příklad ukazuje částečnou definici indexu s kolekcí polí, která obsahuje vektorové pole a vectorSearch.compressions oddíl.

Zahrnuje obojí scalarQuantization nebo binaryQuantization. Můžete zadat tolik konfigurací komprese, kolik potřebujete, a pak přiřadit ty, které chcete k vektorovém profilu.

Syntaxe pro vectorSearch.Compressions stabilní rozhraní REST API a rozhraní REST API ve verzi Preview se liší přidáním nových možností pro optimalizaci úložiště a změnami stávající syntaxe. Zpětná kompatibilita se zachovává prostřednictvím interních mapování rozhraní API, ale v kódu, který cílí na verzi 2024-11-01-Preview a budoucí verze, byste měli použít novou syntaxi.

Ke konfiguraci nastavení komprese použijte rozhraní REST API pro vytvoření nebo vytvoření nebo aktualizaci indexu.

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
          }
        ]
    }
}

Klíčové body:

  • kind musí být nastavena na scalarQuantization hodnotu nebo binaryQuantization.

  • rerankWithOriginalVectors používá původní nekomprimované vektory k přepočtu podobnosti a přehodnotí nejlepší výsledky vrácené počátečním vyhledávacím dotazem. Nekomprimované vektory existují v indexu vyhledávání, i když stored jsou false. Tato vlastnost je nepovinná. Výchozí hodnota je true.

  • defaultOversampling považuje širší sadu potenciálních výsledků k posunu snížení informací od kvantování. Vzorec pro potenciální výsledky se skládá z k dotazu s násobitelem převzorkování. Pokud například dotaz určuje k 5 a převzorkování je 20, dotaz efektivně požaduje 100 dokumentů pro použití při opětovném řazení pomocí původního nekomprimovaného vektoru pro tento účel. Vrátí se pouze nejlépe k seřazené výsledky. Tato vlastnost je nepovinná. Výchozí hodnota je 4.

  • quantizedDataType je nepovinný a vztahuje se pouze na skalární kvantování. Pokud ho přidáte, musí být nastavena na int8hodnotu . Toto je jediný primitivní datový typ podporovaný pro skalární kvantování v tuto chvíli. Výchozí hodnota je int8.

Přidání algoritmu vektorového vyhledávání

V rozhraní REST API verze 2024-11-01-preview můžete použít algoritmus HNSW nebo vyčerpávající síť KNN. Pro stabilní verzi použijte pouze HNSW.

"vectorSearch": {
    "profiles": [ ],
    "algorithms": [
      {
          "name": "use-hnsw",
          "kind": "hnsw",
          "hnswParameters": {
              "m": 4,
              "efConstruction": 400,
              "efSearch": 500,
              "metric": "cosine"
          }
      }
    ],
     "compressions": [ <see previous section>] 
}

Vytvoření a přiřazení nového vektorového profilu

Pokud chcete použít novou konfiguraci kvantování, musíte vytvořit nový vektorový profil. Vytvoření nového vektorového profilu je nezbytné pro vytváření komprimovaných indexů v paměti. Váš nový profil používá HNSW.

  1. Ve stejné definici indexu vytvořte nový vektorový profil a přidejte vlastnost komprese a algoritmus. Tady jsou dva profily, jeden pro každý přístup kvantování.

    "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. Přiřaďte vektorový profil novému vektorovém poli. Datový typ pole je buď float32, nebo float16.

    Ve službě Azure AI Search jsou Collection(Edm.Single) ekvivalenty modelu Entity Data Model (EDM) typu float32 a float16 a Collection(Edm.Half)v uvedeném pořadí.

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. Načtěte index pomocí indexerů pro indexování modelů vyžádané replikace nebo rozhraní API pro indexování nabízených modelů.

Skalární kvantování snižuje rozlišení každého čísla v rámci vkládání vektorů. Místo popisu každého čísla jako 16bitového nebo 32bitového čísla s plovoucí desetinou čárkou se používá 8bitové celé číslo. Identifikuje rozsah čísel (obvykle 99. percentil minimum a maximum) a rozdělí je na konečný počet úrovní nebo intervalů, přičemž každému intervalu přiřadí identifikátor. V 8bitové skalární kvantování existuje 2^8 nebo 256 možných intervalů.

Každá komponenta vektoru se mapuje na nejbližší reprezentativní hodnotu v rámci této sady úrovní kvantování v procesu, který je podobný zaokrouhlení reálného čísla na nejbližší celé číslo. V kvantizovaném 8bitovém vektoru představuje číslo identifikátoru místo původní hodnoty. Po kvantování je každý vektor reprezentován polem identifikátorů pro intervaly, do kterých jeho součásti patří. Tyto kvantované vektory vyžadují k uložení v porovnání s původním vektorem mnohem méně bitů, což snižuje požadavky na úložiště a nároky na paměť.

Binární kvantování komprimuje vysoce dimenzionální vektory tím, že jednotlivé komponenty představují jako jeden bit, a to buď 0, nebo 1. Tato metoda výrazně snižuje nároky na paměť a zrychluje operace porovnání vektorů, které jsou zásadní pro úlohy vyhledávání a načítání. Testy srovnávacích testů ukazují až 96% snížení velikosti vektoru indexu.

Je zvlášť efektivní pro vkládání s rozměry většími než 1024. Pro menší dimenze doporučujeme otestovat kvalitu binární kvantování nebo místo toho vyzkoušet skalár. Kromě toho jsme zjistili, že BQ funguje velmi dobře, když se vkládání vkládají kolem nuly. Nejoblíbenější modely vkládání, jako jsou OpenAI, Cohere a Mistral, jsou zarovnané kolem nuly.

Dotazování na kvantované vektorové pole pomocí převzorkování

Syntaxe dotazu pro komprimované nebo kvantované vektorové pole je stejná jako u nekomprimovaných vektorových polí, pokud nechcete přepsat parametry přidružené k převzorkování nebo přehodnocení s původními vektory.

Vzpomeňte si, že definice komprese vektorů v indexu má nastavení a rerankWithOriginalVectors defaultOversampling zmírnit účinky ztráty komprese. Výchozí hodnoty můžete přepsat tak, aby se chování v době dotazu lišily. Pokud je například defaultOversampling 10,0, můžete ho změnit na něco jiného v požadavku dotazu.

Parametr převzorkování můžete nastavit i v případě, že index explicitně rerankWithOriginalVectors neobsahuje ani defaultOversampling definici. Poskytnutí oversampling v době dotazu přepíše nastavení indexu pro tento dotaz a spustí dotaz s efektivním rerankWithOriginalVectors jako true.

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   
        }
  ]    
}

Klíčové body:

  • Platí pro vektorová pole, která procházejí kompresi vektorů podle přiřazení profilu vektoru.

  • defaultOversampling Přepíše hodnotu nebo zavádí převzorkování v době dotazu, i když konfigurace komprese indexu nezadá převzorkování nebo možnosti přehodnocení.