Udostępnij za pośrednictwem


Tworzenie zapytania wektorowego w usłudze Azure AI Search

W usłudze Azure AI Search, jeśli masz indeks wektorowy, w tym artykule wyjaśniono, jak:

W tym artykule użyto architektury REST na potrzeby ilustracji. Przykłady kodu w innych językach można znaleźć w repozytorium GitHub azure-search-vector-samples , które zawiera kompleksowe rozwiązania obejmujące zapytania wektorowe.

Eksplorator wyszukiwania można również użyć w witrynie Azure Portal.

Wymagania wstępne

Konwertowanie danych wejściowych ciągu zapytania na wektor

Aby wysłać zapytanie do pola wektora, samo zapytanie musi być wektorem.

Jedną z metod konwertowania ciągu zapytania tekstowego użytkownika na jego reprezentację wektorową jest wywołanie biblioteki osadzania lub interfejsu API w kodzie aplikacji. Najlepszym rozwiązaniem jest użycie tych samych modeli osadzania używanych do generowania osadzania w dokumentach źródłowych. Przykłady kodu przedstawiające sposób generowania osadzania można znaleźć w repozytorium azure-search-vector-samples .

Drugie podejście polega na użyciu wektoryzacji zintegrowanej, teraz ogólnie dostępnej, aby usługa Azure AI Search obsługiwała dane wejściowe i wyjściowe wektoryzacji zapytań.

Oto przykładowy ciąg zapytania przesłany do wdrożenia modelu osadzania usługi Azure OpenAI za pomocą interfejsu API REST:

POST https://{{openai-service-name}}.openai.azure.com/openai/deployments/{{openai-deployment-name}}/embeddings?api-version={{openai-api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "input": "what azure services support generative AI'"
}

Oczekiwana odpowiedź to 202 w przypadku pomyślnego wywołania wdrożonego modelu.

Pole "osadzanie" w treści odpowiedzi jest wektorową reprezentacją ciągu zapytania "input". W celach testowych należy skopiować wartość tablicy "osadzanie" do "vectorQueries.vector" w żądaniu zapytania przy użyciu składni pokazanej w kilku następnych sekcjach.

Rzeczywista odpowiedź dla tego wywołania POST do wdrożonego modelu obejmuje 1536 osadzania, przycięte tutaj tylko do kilku pierwszych wektorów w celu zapewnienia czytelności.

{
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "index": 0,
            "embedding": [
                -0.009171937,
                0.018715322,
                ...
                -0.0016804502
            ]
        }
    ],
    "model": "ada",
    "usage": {
        "prompt_tokens": 7,
        "total_tokens": 7
    }
}

W tym podejściu kod aplikacji jest odpowiedzialny za nawiązywanie połączenia z modelem, generowanie osadzonych i obsługę odpowiedzi.

Żądanie zapytania wektorowego

W tej sekcji przedstawiono podstawową strukturę zapytania wektorowego. Aby sformułować zapytanie wektorowe, możesz użyć witryny Azure Portal, interfejsów API REST lub zestawów SDK platformy Azure. W przypadku migracji z wersji 2023-07-01-Preview istnieją zmiany powodujące niezgodność. Aby uzyskać szczegółowe informacje, zobacz Uaktualnianie do najnowszego interfejsu API REST.

2024-07-01 to stabilna wersja interfejsu API REST wyszukiwania POST. Ta wersja obsługuje następujące wersję:

  • vectorQueries to konstrukcja wyszukiwania wektorowego.
  • vectorQueries.kindvector dla tablicy wektorowej lub ustaw wartość text , jeśli dane wejściowe są ciągiem i masz wektoryzator.
  • vectorQueries.vector to zapytanie (wektorowa reprezentacja tekstu lub obrazu).
  • vectorQueries.weight (opcjonalnie) określa względną wagę każdego zapytania wektorowego uwzględnionego w operacjach wyszukiwania (zobacz Wagi wektorów).
  • exhaustive (opcjonalnie) wywołuje wyczerpującą nazwę KNN w czasie zapytania, nawet jeśli pole jest indeksowane dla HNSW.

