Tworzenie indeksu wektorowego

W usłudze Azure AI Search magazyn wektorów ma schemat indeksu, który definiuje pola wektorów i niewektorów, konfigurację wektorów dla algorytmów tworzących i kompresujących miejsce osadzania oraz ustawienia definicji pól wektorów używanych w żądaniach zapytań.

Interfejs API tworzenia lub aktualizowania indeksu tworzy magazyn wektorów. Wykonaj następujące kroki, aby indeksować dane wektorów:

  • Definiowanie schematu przy użyciu algorytmów wektorów i opcjonalnej kompresji
  • Dodawanie definicji pól wektorów
  • Załaduj wstępnie wektoryzowane dane jako oddzielny krok lub użyj zintegrowanej wektoryzacji w celu fragmentowania i kodowania danych podczas indeksowania

W tym artykule wyjaśniono przepływ pracy i użyto interfejsu REST na potrzeby ilustracji. Po zapoznaniu się z podstawowym przepływem pracy przejdź do przykładów kodu zestawu Azure SDK w repozytorium azure-search-vector-samples , aby uzyskać wskazówki dotyczące korzystania z tych funkcji w kodzie testowym i produkcyjnym.

Napiwek

Użyj witryny Azure Portal, aby utworzyć indeks wektorowy i wypróbować zintegrowane fragmentowanie i wektoryzację danych.

Wymagania wstępne

  • Usługa Azure AI Search w dowolnym regionie i w dowolnej warstwie. Większość istniejących usług obsługuje wyszukiwanie wektorów. W przypadku usług utworzonych przed styczniem 2019 r. istnieje niewielki podzbiór, który nie może utworzyć indeksu wektorowego. W takiej sytuacji należy utworzyć nową usługę. Jeśli używasz zintegrowanej wektoryzacji (zestawów umiejętności, które nazywają usługę Azure AI), usługa Azure AI Search musi znajdować się w tym samym regionie co usługi Azure OpenAI lub Azure AI.

  • Wstępnie istniejące osadzania wektorów lub używają zintegrowanej wektoryzacji, gdzie modele osadzania są wywoływane z potoku indeksowania.

  • Należy znać limit wymiarów modelu używanego do tworzenia osadzania. Prawidłowe wartości to od 2 do 3072 wymiary. W usłudze Azure OpenAI w przypadku osadzania tekstu-ada-002 długość wektora liczbowego wynosi 1536. W przypadku osadzania tekstu-3-małego lub osadzania tekstu-3-large długość wektora wynosi 3072.

  • Należy również wiedzieć, jakie są obsługiwane metryki podobieństwa. W przypadku usługi Azure OpenAI podobieństwo jest obliczane przy użyciu polecenia cosine.

  • Należy zapoznać się z tworzeniem indeksu. Schemat musi zawierać pole klucza dokumentu, inne pola, które chcesz przeszukiwać lub filtrować, oraz inne konfiguracje zachowań wymaganych podczas indeksowania i zapytań.

Przygotowywanie dokumentów do indeksowania

Przed indeksowaniem zmontuj ładunek dokumentu zawierający pola danych wektorowych i niewektorowych. Struktura dokumentu musi być zgodna ze schematem indeksu.

