Udostępnij za pośrednictwem


Kompresuj wektory przy użyciu kwantyzacji skalarnych lub binarnych

Usługa Azure AI Search obsługuje kwantyzację skalarną i binarną w celu zmniejszenia rozmiaru wektorów w indeksie wyszukiwania. Kwantyzacja jest zalecana do zmniejszenia rozmiaru wektora, ponieważ zmniejsza zużycie pamięci i miejsca do magazynowania na dysku w przypadku osadzania float16 i float32. Aby zrównoważyć skutki kompresji straty, można dodać przespróbki i rescoring nad nieskompresowanych wektorów.

Aby użyć wbudowanej kwantyzacji, wykonaj następujące kroki:

  • Rozpoczynanie od pól wektorów i vectorSearch konfiguracji indeksu
  • Dodaj vectorSearch.compressions
  • Dodaj konfigurację scalarQuantization lub binaryQuantization i nadaj jej nazwę
  • Ustawianie opcjonalnych właściwości w celu ograniczenia skutków indeksowania strat
  • Tworzenie nowego profilu wektora korzystającego z nazwanej konfiguracji
  • Tworzenie nowego pola wektora o nowym profilu wektora
  • Załaduj indeks przy użyciu danych float32 lub float16, które są kwantyzowane podczas indeksowania przy użyciu zdefiniowanej konfiguracji
  • Opcjonalnie wykonaj zapytanie dotyczące ilościowych danych przy użyciu parametru oversampling, jeśli chcesz zastąpić wartość domyślną

Wymagania wstępne

  • Pola wektorów w indeksie wyszukiwania z konfiguracją vectorSearch przy użyciu hierarchicznych małych światów (HNSW) lub wyczerpujących algorytmów k najbliższych sąsiadów (eKNN) i nowego profilu wektora.

Obsługiwane techniki kwantyzacji

Kwantyzacja ma zastosowanie do pól wektorów odbierających wektory typu zmiennoprzecinkowego. W przykładach w tym artykule typ danych pola dotyczy Collection(Edm.Single) osadzeń przychodzących float32, ale jest również obsługiwany zmiennoprzecinkowy16. Gdy wektory są odbierane na polu ze skonfigurowaną kompresją, aparat automatycznie wykonuje kwantyzację, aby zmniejszyć ślad danych wektorowych w pamięci i na dysku.

Obsługiwane są dwa typy kwantyzacji:

  • Kwantyzacja skalarna kompresuje wartości zmiennoprzecinkowe do węższych typów danych. Wyszukiwanie sztucznej inteligencji obsługuje obecnie int8, czyli 8 bitów, zmniejszając rozmiar indeksu wektorowego cztery razy.

  • Kwantyzacja binarna konwertuje zmiennoprzecinkowe na bity binarne, co zajmuje 1 bit. Powoduje to maksymalnie 28-krotny zmniejszenie rozmiaru indeksu wektorowego.

Dodawanie "kompresji" do indeksu wyszukiwania

W poniższym przykładzie przedstawiono częściową definicję indeksu z kolekcją pól zawierającą pole wektora i sekcję vectorSearch.compressions .

Zawiera on zarówno elementy , jak i scalarQuantization binaryQuantization. Możesz określić dowolną liczbę konfiguracji kompresji, a następnie przypisać te, które chcesz mieć profil wektorowy.

Składnia dla vectorSearch.Compressions różnych stabilnych i w wersji zapoznawczej interfejsów API REST, a wersja zapoznawcza dodaje nowe opcje optymalizacji magazynu oraz zmiany w istniejącej składni. Zgodność z poprzednimi wersjami jest zachowywana za pomocą wewnętrznych mapowań interfejsu API, ale należy przyjąć nową składnię w kodzie, który jest przeznaczony dla wersji 2024-11-01-preview i przyszłych wersji.

Konfigurowanie ustawień kompresji za pomocą interfejsu API REST tworzenia indeksu lub tworzenia lub aktualizowania indeksu.

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

Kluczowe punkty:

  • kind musi być ustawiona na scalarQuantization lub binaryQuantization.

  • rerankWithOriginalVectors Używa oryginalnych nieskompresowanych wektorów, aby ponownie obliczyć podobieństwo i ponownie odręcić najlepsze wyniki zwrócone przez początkowe zapytanie wyszukiwania. Nieskompresowane wektory istnieją w indeksie wyszukiwania, nawet jeśli stored jest to fałsz. Ta właściwość jest opcjonalna. Ustawieniem domyślnym jest true.

  • defaultOversampling rozważa szerszy zestaw potencjalnych wyników, aby zrównoważyć zmniejszenie ilości informacji z kwantyzacji. Formuła potencjalnych wyników składa się z k elementu w zapytaniu z mnożnikiem oversampling. Jeśli na przykład zapytanie określa k wartość 5, a przeampling wynosi 20, zapytanie skutecznie żąda 100 dokumentów do użycia w ponownym korbowaniu przy użyciu oryginalnego nieskompresowanego wektora w tym celu. Zwracane są tylko wyniki o najwyższej k klasyfikacji. Ta właściwość jest opcjonalna. Wartość domyślna to 4.

  • quantizedDataType jest opcjonalny i ma zastosowanie tylko do kwantyzacji skalarnych. Jeśli ją dodasz, musi być ustawiona na int8wartość . Jest to obecnie jedyny pierwotny typ danych obsługiwany dla kwantyzacji skalarnych. Wartość domyślna to int8.