W poniższym przykładzie wektor jest reprezentacją tego ciągu: "to, co usługi platformy Azure obsługują wyszukiwanie pełnotekstowe". Zapytanie jest przeznaczone dla contentVector pola . Zapytanie zwraca k wyniki. Rzeczywisty wektor ma 1536 osadzonych elementów, więc jest przycinany w tym przykładzie pod kątem czytelności.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "weight": 0.5,
            "k": 5
        }
    ]
}

Odpowiedź zapytania wektorowego

W usłudze Azure AI Search odpowiedzi zapytań składają się z wszystkich retrievable pól domyślnie. Jednak często można ograniczyć wyniki wyszukiwania do podzestawu retrievable pól, wyświetlając je w instrukcji select .

W zapytaniu wektorowym należy dokładnie rozważyć, czy należy wektorować pola w odpowiedzi. Pola wektorowe nie są czytelne dla człowieka, więc jeśli wypychasz odpowiedź na stronę internetową, wybierz pola niewektorowe, które są reprezentatywne dla wyniku. Jeśli na przykład zapytanie jest wykonywane względem contentVectorelementu , możesz zamiast tego zwrócić content wartość .

Jeśli chcesz, aby pola wektorów w wynikach, oto przykład struktury odpowiedzi. contentVector to tablica ciągów osadzania, przycinana tutaj w celu zwięzłości. Wynik wyszukiwania wskazuje istotność. Inne pola niewektorowe są uwzględniane w kontekście.

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.80025613,
            "title": "Azure Search",
            "category": "AI + Machine Learning",
            "contentVector": [
                -0.0018343845,
                0.017952163,
                0.0025753193,
                ...
            ]
        },
        {
            "@search.score": 0.78856903,
            "title": "Azure Application Insights",
            "category": "Management + Governance",
            "contentVector": [
                -0.016821077,
                0.0037742127,
                0.016136652,
                ...
            ]
        },
        {
            "@search.score": 0.78650564,
            "title": "Azure Media Services",
            "category": "Media",
            "contentVector": [
                -0.025449317,
                0.0038463024,
                -0.02488436,
                ...
            ]
        }
    ]
}

Kluczowe punkty:

  • k określa liczbę zwracanych wyników najbliższego sąsiada, w tym przypadku trzy. Zapytania wektorowe zawsze zwracają k wyniki, zakładając, że istnieją co najmniej k dokumenty, nawet jeśli istnieją dokumenty o niskiej podobieństwie, ponieważ algorytm znajduje najbliższych k sąsiadów do wektora zapytania.

  • Element @search.score jest określany przez algorytm wyszukiwania wektorowego.

  • Pola w wynikach wyszukiwania to wszystkie retrievable pola lub pola w klauzuli select . Podczas wykonywania zapytania wektorowego dopasowanie jest wykonywane tylko na danych wektorowych. Jednak odpowiedź może zawierać dowolne retrievable pole w indeksie. Ponieważ nie ma możliwości dekodowania wyniku pola wektorowego, włączenie pól tekstowych niewektorów jest przydatne dla ich ludzkich wartości czytelnych.

Wiele pól wektorów

Właściwość "vectorQueries.fields" można ustawić na wiele pól wektorowych. Zapytanie wektorowe jest wykonywane względem każdego pola wektora podanego na fields liście. Podczas wykonywania zapytań dotyczących wielu pól wektorowych upewnij się, że każdy z nich zawiera osadzanie z tego samego modelu osadzania i że zapytanie jest również generowane na podstawie tego samego modelu osadzania.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector, titleVector",
            "k": 5
        }
    ]
}

Wiele zapytań wektorowych

