Udostępnij za pośrednictwem


Zmniejsz rozmiar wektora dzięki kwantyzacji, wąskim typom danych i opcjom magazynowania

W tym artykule wyjaśniono, jak używać kwantyzacji wektorów i innych technik zmniejszania rozmiaru wektora w usłudze Azure AI Search. Indeks wyszukiwania określa definicje pól wektorów, w tym właściwości używane do określania wąskich typów danych lub kontroli, czy kopia zawartości wektorowej jest zachowywana dla wyników wyszukiwania. Kwantyzacja jest również określona w indeksie i przypisana do pola wektorowego za pośrednictwem jego profilu wektorowego.

Większość funkcji opisanych w tym artykule jest ogólnie dostępna w interfejsie API REST 2024-07-01 i w pakietach zestawu Azure SDK przeznaczonych dla tej wersji. Najnowsza wersja zapoznawcza dodaje obsługę obcinanych wymiarów, jeśli używasz funkcji osadzania tekstu w formacie 3-large lub text-embedding-3-small na potrzeby wektoryzacji.

Przykład na końcu tego artykułu przedstawia różnice w rozmiarze wektora dla każdego podejścia opisanego w tym artykule.

Ocena opcji

W pierwszym kroku przejrzyj trzy podejścia do zmniejszenia ilości miejsca do magazynowania używanego przez pola wektorowe. Te podejścia nie wykluczają się wzajemnie i można je połączyć w celu maksymalnego zmniejszenia rozmiaru wektora.

Zalecamy wbudowane kwantyzację, ponieważ kompresuje rozmiar wektora w pamięci i na dysku przy minimalnym wysiłku i ma tendencję do zapewnienia największej korzyści w większości scenariuszy. Natomiast wąskie typy (z wyjątkiem float16) wymagają specjalnego nakładu pracy w ich tworzeniu i stored zapisywania w magazynie dyskowym, który nie jest tak kosztowny, jak pamięć.

Metoda Dlaczego warto używać tej opcji
Dodawanie kwantyzacji skalarnych lub binarnych Użyj kwantyzacji, aby skompresować natywne float32 lub float16 osadzania do int8 (skalarnych) lub bajtów (binarnych). Ta opcja zmniejsza ilość miejsca w pamięci i na dysku bez obniżenia wydajności zapytań. Mniejsze typy danych, takie jak int8 lub Byte, generują indeksy wektorów, które są mniej bogate w zawartość niż te z większymi osadzaniami. Aby zrównoważyć utratę informacji, wbudowana kompresja obejmuje opcje przetwarzania po zapytaniu przy użyciu nieskompresowanych osadzeń i oversampling w celu zwrócenia bardziej odpowiednich wyników. Refranking i oversampling to specyficzne cechy wbudowanego kwantyzacji float32 lub float16 pól i nie można ich używać na osadzaniu, które przechodzą niestandardowe kwantyzacje.
Obcinanie wymiarów dla modeli osadzania tekstu z obsługą języka MRL—3 (wersja zapoznawcza) Przećwiczyć opcję używania mniejszej liczby wymiarów w modelach osadzania tekstu-3. W usłudze Azure OpenAI te modele zostały ponownie przeszkolone w technice uczenia reprezentacji matryoshka (MRL), która tworzy wiele reprezentacji wektorów na różnych poziomach kompresji. Takie podejście pozwala szybciej wyszukiwać i zmniejszać koszty magazynowania przy minimalnej utracie informacji semantycznych. W usłudze Azure AI Search język MRL obsługuje uzupełnienie kwantyzacji skalarnej i binarnej. W przypadku użycia jednej z metod kwantyzacji można również określić truncateDimension właściwość w polach wektorów, aby zmniejszyć wymiarowość osadzania tekstu.
Przypisywanie mniejszych typów danych pierwotnych do pól wektorów Wąskie typy danych, takie jak float16, int16, int8 i Byte (binarne) zużywają mniej miejsca w pamięci i na dysku, ale musisz mieć model osadzania, który generuje wektory w wąskim formacie danych. Możesz też mieć niestandardową logikę kwantyzacji, która generuje małe dane. Trzeci przypadek użycia, który wymaga mniejszego nakładu pracy, to ponowne odemisji natywnych osadzania float32 generowanych przez większość modeli do float16. Zobacz Indeksowanie wektorów binarnych , aby uzyskać szczegółowe informacje o wektorach binarnych.
Eliminowanie opcjonalnego przechowywania wektorów do pobrania Wektory zwracane w odpowiedzi zapytania są przechowywane oddzielnie od wektorów używanych podczas wykonywania zapytania. Jeśli nie musisz zwracać wektorów, możesz wyłączyć magazyn, który można pobrać, zmniejszając ogólny magazyn dyskowy na pole o maksymalnie 50 procent.