Dodawanie algorytmu wyszukiwania wektorów

Możesz użyć algorytmu HNSW lub wyczerpującej nazwy KNN w interfejsie API REST 2024-11-01-preview. W przypadku stabilnej wersji użyj tylko HNSW.

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

Tworzenie i przypisywanie nowego profilu wektora

Aby użyć nowej konfiguracji kwantyzacji, należy utworzyć nowy profil wektora. Utworzenie nowego profilu wektorowego jest niezbędne do tworzenia skompresowanych indeksów w pamięci. Nowy profil używa HNSW.

  1. W tej samej definicji indeksu utwórz nowy profil wektora i dodaj właściwość kompresji i algorytm. Poniżej przedstawiono dwa profile— jeden dla każdego podejścia kwantyzacji.

    "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. Przypisz profil wektora do nowego pola wektora. Typ danych pola to float32 lub float16.

    W usłudze Azure AI Search odpowiedniki modelu danych jednostek (EDM) typów float32 i float16 są Collection(Edm.Single) odpowiednio i Collection(Edm.Half).

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. Załaduj indeks przy użyciu indeksatorów do indeksowania modelu ściągania lub interfejsów API na potrzeby indeksowania modelu wypychania.

Kwantyzacja skalarna zmniejsza rozdzielczość każdej liczby w ramach każdego osadzania wektorów. Zamiast opisywać każdą liczbę jako 16-bitową lub 32-bitową liczbę zmiennoprzecinkową, używa 8-bitowej liczby całkowitej. Identyfikuje ona zakres liczb (zazwyczaj 99. percentyl minimum i maksimum) i dzieli je na skończona liczbę poziomów lub pojemników, przypisując każdy pojemnik identyfikator. W 8-bitowej kwantyzacji skalarnej istnieje 2^8 lub 256 możliwych pojemników.

Każdy składnik wektora jest mapowany na najbliższą wartość reprezentatywną w tym zestawie poziomów kwantyzacji w procesie zbliżonym do zaokrąglania liczby rzeczywistej do najbliższej liczby całkowitej. W wektorze kwantyzowanym 8-bitowym numer identyfikatora znajduje się zamiast oryginalnej wartości. Po kwantyzacji każdy wektor jest reprezentowany przez tablicę identyfikatorów dla pojemników, do których należą jego składniki. Te kwantyzowane wektory wymagają znacznie mniejszej ilości bitów do przechowywania w porównaniu z oryginalnym wektorem, co zmniejsza zapotrzebowanie na magazyn i zużycie pamięci.

Kwantyzacja binarna kompresuje wektory wielowymiarowe, reprezentując każdy składnik jako pojedynczy bit ( 0 lub 1). Ta metoda znacząco zmniejsza zużycie pamięci i przyspiesza operacje porównania wektorów, które mają kluczowe znaczenie dla zadań wyszukiwania i pobierania. Testy porównawcze pokazują do 96% zmniejszenie rozmiaru indeksu wektorowego.

Jest szczególnie skuteczny w przypadku osadzania z wymiarami większymi niż 1024. W przypadku mniejszych wymiarów zalecamy przetestowanie jakości kwantyzacji binarnej lub wypróbowanie skalarnej. Ponadto okazało się, że funkcja BQ działa bardzo dobrze, gdy osadzanie jest wyśrodkowane wokół zera. Najbardziej popularne modele osadzania, takie jak OpenAI, Cohere i Mistral, są wyśrodkowane wokół zera.

Wykonywanie zapytań względem kwantyzowanego pola wektora przy użyciu oversampling

Składnia kwerendy dla pola skompresowanego lub kwantyzowanego wektora jest taka sama jak w przypadku nieskompresowanych pól wektorów, chyba że chcesz zastąpić parametry skojarzone z przespróbowaniem lub ponownymcorowaniem z oryginalnymi wektorami.

Pamiętaj, że definicja kompresji wektorów w indeksie ma ustawienia rerankWithOriginalVectors i defaultOversampling w celu ograniczenia skutków kompresji strat. Wartości domyślne można zastąpić, aby zmieniać zachowanie w czasie wykonywania zapytania. Na przykład jeśli defaultOversampling wartość to 10.0, możesz zmienić ją na inną w żądaniu zapytania.

Można ustawić parametr oversampling, nawet jeśli indeks nie ma rerankWithOriginalVectors jawnie definicji lub defaultOversampling . Podanie oversampling w czasie zapytania zastępuje ustawienia indeksu dla tego zapytania i wykonuje zapytanie z obowiązującą rerankWithOriginalVectors wartością 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   
        }
  ]    
}

Kluczowe punkty:

  • Dotyczy pól wektorów, które przechodzą kompresję wektorów, na przypisanie profilu wektorowego.

  • defaultOversampling Zastępuje wartość lub wprowadza przeampling w czasie zapytania, nawet jeśli konfiguracja kompresji indeksu nie określiła opcji przeampowania ani ponownego korbowania.