Wyszukiwanie wektorów wielozasyłowych wysyła wiele zapytań w wielu polach wektorów w indeksie wyszukiwania. Typowym przykładem tego żądania zapytania jest użycie modeli, takich jak CLIP dla wyszukiwania wektorów wielomodalnych, w którym ten sam model może wektoryzować zawartość obrazu i tekstu.

Poniższy przykład zapytania szuka podobieństwa w obu myImageVector i myTextVector, ale wysyła odpowiednio w dwóch różnych osadzaniu zapytań, z których każda wykonuje równolegle. To zapytanie generuje wynik, który jest oceniany przy użyciu wzajemnego łączenia rangi (RRF) .

  • vectorQueries udostępnia tablicę zapytań wektorowych.
  • vector zawiera wektory obrazów i wektory tekstowe w indeksie wyszukiwania. Każde wystąpienie jest oddzielnym zapytaniem.
  • fields określa, które pole wektora ma być docelowe.
  • k to liczba dopasowań najbliższych sąsiadów do uwzględnienia w wynikach.
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "myimagevector",
            "k": 5
        },
        {
            "kind": "vector"
            "vector": [
                -0.002222222,
                0.018708462,
                -0.013770515,
            . . .
            ],
            "fields": "mytextvector",
            "k": 5
        }
    ]
}

Wyniki wyszukiwania obejmują kombinację tekstu i obrazów, zakładając, że indeks wyszukiwania zawiera pole dla pliku obrazu (indeks wyszukiwania nie przechowuje obrazów).

Wykonywanie zapytań ze zintegrowaną wektoryzacją

W tej sekcji przedstawiono zapytanie wektorowe, które wywołuje zintegrowaną wektoryzację, która konwertuje zapytanie tekstowe lub obraz na wektor. Zalecamy stabilną 2024-07-01 interfejs API REST, Eksplorator wyszukiwania lub nowsze pakiety zestawu Azure SDK dla tej funkcji.

Warunkiem wstępnym jest indeks wyszukiwania ze skonfigurowanym wektoryzatorem i przypisanym do pola wektora. Wektoryzator udostępnia informacje o połączeniu z modelem osadzania używanym w czasie wykonywania zapytania.

Eksplorator wyszukiwania obsługuje wektoryzację zintegrowaną w czasie wykonywania zapytań. Jeśli indeks zawiera pola wektorowe i ma wektoryzator, możesz użyć wbudowanej konwersji tekstu na wektor.

  1. Zaloguj się do witryny Azure Portal przy użyciu konta platformy Azure i przejdź do usługa wyszukiwania usługi Azure AI.

  2. W menu po lewej stronie rozwiń węzeł Indeksy zarządzania wyszukiwaniem>i wybierz indeks. Eksplorator wyszukiwania to pierwsza karta na stronie indeksu.

  3. Sprawdź profile wektorów , aby potwierdzić, że masz wektoryzator.

    Zrzut ekranu przedstawiający ustawienie wektoryzatora w indeksie wyszukiwania.

  4. W Eksploratorze wyszukiwania możesz wprowadzić ciąg tekstowy na domyślnym pasku wyszukiwania w widoku zapytania. Wbudowany wektoryzator konwertuje ciąg na wektor, wykonuje wyszukiwanie i zwraca wyniki.

    Alternatywnie możesz wybrać pozycję Wyświetl>widok JSON, aby wyświetlić lub zmodyfikować zapytanie. Jeśli istnieją wektory, Eksplorator wyszukiwania konfiguruje zapytanie wektorowe automatycznie. Widok JSON służy do wybierania pól używanych w wyszukiwaniu i w odpowiedzi, dodawania filtrów lub tworzenia bardziej zaawansowanych zapytań, takich jak hybrydowe. Przykład JSON znajduje się na karcie interfejsu API REST w tej sekcji.

Liczba sklasyfikowanych wyników w odpowiedzi na zapytanie wektorowe