Wszystkie te opcje są definiowane w pustym indeksie. Aby zaimplementować dowolne z nich, użyj witryny Azure Portal, interfejsów API REST lub pakietu zestawu Azure SDK przeznaczonego dla tej wersji interfejsu API.

Po zdefiniowaniu indeksu można załadować i indeksować dokumenty jako oddzielny krok.

Opcja 1. Konfigurowanie kwantyzacji

Kwantyzacja jest zalecana w celu zmniejszenia rozmiaru wektora, ponieważ zmniejsza wymagania dotyczące pamięci i magazynu dyskowego dla osadzania float16 i float32. Aby zrównoważyć efekty mniejszego indeksu, można dodać przeładowanie i ponowne korbowanie nad nieskompresowanych wektorów.

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.

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

  • Użyj polecenia Create Index (Tworzenie indeksu ) lub Create Or Update Index (Tworzenie lub aktualizowanie indeksu ) w celu określenia kompresji wektorów
  • Dodawanie vectorSearch.compressions do indeksu wyszukiwania
  • 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ą

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 .

W tym przykładzie znajdują się oba elementy scalarQuantization lub binaryQuantization. Możesz określić dowolną liczbę konfiguracji kompresji, a następnie przypisać te, które chcesz mieć profil wektorowy.

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 HNSW

Upewnij się, że indeks ma algorytm Hierarchiczny dla małych światów (HNSW). Wbudowane kwantyzacje nie są obsługiwane w przypadku wyczerpującej nazwy KNN.

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

Korzystanie z kompresji MRL i obcinanych wymiarów (wersja zapoznawcza)

Kompresja wielopoziomowa MRL zapisuje w magazynie wektorów i poprawia czas odpowiedzi zapytań dla zapytań wektorowych opartych na osadzaniu tekstu. W usłudze Azure AI Search obsługa języka MRL jest oferowana tylko razem z inną metodą kwantyzacji. Użycie kwantyzacji binarnej z narzędziem MRL zapewnia maksymalną redukcję rozmiaru indeksu wektorowego. Aby osiągnąć maksymalną redukcję magazynu, użyj kwantyzacji binarnej w języku MRL i stored ustaw wartość false.

Ta funkcja jest dostępna w wersji zapoznawczej. Jest ona dostępna w 2024-09-01-preview pakietach zestawu SDK i w wersji beta przeznaczonych dla tej wersji interfejsu API w wersji zapoznawczej.

Wymagania

  • Osadzanie tekstu—3-małe, osadzanie tekstu —3—duże (tylko zawartość tekstowa).
  • Nowe pola wektorów typu Edm.Half lub Edm.Single (nie można dodać kompresji MRL do istniejącego pola).
  • Algorytm HNSW (brak obsługi wyczerpującej nazwy KNN w tej wersji zapoznawczej).
  • Skonfiguruj kwantyzację skalarną lub binarną. Zalecamy kwantyzację binarną.

Obsługiwani klienci

Obecnie nie ma obsługi witryny Azure Portal ani programu Azure AI Studio.

Jak używać osadzania tekstu rozszerzonego mrL

