Sdílet prostřednictvím


Zmenšení velikosti vektoru prostřednictvím kvantování, úzkých datových typů a možností úložiště

Tento článek vysvětluje, jak používat vektorové kvantování a další techniky pro zmenšení velikosti vektoru ve službě Azure AI Search. Index vyhledávání určuje definice vektorových polí, včetně vlastností uložených a úzkých datových typů. Kvantování je také určeno v indexu a přiřazeno k vektorové pole prostřednictvím jeho vektorového profilu.

Tyto funkce jsou obecně dostupné v rozhraní REST API 2024-07-01 a v balíčcích sady Azure SDK, které cílí na danou verzi. Příklad na konci tohoto článku ukazuje varianty velikosti vektoru pro každý přístup popsaný v tomto článku.

Vyhodnocení možností

V prvním kroku si projděte tři přístupy ke snížení množství úložiště používaného vektorovými poli. Tyto přístupy se vzájemně nevylučují a lze je kombinovat pro maximální zmenšení velikosti vektoru.

Doporučujeme předdefinované kvantování, protože komprimuje velikost vektoru v paměti a na disku s minimálním úsilím a ve většině scénářů poskytuje největší výhodu. Naproti tomu úzké typy (s výjimkou float16) vyžadují zvláštní úsilí při jejich vytváření a stored šetří diskové úložiště, což není tak nákladné jako paměť.

Přístup Proč tuto možnost použít
Přidání skalární nebo binární kvantování Pomocí kvantování můžete komprimovat nativní float32 nebo float16 vkládání na int8 (skalární) nebo bajt (binární). Tato možnost snižuje úložiště v paměti a na disku bez snížení výkonu dotazů. Menší datové typy, jako jsou int8 nebo Bajt, vytvářejí vektorové indexy, které jsou méně bohaté na obsah než ty, které mají větší vkládání. K posunu ztráty informací obsahuje integrovaná komprese možnosti následného zpracování dotazů pomocí nekomprimovaných vkládání a převzorkování pro vrácení relevantnějších výsledků. Přehodnocení a převzorkování jsou specifické funkce předdefinované kvantování polí float32 nebo float16 a nelze je použít při vkládání, které procházejí vlastní kvantizací.
Přiřazení menších primitivních datových typů k vektorům polím Úzké datové typy, jako je float16, int16, int8 a Byte (binární), spotřebovávají méně místa v paměti a na disku, ale musíte mít model pro vložení, který vypíše vektory v úzkém datovém formátu. Nebo musíte mít vlastní logiku kvantování, která vypíše malá data. Třetí případ použití, který vyžaduje menší úsilí, spočívá v přesílání nativních vkládání float32 vytvořených většinou modelů na float16. Podrobnosti o binárních vektorech binárních vektorů naleznete v tématu Index binární vektory.
Eliminujte volitelné ukládání vektorů, které lze načíst. Vektory vrácené v odpovědi dotazu se ukládají odděleně od vektorů používaných během provádění dotazu. Pokud nepotřebujete vracet vektory, můžete vypnout úložiště s možností načítání a snížit celkové úložiště disku na pole o až 50 procent.

Všechny tyto možnosti jsou definovány na prázdném indexu. K implementaci některé z nich použijte Azure Portal, rozhraní REST API nebo balíček sady Azure SDK, který cílí na tuto verzi rozhraní API.

Po definování indexu můžete dokumenty načíst a indexovat jako samostatný krok.

Možnost 1: Konfigurace kvantování

Kvantování se doporučuje pro zmenšení velikosti vektoru, protože snižuje požadavky na paměť i diskové úložiště pro vkládání float16 a float32. Pokud chcete zmenšit efekty menšího indexu, můžete přidat převzorkování a přeřadit před nekomprimované vektory.

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.

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

  • Použití vytvoření indexu nebo vytvoření nebo aktualizace indexu k určení komprese vektorů
  • Přidání vectorSearch.compressions do indexu vyhledávání
  • 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.

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.

Tento příklad 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.

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 },
  ],
  "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:

  • kindmusí být nastavena na scalarQuantizationbinaryQuantization

  • rerankWithOriginalVectors používá původní nekomprimované vektory k přepočtu podobnosti a opětovnému seřazení nejlepších výsledků vrácených 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 HNSW

Ujistěte se, že váš index obsahuje algoritmus Hierarchical Navigable Small Worlds (HNSW). Předdefinované kvantování není podporováno vyčerpávajícím KNN.

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

Možnost 2: Přiřazení úzkých datových typů k vektorům polím