Upewnij się, że dokumenty:

  1. Podaj pole lub właściwość metadanych, która unikatowo identyfikuje każdy dokument. Wszystkie indeksy wyszukiwania wymagają klucza dokumentu. Aby spełnić wymagania dotyczące klucza dokumentu, dokument źródłowy musi mieć jedno pole lub właściwość, które może jednoznacznie zidentyfikować go w indeksie. To pole źródłowe musi być mapowane na pole indeksu typu Edm.String i key=true w indeksie wyszukiwania.

  2. Podaj dane wektorowe (tablicę liczb zmiennoprzecinkowych o pojedynczej precyzji) w polach źródłowych.

    Pola wektorowe zawierają tablicę wygenerowaną przez osadzanie modeli, jedno osadzanie na pole, gdzie pole jest polem najwyższego poziomu (nie częścią typu zagnieżdżonego lub złożonego). Aby uzyskać najprostszą integrację, zalecamy osadzanie modeli w usłudze Azure OpenAI, takich jak osadzanie tekstu-ada-002 dla dokumentów tekstowych lub interfejsu API REST pobierania obrazów dla obrazów.

    Jeśli możesz podjąć zależność od indeksatorów i zestawów umiejętności, rozważ użycie zintegrowanej wektoryzacji , która koduje obrazy i zawartość alfanumeryczną podczas indeksowania. Definicje pól są przeznaczone dla pól wektorowych, ale dane źródłowe mogą być tekstami lub obrazami z tablicami wektorowymi utworzonymi podczas indeksowania.

  3. Podaj inne pola z czytelną dla człowieka zawartością alfanumeryczną dla odpowiedzi na zapytanie oraz w scenariuszach hybrydowych zapytań obejmujących wyszukiwanie pełnotekstowe lub klasyfikację semantyczną w tym samym żądaniu.

Indeks wyszukiwania powinien zawierać pola i zawartość dla wszystkich scenariuszy zapytań, które chcesz obsługiwać. Załóżmy, że chcesz wyszukiwać lub filtrować nazwy produktów, wersje, metadane lub adresy. W takim przypadku wyszukiwanie podobieństwa nie jest szczególnie przydatne. Wyszukiwanie słów kluczowych, wyszukiwanie geograficzne lub filtry byłyby lepszym wyborem. Indeks wyszukiwania zawierający kompleksową kolekcję pól danych wektorowych i niewektorowych zapewnia maksymalną elastyczność tworzenia zapytań i kompozycji odpowiedzi.

Krótki przykład ładunku dokumentów, który zawiera pola wektorowe i niewektorowe, znajduje się w sekcji danych wektora obciążenia tego artykułu.

Dodawanie konfiguracji wyszukiwania wektorowego

Konfiguracja wektorów określa parametry używane podczas indeksowania w celu utworzenia informacji "najbliższego sąsiada" między węzłami wektorów:

  • Hierarchiczny nawigowalny mały świat (HNSW)
  • Wyczerpująca nazwa KNN

Jeśli wybierzesz opcję HNSW w polu, możesz wybrać wyczerpującą nazwę KNN w czasie zapytania. Ale inny kierunek nie działa: jeśli wybierzesz wyczerpujące, nie możesz później zażądać wyszukiwania HNSW, ponieważ dodatkowe struktury danych, które umożliwiają przybliżone wyszukiwanie, nie istnieją.

Konfiguracja wektorów określa również metody kwantyzacji w celu zmniejszenia rozmiaru wektora:

  • Skalar
  • Binarne (dostępne tylko w wersji 2024-07-01 i nowszych pakietach zestawu Azure SDK)

Aby uzyskać instrukcje dotyczące migracji do najnowszej wersji, zobacz Uaktualnianie interfejsu API REST.

2024-07-01 jest ogólnie dostępny. Obsługuje on konfigurację wektorów o następujących elementach:

  • vectorSearch.algorithms obsługa systemu HNSW i wyczerpująca nazwa KNN.
  • vectorSearch.compressions obsługują kwantyzację skalarną i binarną, nadmierną próbkowanie i ponowne korbowanie przy użyciu oryginalnych wektorów.
  • vectorSearch.profiles zapewniają wiele kombinacji konfiguracji algorytmu i kompresji.