MRL to możliwość modelu textembedding. Aby skorzystać z tych funkcji w usłudze Azure AI Search, wykonaj następujące kroki.

  1. vectorSearch.compressions Określ obiekt w definicji indeksu.
  2. Uwzględnij metodę kwantyzacji, skalarną lub binarną (zalecaną).
  3. Uwzględnij truncationDimension parametr ustawiony na 512 lub nawet 256, jeśli używasz modelu osadzania tekstu-3-duży.
  4. Określ profil wektora, który określa algorytm HNSW i obiekt kompresji wektora.
  5. Przypisz profil wektora do pola wektorowego typu Edm.Half lub Edm.Single w kolekcji pól.

Nie ma żadnych modyfikacji po stronie zapytania dotyczących korzystania z modelu osadzania tekstu z obsługą języka MRL. Zintegrowana wektoryzacja, konwersje tekstu na zapytanie w czasie zapytania, semantyczne klasyfikacje i inne funkcje ulepszenia istotności, takie jak ponowne korbowanie z oryginalnymi wektorami i nadmiernymi próbkowaniami, nie mają wpływu na obsługę języka MRL.

Indeksowanie jest wolniejsze ze względu na dodatkowe kroki, ale zapytania będą szybsze.

Przykład konfiguracji wyszukiwania wektorowego obsługującego język MRL

W poniższym przykładzie przedstawiono konfigurację wyszukiwania wektorowego, która spełnia wymagania i zalecenia dotyczące języka MRL.

truncationDimension jest właściwością kompresji. Określa, ile ma zmniejszyć wykres wektorowy w pamięci w połączeniu z metodą kompresji, np. kompresją skalarną lub binarną. Zalecamy użycie wartości 1024 lub nowszej w przypadku truncationDimension kwantyzacji binarnej. Wymiarowość mniejsza niż 1000 obniża jakość wyników wyszukiwania podczas korzystania z języka MRL i kompresji binarnej.

{ 
  "vectorSearch": { 
    "profiles": [ 
      { 
        "name": "use-bq-with-mrl", 
        "compression": "use-mrl,use-bq", 
        "algorithm": "use-hnsw" 
      } 
    ],
    "algorithms": [
       {
          "name": "use-hnsw",
          "kind": "hnsw",
          "hnswParameters": {
             "m": 4,
             "efConstruction": 400,
             "efSearch": 500,
             "metric": "cosine"
          }
       }
    ],
    "compressions": [ 
      { 
        "name": "use-mrl", 
        "kind": "truncation", 
        "rerankWithOriginalVectors": true, 
        "defaultOversampling": 10, 
        "truncationDimension": 1024
      }, 
      { 
        "name": "use-bq", 
        "kind": "binaryQuantization", 
        "rerankWithOriginalVectors": true,
        "defaultOversampling": 10
       } 
    ] 
  } 
} 

Oto przykład w pełni określonej definicji pola wektora, która spełnia wymagania dotyczące języka MRL.

Pamiętaj, że pola wektorów muszą być typu Edm.Half lub Edm.Single. Pola wektorowe muszą mieć vectorSearchProfile właściwość, która określa ustawienia algorytmu i kompresji. Pola wektorowe mają właściwość służącą dimensions do określania liczby wymiarów dla wyników oceniania i klasyfikowania. Jego wartość powinna być limitem wymiarów używanego modelu (1536 dla osadzania tekstu-3-small).

{
    "name": "text_vector",
    "type": "Collection(Edm.Single)",
    "searchable": true,
    "filterable": false,
    "retrievable": false,
    "stored": false,
    "sortable": false,
    "facetable": false,
    "key": false,
    "indexAnalyzer": null,
    "searchAnalyzer": null,
    "analyzer": null,
    "normalizer": null,
    "dimensions": 1536,
    "vectorSearchProfile": "use-bq-with-mrl",
    "vectorEncoding": null,
    "synonymMaps": []
}

Opcja 2. Przypisywanie wąskich typów danych do pól wektorowych