Zapytanie wektorowe k określa parametr, który określa liczbę dopasowań zwracanych w wynikach. Aparat wyszukiwania zawsze zwraca k liczbę dopasowań. Jeśli k liczba dokumentów w indeksie jest większa niż liczba dokumentów, liczba dokumentów określa górny limit zwracanych dokumentów.

Jeśli znasz wyszukiwanie pełnotekstowe, wiesz, że oczekujesz zerowych wyników, jeśli indeks nie zawiera terminu ani frazy. Jednak w wyszukiwaniu wektorowym operacja wyszukiwania identyfikuje najbliższych sąsiadów i zawsze zwraca k wyniki, nawet jeśli najbliżsi sąsiedzi nie są podobne. Dlatego można uzyskać wyniki dla niesensownych lub poza tematem zapytań, zwłaszcza jeśli nie używasz monitów do ustawiania granic. Mniej istotne wyniki mają gorszy wynik podobieństwa, ale nadal są to "najbliższe" wektory, jeśli nie ma nic bliżej. W związku z tym odpowiedź bez znaczących wyników może nadal zwracać k wyniki, ale wynik podobieństwa każdego wyniku będzie niski.

Hybrydowe podejście obejmujące wyszukiwanie pełnotekstowe może wyeliminować ten problem. Innym ograniczeniem ryzyka jest ustawienie minimalnego progu dla wyniku wyszukiwania, ale tylko wtedy, gdy zapytanie jest czystym pojedynczym zapytaniem wektorowym. Zapytania hybrydowe nie sprzyja minimalnym progom, ponieważ zakresy RRF są o wiele mniejsze i nietrwałe.

Parametry zapytania wpływające na liczbę wyników obejmują:

  • "k": n wyniki dla zapytań tylko wektorów
  • "top": n wyniki zapytań hybrydowych zawierających parametr "search"

Oba "k" i "top" są opcjonalne. Nieokreślona domyślna liczba wyników w odpowiedzi to 50. Możesz ustawić wartość "top" i "skip" na stronę za pomocą większej liczby wyników lub zmienić wartość domyślną.

Algorytmy klasyfikowania używane w zapytaniu wektorowym

Klasyfikacja wyników jest obliczana przez:

  • Metryka podobieństwa
  • Wzajemne łączenie rangi (RRF), jeśli istnieje wiele zestawów wyników wyszukiwania.

Metryka podobieństwa

Metryka podobieństwa określona w sekcji indeksu vectorSearch dla zapytania tylko wektorów. Prawidłowe wartości to cosine, euclidean i dotProduct.

Modele osadzania usługi Azure OpenAI używają podobieństwa cosinus, więc jeśli używasz modeli osadzania w usłudze Azure OpenAI, cosine to zalecana metryka. Inne obsługiwane metryki klasyfikacji to euclidean i dotProduct.

Korzystanie z protokołu RRF

Tworzone są wiele zestawów, jeśli zapytanie jest przeznaczone dla wielu pól wektorów, uruchamia równolegle wiele zapytań wektorowych lub jeśli zapytanie jest hybrydą wyszukiwania wektorowego i pełnotekstowego, z lub bez semantycznego klasyfikacji.

Podczas wykonywania zapytania zapytanie wektorowe może dotyczyć tylko jednego indeksu wektora wewnętrznego. Dlatego w przypadku wielu pól wektorowych i wielu zapytań wektorowych aparat wyszukiwania generuje wiele zapytań, które są przeznaczone dla odpowiednich indeksów wektorów każdego pola. Dane wyjściowe to zestaw sklasyfikowanych wyników dla każdego zapytania, które są połączone przy użyciu protokołu RRF. Aby uzyskać więcej informacji, zobacz Ocenianie istotności przy użyciu wzajemnego łączenia rangi (RRF).

Waga wektorów