Pamiętaj, aby mieć strategię wektoryzacji zawartości. Zalecamy zintegrowaną wektoryzację i wektoryzatory czasu zapytania na potrzeby wbudowanego kodowania.

  1. Użyj interfejsu API tworzenia lub aktualizowania indeksu , aby utworzyć indeks.

  2. Dodaj sekcję vectorSearch w indeksie, która określa algorytmy wyszukiwania używane do tworzenia miejsca osadzania.

     "vectorSearch": {
         "compressions": [
             {
                 "name": "scalar-quantization",
                 "kind": "scalarQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
                     "scalarQuantizationParameters": {
                         "quantizedDataType": "int8"
                     }
             },
             {
                 "name": "binary-quantization",
                 "kind": "binaryQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
             }
         ],
         "algorithms": [
             {
                 "name": "hnsw-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "hnsw-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "hamming"
                 }
             },
             {
                 "name": "eknn",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "euclidean"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "vector-profile-hnsw-scalar",
             "compression": "scalar-quantization",
             "algorithm": "hnsw-1"
           }
         ]
     }
    

    Kluczowe punkty:

    • Nazwy każdej konfiguracji kompresji, algorytmu i profilu muszą być unikatowe dla jego typu w indeksie.

    • vectorSearch.compressions.kind może mieć wartość scalarQuantization lub binaryQuantization.

    • vectorSearch.compressions.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.

    • vectorSearch.compressions.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.

    • vectorSearch.compressions.scalarQuantizationParameters.quantizedDataType musi być ustawiona na int8. Jest to obecnie jedyny typ danych pierwotnych obsługiwany. Ta właściwość jest opcjonalna. Wartość domyślna to int8.

    • vectorSearch.algorithms.kind to lub "hnsw" "exhaustiveKnn". Są to przybliżone algorytmy najbliższych sąsiadów (ANN) używane do organizowania zawartości wektorowej podczas indeksowania.

    • vectorSearch.algorithms.m to liczba linków dwukierunkowych. Wartość domyślna to 4. Zakres wynosi od 4 do 10. Niższe wartości powinny zwracać mniej szumu w wynikach.

    • vectorSearch.algorithms.efConstruction to liczba najbliższych sąsiadów używanych podczas indeksowania. Wartość domyślna to 400. Zakres wynosi od 100 do 1000.

    • "vectorSearch.algorithms.fSearch to liczba najbliższych sąsiadów używanych podczas wyszukiwania. Wartość domyślna to 500. Zakres wynosi od 100 do 1000.

    • vectorSearch.algorithms.metric jeśli używasz usługi Azure OpenAI, w przeciwnym razie użyj metryki podobieństwa skojarzonej z używanym modelem osadzania. Obsługiwane wartości to cosine, , euclideandotProduct, hamming (używane do indeksowania danych binarnych).

    • vectorSearch.profiles dodaj warstwę abstrakcji, aby uzyskać bardziej rozbudowane definicje. Profil jest definiowany w elemencie vectorSearch, a następnie odwołuje się do nich według nazwy w każdym polu wektora. Jest to kombinacja konfiguracji kompresji i algorytmów. Jest to właściwość przypisana do pola wektorowego i określa algorytm i kompresję pól.

Dodawanie pola wektorowego do kolekcji pól

Kolekcja pól musi zawierać pole dla klucza dokumentu, pól wektorów i innych pól, które są potrzebne w scenariuszach wyszukiwania hybrydowego.

Pola wektorowe charakteryzują się ich typem danych, właściwością opartą dimensions na modelu osadzania używanym do wyprowadzania wektorów i profilu wektorowego.