Łatwym sposobem zmniejszenia rozmiaru wektora jest przechowywanie osadzeń w mniejszym formacie danych. Większość modeli osadzania generuje 32-bitowe liczby zmiennoprzecinkowe, ale jeśli kwantyzujesz wektory lub jeśli model osadzania obsługuje go natywnie, dane wyjściowe mogą być zmiennoprzecinkowe16, int16 lub int8, co jest znacznie mniejsze niż float32. Te mniejsze rozmiary wektorów można uwzględnić, przypisując wąski typ danych do pola wektorowego. W indeksie wektorowym wąskie typy danych zużywają mniej miejsca do magazynowania.

  1. Przejrzyj typy danych używane dla pól wektorów w celu uzyskania zalecanego użycia:

    • Collection(Edm.Single) 32-bitowy zmiennoprzecinkowa (wartość domyślna)
    • Collection(Edm.Half) 16-bitowy zmiennoprzecinkowa (wąski)
    • Collection(Edm.Int16) 16-bitowa liczba całkowita ze znakiem (wąska)
    • Collection(Edm.SByte) 8-bitowa liczba całkowita ze znakiem (wąska)
    • Collection(Edm.Byte) 8-bitowa liczba całkowita bez znaku (dozwolona tylko z zapakowanymi typami danych binarnych)
  2. Z tej listy określ, który typ danych jest prawidłowy dla danych wyjściowych modelu osadzania lub dla wektorów, które są poddawane kwantyzacji niestandardowej.

    Poniższa tabela zawiera linki do kilku modeli osadzania, które mogą używać wąskiego typu danych (Collection(Edm.Half)) bez dodatkowych kwantyzacji. Można rzutować z float32 do float16 (przy użyciu Collection(Edm.Half)) bez dodatkowej pracy.

    Model osadzania Dane wyjściowe natywne Przypisywanie tego typu w usłudze Azure AI Search
    text-embedding-ada-002 Float32 Collection(Edm.Single) lub Collection(Edm.Half)
    osadzanie tekstu — 3 małe Float32 Collection(Edm.Single) lub Collection(Edm.Half)
    osadzanie tekstu —3 — duże Float32 Collection(Edm.Single) lub Collection(Edm.Half)
    Cohere V3 osadzanie modeli z int8 embedding_type Int8 Collection(Edm.SByte)

    Inne wąskie typy danych mogą być używane, jeśli model emituje osadzanie w mniejszym formacie danych lub jeśli masz niestandardową kwantyzację, która konwertuje wektory na mniejszy format.

  3. Upewnij się, że rozumiesz kompromisy wąskiego typu danych. Collection(Edm.Half) zawiera mniej informacji, co powoduje obniżenie rozdzielczości. Jeśli dane są homogeniczne lub gęste, utrata dodatkowych szczegółów lub niuansów może prowadzić do niedopuszczalnych wyników w czasie zapytania, ponieważ istnieje mniej szczegółów, których można użyć do odróżnienia pobliskich wektorów.

  4. Zdefiniuj i skompiluj indeks. W tym kroku możesz użyć witryny Azure Portal, tworzenia lub aktualizowania indeksu (interfejsu API REST) lub pakietu zestawu Azure SDK.

  5. Sprawdź wyniki. Przy założeniu, że pole wektorowe jest oznaczone jako możliwe do pobrania, użyj eksploratora wyszukiwania lub wyszukiwania — POST, aby sprawdzić, czy zawartość pola jest zgodna z typem danych.

    Aby sprawdzić rozmiar indeksu wektorowego, użyj witryny Azure Portal lub statystyk GET (interfejs API REST).

Uwaga

Typ danych pola służy do tworzenia struktury danych fizycznych. Jeśli chcesz później zmienić typ danych, upuść i ponownie skompilować indeks lub utworzyć drugie pole z nową definicją.

Opcja 3. Ustawianie stored właściwości w celu usunięcia magazynu możliwego do pobrania