Dodaj parametr zapytania, aby określić względną weight wagę każdego zapytania wektorowego uwzględnionego w operacjach wyszukiwania. Ta wartość jest używana podczas łączenia wyników wielu list klasyfikacji generowanych przez co najmniej dwa zapytania wektorowe w tym samym żądaniu lub z części wektorowej zapytania hybrydowego.

Wartość domyślna to 1.0, a wartość musi być liczbą dodatnią większą niż zero.

Wagi są używane podczas obliczania wzajemnych wyników łączenia rangi każdego dokumentu. Obliczenie jest mnożnikiem weight wartości względem wyniku rangi dokumentu w odpowiednim zestawie wyników.

Poniższy przykład to zapytanie hybrydowe z dwoma ciągami zapytania wektorowego i jednym ciągiem tekstowym. Wagi są przypisywane do zapytań wektorowych. Pierwsze zapytanie wynosi 0,5 lub połowę wagi, zmniejszając jego znaczenie w żądaniu. Drugie zapytanie wektorowe jest dwa razy ważniejsze.

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

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_first_vector_field", 
          "k": 10, 
          "weight": 0.5 
        },
        { 
          "kind": "vector", 
          "vector": [4.0, 5.0, 6.0], 
          "fields": "my_second_vector_field", 
          "k": 10, 
          "weight": 2.0
        } 
      ], 
      "search": "hello world" 
    } 

Waga wektorów ma zastosowanie tylko do wektorów. Zapytanie tekstowe w tym przykładzie ("hello world") ma niejawną wagę 1,0 lub neutralną. Jednak w zapytaniu hybrydowym można zwiększyć lub zmniejszyć znaczenie pól tekstowych, ustawiając wartość maxTextRecallSize.

Ustaw progi, aby wykluczyć wyniki z niską oceną (wersja zapoznawcza)

Ponieważ wyszukiwanie najbliższych sąsiadów zawsze zwraca żądanych k sąsiadów, istnieje możliwość uzyskania wielu dopasowań o niskiej ocenianiu w ramach spełnienia k wymagań dotyczących liczby wyników wyszukiwania. Aby wykluczyć wynik wyszukiwania o niskim ocenianiu, możesz dodać threshold parametr zapytania, który filtruje wyniki na podstawie minimalnej oceny. Filtrowanie występuje przed połączeniem wyników z różnych zestawów odwołań.

Ten parametr jest nadal w wersji zapoznawczej. Zalecamy wersję zapoznawczą interfejsu API REST w wersji 2024-05-01-preview.

W tym przykładzie wszystkie dopasowania, które oceniają poniżej 0,8, są wykluczone z wyników wyszukiwania wektorowego, nawet jeśli liczba wyników spadnie poniżej k.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-preview 
    Content-Type: application/json 
    api-key: [admin key] 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my-cosine-field", 
          "threshold": { 
            "kind": "vectorSimilarity", 
            "value": 0.8 
          } 
        }
      ]
    }

MaxTextSizeRecall na potrzeby wyszukiwania hybrydowego (wersja zapoznawcza)

Zapytania wektorowe są często używane w konstrukcjach hybrydowych, które zawierają pola niewektorowe. Jeśli okaże się, że wyniki w rankingu BM25 są ponad lub poniżej reprezentowane w wynikach zapytania hybrydowego, możesz ustawićmaxTextRecallSize, aby zwiększyć lub zmniejszyć wyniki klasyfikacji hybrydowej BM25.

Tę właściwość można ustawić tylko w żądaniach hybrydowych, które zawierają składniki "search" i "vectorQueries".

Ten parametr jest nadal w wersji zapoznawczej. Zalecamy wersję zapoznawczą interfejsu API REST w wersji 2024-05-01-preview.

Aby uzyskać więcej informacji, zobacz Set maxTextRecallSize — Tworzenie zapytania hybrydowego.

Następne kroki

W następnym kroku przejrzyj przykłady kodu zapytania wektorowego w języku Python, C# lub JavaScript.