2024-07-01 jest ogólnie dostępny.

  1. Utwórz lub zaktualizuj indeks za pomocą polecenia Utwórz lub Aktualizuj indeks.

  2. Zdefiniuj pole wektora z następującymi atrybutami. Można przechowywać jedno wygenerowane osadzanie dla każdego pola. Dla każdego pola wektora:

    • typemusi być typami danych wektorowych. Collection(Edm.Single) jest najczęstszym elementem osadzania modeli.
    • dimensions to liczba wymiarów generowanych przez model osadzania. W przypadku osadzania tekstu-ada-002 jest to 1536.
    • vectorSearchProfile to nazwa profilu zdefiniowanego gdzie indziej w indeksie.
    • searchable musi być prawdziwe.
    • retrievable może mieć wartość true lub false. Wartość True zwraca nieprzetworzone wektory (1536 z nich) jako zwykły tekst i zużywa miejsce do magazynowania. Ustaw wartość true, jeśli przekazujesz wynik wektora do aplikacji podrzędnej.
    • stored może mieć wartość true lub false. Określa, czy do pobierania jest przechowywana dodatkowa kopia wektorów. Aby uzyskać więcej informacji, zobacz Zmniejszanie rozmiaru wektora.
    • filterablesortable, facetablemusi mieć wartość false.
  3. Dodaj pola niewektorowe do kolekcji, takie jak "title" z ustawioną wartością filterable true, jeśli chcesz wywołać wstępne filtrowanie lub filtrowanie wektorowe.

  4. Dodaj inne pola, które definiują istotę i strukturę indeksowania zawartości tekstowej. Co najmniej potrzebny jest klucz dokumentu.

    Należy również dodać pola, które są przydatne w zapytaniu lub w odpowiedzi. W poniższym przykładzie przedstawiono pola wektorów dla tytułu i zawartości ("titleVector", "contentVector"), które są równoważne wektorom. Udostępnia również pola równoważnej zawartości tekstowej ("title", "content") przydatne do sortowania, filtrowania i odczytywania w wynikach wyszukiwania.

    W poniższym przykładzie przedstawiono kolekcję pól:

    PUT https://my-search-service.search.windows.net/indexes/my-index?api-version=2024-07-01&allowIndexDowntime=true
    Content-Type: application/json
    api-key: {{admin-api-key}}
    {
        "name": "{{index-name}}",
        "fields": [
            {
                "name": "id",
                "type": "Edm.String",
                "key": true,
                "filterable": true
            },
            {
                "name": "title",
                "type": "Edm.String",
                "searchable": true,
                "filterable": true,
                "sortable": true,
                "retrievable": true
            },
            {
                "name": "titleVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "stored": true,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": false,
                "stored": false,
                "dimensions": 1536,
                "vectorSearchProfile": "-vector-profile-1"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "hsnw-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "vector-profile-1",
                    "algorithm": "hnsw-1"
                }
            ]
        }
    }
    

Ładowanie danych wektorów do indeksowania

Zawartość, którą podajesz do indeksowania, musi być zgodna ze schematem indeksu i zawierać unikatową wartość ciągu klucza dokumentu. Wstępnie wektorowe dane są ładowane do co najmniej jednego pola wektorowego, które mogą współistnieć z innymi polami zawierającymi zawartość alfanumeryczną.

Do pozyskiwania danych można użyć metodologii wypychania lub ściągania.

Użyj dokumentów — indeks , aby załadować dane wektorowe i niewektorowe do indeksu. Interfejsy API wypychania do indeksowania są identyczne we wszystkich stabilnych i zapoznawczych wersjach. Aby załadować dokumenty, użyj dowolnego z następujących interfejsów API:

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2024-07-01

{
    "value": [
        {
            "id": "1",
            "title": "Azure App Service",
            "content": "Azure App Service is a fully managed platform for building, deploying, and scaling web apps. You can host web apps, mobile app backends, and RESTful APIs. It supports a variety of programming languages and frameworks, such as .NET, Java, Node.js, Python, and PHP. The service offers built-in auto-scaling and load balancing capabilities. It also provides integration with other Azure services, such as Azure DevOps, GitHub, and Bitbucket.",
            "category": "Web",
            "titleVector": [
                -0.02250031754374504,
                 . . . 
                        ],
            "contentVector": [
                -0.024740582332015038,
                 . . .
            ],
            "@search.action": "upload"
        },
        {
            "id": "2",
            "title": "Azure Functions",
            "content": "Azure Functions is a serverless compute service that enables you to run code on-demand without having to manage infrastructure. It allows you to build and deploy event-driven applications that automatically scale with your workload. Functions support various languages, including C#, F#, Node.js, Python, and Java. It offers a variety of triggers and bindings to integrate with other Azure services and external services. You only pay for the compute time you consume.",
            "category": "Compute",
            "titleVector": [
                -0.020159931853413582,
                . . .
            ],
            "contentVector": [
                -0.02780858241021633,
                 . . .
            ],
            "@search.action": "upload"
        }
        . . .
    ]
}

Sprawdzanie indeksu pod kątem zawartości wektorowej