Właściwość stored jest wartością logiczną w definicji pola wektorowego, która określa, czy magazyn jest przydzielany do pobierania zawartości pola wektorowego. Właściwość stored ma wartość true domyślnie. Jeśli nie potrzebujesz zawartości wektorowej w odpowiedzi na zapytanie, możesz zapisać do 50 procent magazynu na pole, ustawiając wartość stored false.

Zagadnienia dotyczące ustawiania stored wartości false:

  • Ponieważ wektory nie są czytelne dla człowieka, można pominąć je z wyników wysyłanych do modułów LLM w scenariuszach RAG oraz z wyników renderowanych na stronie wyszukiwania. Zachowaj je jednak, jeśli używasz wektorów w procesie podrzędnym, który zużywa zawartość wektorów.

  • Jeśli jednak strategia indeksowania zawiera częściowe aktualizacje dokumentu, takie jak "merge" lub "mergeOrUpload" w dokumencie, pamiętaj, że ustawienie stored false spowoduje pominięcie wektorów w polu, które nie jest przechowywane podczas scalania. W każdej operacji "merge" lub "mergeOrUpload" należy podać pola wektorów oprócz innych pól niewektorów, które są aktualizowane, lub wektor zostanie porzucony.

Pamiętaj, że stored przypisanie jest nieodwracalne. Jest on ustawiany podczas tworzenia indeksu w polach wektorów podczas tworzenia fizycznych struktur danych. Jeśli chcesz później pobrać zawartość wektorową, musisz usunąć i ponownie skompilować indeks lub utworzyć i załadować nowe pole, które ma nowe przypisanie.

Poniższy przykład przedstawia kolekcję pól indeksu wyszukiwania. Ustaw stored wartość false, aby trwale usunąć magazyn, który można pobrać dla pola wektora.

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

Kluczowe punkty:

  • Dotyczy tylko pól wektorowych.

  • Wpływa na magazyn na dysku, a nie na pamięć i nie ma wpływu na zapytania. Wykonywanie zapytania używa oddzielnego indeksu wektora, który nie ma wpływu na stored właściwość .

  • Właściwość stored jest ustawiana podczas tworzenia indeksu w polach wektorów i jest nieodwracalna. Jeśli chcesz później pobrać zawartość, musisz usunąć i ponownie skompilować indeks lub utworzyć i załadować nowe pole, które ma nowe przypisanie.

  • Wartości domyślne są stored ustawione na true i retrievable mają wartość false. W konfiguracji domyślnej jest przechowywana kopia do pobrania, ale nie jest ona automatycznie zwracana w wynikach. Jeśli stored wartość ma wartość true, możesz przełączać retrievable się między wartościami true i false w dowolnym momencie bez konieczności ponownego kompilowania indeksu. Jeśli stored wartość jest fałsz, retrievable musi być fałsz i nie można jej zmienić.

Przykład: techniki kompresji wektorów

Oto kod języka Python, który demonstruje kwantyzację, wąskie typy danych i użycie przechowywanej właściwości: Przykład kodu: kwantyzacja wektorów i opcje magazynu przy użyciu języka Python.

Ten kod tworzy i porównuje rozmiar magazynu i indeksu wektorowego dla każdej opcji:

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

Interfejsy API wyszukiwania raportują magazyn i rozmiar wektorów na poziomie indeksu, więc indeksy, a nie pola, muszą być podstawą porównania. Użyj statystyk indeksu GET lub równoważnego interfejsu API w zestawach SDK platformy Azure, aby uzyskać rozmiar wektora.

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

Składnia zapytań dla pola skompresowanego lub kwantyzowanego wektora jest taka sama jak w przypadku pól wektorów nieskompresowanych, chyba że chcesz zastąpić parametry skojarzone z przesamplingiem lub ponownym korbowaniem z oryginalnymi wektorami.

Pamiętaj, że definicja kompresji wektorów w indeksie ma ustawienia rerankWithOriginalVectors i defaultOversampling w celu ograniczenia skutków mniejszego indeksu wektorowego. 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   
  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   
            }
      ]    
    }

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.

Zobacz też