Snadný způsob, jak zmenšit velikost vektoru, je uložit vkládání v menším formátu dat. Většina vložených modelů výstupuje 32bitová čísla s plovoucí desetinou čárkou, ale pokud kvantujete vektory nebo pokud je model vkládání podporuje nativně, výstup může být float16, int16 nebo int8, což je výrazně menší než float32. Tyto menší velikosti vektorů můžete přizpůsobit přiřazením úzkého datového typu k vektorovým polím. V indexu vektoru spotřebovávají úzké datové typy méně úložiště.

  1. Projděte si datové typy používané pro vektorová pole pro doporučené použití:

    • Collection(Edm.Single) 32bitová plovoucí čárka (výchozí)
    • Collection(Edm.Half) 16bitová plovoucí čárka (úzká)
    • Collection(Edm.Int16) 16bitové celé číslo se signedm (úzké)
    • Collection(Edm.SByte) 8bitové celé číslo se signy (úzké)
    • Collection(Edm.Byte) 8bitové celé číslo bez znaménka (povoleno pouze s zabalenými binárními datovými typy)
  2. V seznamu určete, který datový typ je platný pro výstup vloženého modelu, nebo pro vektory, které procházejí vlastní kvantizací.

    Následující tabulka obsahuje odkazy na několik vložených modelů, které můžou používat úzký datový typ (Collection(Edm.Half)) bez dodatečného kvantování. Můžete přetypovat z float32 na float16 (pomocí Collection(Edm.Half)) bez další práce.

    Vložený model Nativní výstup Přiřazení tohoto typu ve službě Azure AI Search
    text-embedding-ada-002 Float32 Collection(Edm.Single) nebo Collection(Edm.Half)
    text-embedding-3-small Float32 Collection(Edm.Single) nebo Collection(Edm.Half)
    text-embedding-3-large Float32 Collection(Edm.Single) nebo Collection(Edm.Half)
    Vkládání modelů Cohere V3 s využitím embedding_type int8 Int8 Collection(Edm.SByte)

    Jiné úzké datové typy lze použít, pokud váš model generuje vkládání v menším datovém formátu nebo pokud máte vlastní kvantování, které převádí vektory do menšího formátu.

  3. Ujistěte se, že rozumíte kompromisům úzkého datového typu. Collection(Edm.Half) obsahuje méně informací, což vede k nižšímu rozlišení. Pokud jsou vaše data homogenní nebo hustá, může ztráta nadbytečných podrobností nebo nuance vést k nepřijatelným výsledkům v době dotazu, protože existuje méně podrobností, které lze použít k rozlišení okolních vektorů od sebe.

  4. Definujte a sestavte index. Pro účely tohoto kroku můžete použít Azure Portal, vytvořit nebo aktualizovat index (REST API) nebo balíček sady Azure SDK.

  5. Zkontrolujte výsledky. Za předpokladu, že je vektorové pole označené jako načítané, použijte Průzkumník služby Search nebo Search – POST k ověření, že obsah pole odpovídá datovému typu.

    Pokud chcete zkontrolovat velikost vektorového indexu, použijte web Azure Portal nebo rozhraní REST API (GET Statistics).

Poznámka:

Datový typ pole slouží k vytvoření fyzické datové struktury. Pokud chcete datový typ později změnit, buď odstraňte a znovu sestavte index, nebo vytvořte druhé pole s novou definicí.

Možnost 3: Nastavení stored vlastnosti pro odebrání úložiště s možností načítání

Vlastnost stored je logická hodnota pro definici vektorového pole, která určuje, zda je úložiště přiděleno pro obsah načístelné vektorové pole. Vlastnost stored je ve výchozím nastavení true. Pokud v odpovědi dotazu nepotřebujete vektorový obsah, můžete ušetřit až 50 % úložiště na pole nastavením stored na false.

Důležité informace o nastavení stored na false:

  • Vzhledem k tomu, že vektory nejsou čitelné člověkem, můžete je vynechat z výsledků odeslaných do LLM ve scénářích RAG a z výsledků, které se vykreslují na vyhledávací stránce. Pokud ale v podřízeného procesu používáte vektory, které využívají obsah vektorů, je uchovávejte.

  • Pokud ale strategie indexování zahrnuje částečné aktualizace dokumentů, jako je například sloučení nebo mergeOrUpload v dokumentu, mějte na paměti, že nastavení stored na hodnotu false způsobí, že při sloučení se v neuložených polích vynechá vektory. Při každé operaci "merge" nebo "mergeOrUpload" musíte kromě jiných polí, která neaktualizujete, zadat vektorová pole nebo se vektor zahodí.

Mějte na stored paměti, že přisuzování je nevratné. Při vytváření vektorových polí se nastavuje během vytváření indexu u vektorových polí při vytváření fyzických datových struktur. Pokud chcete později načíst obsah vektoru, musíte index vypustit a znovu sestavit nebo vytvořit a načíst nové pole s novým přiřazením.

Následující příklad ukazuje kolekci polí indexu vyhledávání. Pokud chcete trvale odebrat úložiště pro vektorové pole, nastavte stored na hodnotu false.

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

Klíčové body:

  • Platí pouze pro vektorová pole .

  • Ovlivňuje úložiště na disku, ne paměť a nemá žádný vliv na dotazy. Provádění dotazu používá samostatný vektorový index, který nemá vliv na stored vlastnost.

  • Vlastnost je nastavena během vytváření indexu stored u vektorových polí a je nevratná. Pokud chcete později načíst obsah, musíte index vypustit a znovu sestavit nebo vytvořit a načíst nové pole s novým přiřazením.

  • Výchozí hodnoty jsou stored nastaveny na hodnotu true a retrievable jsou nastaveny na hodnotu false. Ve výchozí konfiguraci se uloží načístelná kopie, ale ve výsledcích se automaticky nevrátí. Pokud stored je hodnota true, můžete kdykoli přepínat retrievable mezi true a false, aniž byste museli znovu sestavit index. Pokud stored je false, retrievable musí být false a nelze ho změnit.

Příklad: techniky komprese vektorů

Tady je kód Pythonu, který ukazuje kvantování, úzké datové typy a použití uložené vlastnosti: Ukázka kódu: Vektorová kvantizace a možnosti úložiště pomocí Pythonu.

Tento kód vytvoří a porovná velikost indexu úložiště a vektoru pro každou možnost:

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

Rozhraní API pro vyhledávání hlásí úložiště a velikost vektoru na úrovni indexu, takže indexy a nikoli pole musí být základem porovnání. K získání velikosti vektoru použijte statistiku indexu GET nebo ekvivalentní rozhraní API v sadách Azure SDK.

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řeřaďte původní vektory.

Vzpomeňte si, že definice komprese vektorů v indexu má nastavení a rerankWithOriginalVectors defaultOversampling zmírnění účinků menšího indexu vektoru. 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   
  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   
            }
      ]    
    }

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

Viz také