W celach weryfikacji można wykonywać zapytania dotyczące indeksu przy użyciu Eksploratora wyszukiwania w witrynie Azure Portal lub wywołania interfejsu API REST. Ponieważ usługa Azure AI Search nie może przekonwertować wektora na tekst czytelny dla człowieka, spróbuj zwrócić pola z tego samego dokumentu, które dostarczają dowody dopasowania. Jeśli na przykład zapytanie wektorowe jest przeznaczone dla pola "titleVector", możesz wybrać pozycję "title" dla wyników wyszukiwania.

Pola muszą być przypisywane jako "możliwe do pobrania", aby zostały uwzględnione w wynikach.

  • Przejrzyj indeksy w indeksach zarządzania wyszukiwaniem>, aby wyświetlić rozmiar indeksu o rozmiarze all-up i wektorowym rozmiarze indeksu. Dodatni rozmiar indeksu wektorowego wskazuje, że istnieją wektory.

  • Użyj Eksploratora wyszukiwania, aby wysłać zapytanie do indeksu. Eksplorator wyszukiwania ma dwa widoki: widok zapytania (domyślny) i widok JSON.

    • Ustaw opcje>zapytania Ukryj wartości wektorów w wynikach wyszukiwania, aby uzyskać bardziej czytelne wyniki.

    • Użyj widoku JSON dla zapytań wektorowych. Możesz wkleić definicję JSON zapytania wektorowego, które chcesz wykonać, lub użyć wbudowanej konwersji tekstu na wektor lub obraz-wektor, jeśli indeks ma przypisanie wektoryzatora. Aby uzyskać więcej informacji na temat wyszukiwania obrazów, zobacz Szybki start: wyszukiwanie obrazów w Eksploratorze wyszukiwania.

    • Użyj domyślnego widoku zapytania, aby szybko potwierdzić, że indeks zawiera wektory. Widok zapytania jest przeznaczony do wyszukiwania pełnotekstowego. Chociaż nie można go używać do zapytań wektorowych, możesz wysłać puste wyszukiwanie (search=*), aby sprawdzić zawartość. Zawartość wszystkich pól, w tym pól wektorowych, jest zwracana jako zwykły tekst.

    • Aby uzyskać więcej szczegółów, zobacz Tworzenie zapytania wektorowego.

Aktualizowanie magazynu wektorów

Aby zaktualizować magazyn wektorów, zmodyfikuj schemat i w razie potrzeby załaduj ponownie dokumenty, aby wypełnić nowe pola. Interfejsy API aktualizacji schematu obejmują tworzenie lub aktualizowanie indeksu (REST), CreateOrUpdateIndex w zestawie Azure SDK dla platformy .NET, create_or_update_index w zestawie Azure SDK dla języka Python i podobne metody w innych zestawach SDK platformy Azure.

Standardowe wskazówki dotyczące aktualizowania indeksu zostały omówione w temacie Aktualizowanie lub ponowne kompilowanie indeksu.

Kluczowe kwestie obejmują:

  • Usuwanie i ponowne kompilowanie jest często wymagane w przypadku aktualizacji i usuwania istniejących pól.

  • Można jednak zaktualizować istniejący schemat przy użyciu następujących modyfikacji bez konieczności ponownego kompilowanie:

    • Dodaj nowe pola do kolekcji pól.
    • Dodaj nowe konfiguracje wektorów przypisane do nowych pól, ale nie istniejące pola, które zostały już wektoryzowane.
    • Zmień "możliwe do pobrania" (wartości są prawdziwe lub fałszywe) w istniejącym polu. Pola wektorowe muszą być wyszukiwalne i możliwe do pobrania, ale jeśli chcesz wyłączyć dostęp do pola wektorowego w sytuacjach, w których upuszczanie i ponowne kompilowanie nie jest możliwe, możesz ustawić pobieranie na wartość false.

Następne kroki

W następnym kroku zalecamy wykonywanie zapytań dotyczących danych wektorów w indeksie wyszukiwania.

Przykłady kodu w repozytorium azure-search-vector przedstawiają kompleksowe przepływy pracy, które obejmują definicję schematu, wektoryzację, indeksowanie i zapytania.

Dostępny jest kod demonstracyjny dla języków Python, C# i JavaScript.