Tworzenie zapytania hybrydowego w usłudze Azure AI Search

Wyszukiwanie hybrydowe łączy jedno lub więcej zapytań słów kluczowych z co najmniej jednym zapytaniem wektorowym w jednym żądaniu wyszukiwania. Zapytania są wykonywane równolegle. Wyniki są scalane i zmieniane według nowych wyników wyszukiwania przy użyciu funkcji Wzajemne łączenie rangi (RRF) w celu zwrócenia pojedynczego sklasyfikowanego zestawu wyników.

W większości przypadków na testy porównawcze zapytania hybrydowe z semantycznym rankingiem zwracają najbardziej odpowiednie wyniki.

Aby zdefiniować zapytanie hybrydowe, użyj interfejsu API REST 2023-11-01, 2023-10-01-preview, 2024-03-01-preview, Eksplorator wyszukiwania w witrynie Azure Portal lub nowszych wersji zestawów SDK platformy Azure.

Wymagania wstępne

Uruchamianie zapytania hybrydowego w Eksploratorze wyszukiwania

  1. W Eksploratorze wyszukiwania upewnij się, że wersja interfejsu API to 2023-10-01-preview lub nowsza.

  2. W obszarze Widok wybierz pozycję Widok JSON.

  3. Zastąp domyślny szablon zapytania zapytaniem hybrydowym, takim jak to, które rozpoczyna się w wierszu 539 dla przykładu przewodnika Szybki start wektora. W przypadku zwięzłości wektor jest obcięty w tym artykule.

    Zapytanie hybrydowe ma zapytanie tekstowe określone w searchelemecie , a zapytanie wektorowe określone w obszarze vectorQueries.vector.

    Zapytanie tekstowe i zapytanie wektorowe powinny być równoważne lub przynajmniej nie powodować konfliktu. Jeśli zapytania są inne, nie uzyskujesz korzyści z użycia hybrydowego.

    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelId, HotelName, Category, Tags, Description",
        "top": 7,
        "vectorQueries": [
            {
                "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], 
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    
  4. Wybierz Wyszukaj.

Żądanie zapytania hybrydowego (interfejs API REST)

Zapytanie hybrydowe łączy wyszukiwanie tekstu i wyszukiwanie wektorów, w którym search parametr przyjmuje ciąg zapytania i vectorQueries.vector pobiera zapytanie wektorowe. Aparat wyszukiwania uruchamia zapytania pełnotekstowe i wektorowe równolegle. Związek wszystkich dopasowań jest obliczany pod kątem istotności przy użyciu wzajemnego łączenia rangi (RRF), a pojedynczy zestaw wyników jest zwracany w odpowiedzi.

Wyniki są zwracane w postaci zwykłego tekstu, w tym wektory w polach oznaczonych jako retrievable. Ponieważ wektory liczbowe nie są przydatne w wynikach wyszukiwania, wybierz inne pola w indeksie jako serwer proxy dopasowania wektora. Jeśli na przykład indeks zawiera pola "descriptionVector" i "descriptionText", zapytanie może być zgodne z wartością "descriptionVector", ale wynik wyszukiwania może zawierać tekst "descriptionText". Użyj parametru select , aby określić tylko pola czytelne dla człowieka w wynikach.

W poniższym przykładzie przedstawiono konfigurację zapytania hybrydowego.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [{
        "vector": [
            -0.009154141,
            0.018708462,
            . . . 
            -0.02178128,
            -0.00086512347
        ],
        "fields": "DescriptionVector",
        "kind": "vector",
        "exhaustive": true,
        "k": 10
    }],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City",
    "top": "10"
}

Kluczowe punkty:

  • Ciąg zapytania wektorowego vectorQueries.vector jest określany za pomocą właściwości . Zapytanie jest wykonywane względem pola "DescriptionVector". Ustaw kind wartość "vector", aby wskazać typ zapytania. Opcjonalnie ustaw wartość exhaustive true, aby wykonać zapytanie o pełną zawartość pola wektora.

  • Wyszukiwanie słów kluczowych jest określane za pomocą search właściwości. Jest wykonywany równolegle z zapytaniem wektorowym.

  • k Określa, ile dopasowań najbliższych sąsiadów jest zwracanych z zapytania wektorowego i dostarczone do rangi RRF.

  • top Określa, ile dopasowań jest zwracanych w odpowiedzi all-up. W tym przykładzie odpowiedź zawiera 10 wyników, zakładając, że w scalonych wynikach istnieje co najmniej 10 dopasowań.

Wyszukiwanie hybrydowe z filtrem

W tym przykładzie dodano filtr, który jest stosowany do filterable pól niewektorowych indeksu wyszukiwania.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "vectorFilterMode": "postFilter",
    "filter": "ParkingIncluded",
    "top": "10"
}

Kluczowe punkty:

  • Filtry są stosowane do zawartości pól, które można filtrować. W tym przykładzie pole ParkingIncluded jest wartością logiczną i jest oznaczone jako filterable w schemacie indeksu.

  • W zapytaniach hybrydowych filtry można zastosować przed wykonaniem zapytania, aby zmniejszyć powierzchnię zapytań lub po wykonaniu zapytania w celu przycinania wyników. Wartość domyślna to "preFilter". Aby użyć postFiltermetody , ustaw tryb przetwarzania filtru, jak pokazano w tym przykładzie.

  • Po opublikowaniu wyników zapytania liczba wyników może być mniejsza niż wartość top-n.

Zakładając, że włączono klasyfikację semantyczną, a definicja indeksu zawiera konfigurację semantyczną, można sformułować zapytanie obejmujące wyszukiwanie wektorów i wyszukiwanie słów kluczowych z semantycznym rankingiem dla scalonego zestawu wyników. Opcjonalnie możesz dodać podpis i odpowiedzi.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "top": "50"
}

Kluczowe punkty:

  • Ranking semantyczny akceptuje maksymalnie 50 wyników ze scalonej odpowiedzi. Ustaw wartość "k" i "top" na 50, aby uzyskać równą reprezentację obu zapytań.

  • Wymagane są "queryType" i "semanticConfiguration".

  • "podpis" i "odpowiedzi" są opcjonalne. Wartości są wyodrębniane z tekstu dosłownego w wynikach. Odpowiedź jest zwracana tylko wtedy, gdy wyniki zawierają zawartość o cechach odpowiedzi na zapytanie.

Wyszukiwanie hybrydowe semantyczne z filtrem

Oto ostatnie zapytanie w kolekcji. Jest to takie samo semantyczne zapytanie hybrydowe jak w poprzednim przykładzie, ale z filtrem.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "filter": "ParkingIsIncluded'",
    "vectorFilterMode": "postFilter",
    "top": "50"
}

Kluczowe punkty:

  • Tryb filtru może mieć wpływ na liczbę wyników dostępnych dla semantycznego rerankera. Najlepszym rozwiązaniem jest zapewnienie semantycznej rangi maksymalnej liczby dokumentów (50). Jeśli filtry wstępne lub postfiltry są zbyt selektywne, możesz zasłużyć na semantyczny ranger, dając mu mniej niż 50 dokumentów do pracy.

  • Filtrowanie wstępne jest stosowane przed wykonaniem zapytania. Jeśli filtr wstępny zmniejsza obszar wyszukiwania do 100 dokumentów, zapytanie wektorowe wykonuje w polu "DescriptionVector" dla tych 100 dokumentów, zwracając k=50 najlepszych dopasowań. Te 50 pasujących dokumentów następnie przekazują do RRF w celu scalenia wyników, a następnie do semantycznego rankera.

  • Filtr postfiltr jest stosowany po wykonaniu zapytania. Jeśli k=50 zwraca 50 dopasowań po stronie zapytania wektorowego, filtr wykonywany po filtrze jest stosowany do 50 dopasowań, zmniejszając wyniki spełniające kryteria filtrowania, pozostawiając mniej niż 50 dokumentów do przekazania do semantycznego rangą

Konfigurowanie odpowiedzi na zapytanie

Podczas konfigurowania zapytania hybrydowego pomyśl o strukturze odpowiedzi. Odpowiedź jest spłaszczonym zestawem wierszy. Parametry zapytania określają, które pola znajdują się w każdym wierszu i ilu wierszy znajdują się w odpowiedzi. Wyszukiwarka klasyfikuje pasujące dokumenty i zwraca najbardziej odpowiednie wyniki.

Pola w odpowiedzi

Wyniki wyszukiwania składają się z retrievable pól z indeksu wyszukiwania. Wynik jest taki:

  • Wszystkie retrievable pola (wartość domyślna interfejsu API REST).
  • Pola jawnie wymienione w parametrze "select" w zapytaniu.

W przykładach w tym artykule użyto instrukcji "select" w celu określenia pól tekstowych (niewektorów) w odpowiedzi.

Uwaga

Wektory nie są odtwarzane w tekście czytelnym dla człowieka, więc unikaj zwracania ich w odpowiedzi. Zamiast tego wybierz pola niewektorowe, które są reprezentatywne dla dokumentu wyszukiwania. Jeśli na przykład zapytanie jest przeznaczone dla pola "DescriptionVector", zwróć równoważne pole tekstowe, jeśli w odpowiedzi jest jeden ("Opis").

Liczba wyników

Zapytanie może być zgodne z dowolną liczbą dokumentów, tyle ile wszystkich z nich, jeśli kryteria wyszukiwania są słabe (na przykład "search=*" dla zapytania o wartości null). Ponieważ rzadko jest to praktyczne zwracanie niezwiązanych wyników, należy określić maksymalną wartość dla odpowiedzi:

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

Jeśli używasz klasyfikacji semantycznej, najlepszym rozwiązaniem jest ustawienie wartości "k" i "top" na co najmniej 50. Semantyczny rangą może zająć do 50 wyników. Określając 50 dla każdego zapytania, otrzymujesz równą reprezentację z obu podsystemów wyszukiwania.

Rankingi

Dla zapytań hybrydowych tworzonych jest wiele zestawów z opcjonalnym semantycznym ponownego korbowania lub bez tego opcjonalnego. Klasyfikacja wyników jest obliczana przez wzajemne łączenie rangi (RRF).

W tej sekcji porównaj odpowiedzi między wyszukiwaniem pojedynczego wektora i prostym hybrydowym wyszukiwaniem wyników. W tym przypadku są to różne algorytmy klasyfikacji, metryka podobieństwa HNSW i RRF, generują wyniki o różnych wielkościach. Wynika to z ustawienia fabrycznego. Wyniki RRF mogą wydawać się dość niskie, nawet z wysokim dopasowaniem podobieństwa. Niższe wyniki są cechą algorytmu RRF. W zapytaniu hybrydowym z RRF więcej wzajemnych dokumentów sklasyfikowanych jest uwzględnionych w wynikach, biorąc pod uwagę stosunkowo mniejszy wynik sklasyfikowanych dokumentów RRF, w przeciwieństwie do zwykłego wyszukiwania wektorowego.

Wyszukiwanie pojedynczego wektora: @search.score wyniki uporządkowane według podobieństwa cosinus (domyślna funkcja odległości wektorów).

{
    "@search.score": 0.8399121,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Wyszukiwanie hybrydowe: @search.score w przypadku wyników hybrydowych sklasyfikowanych za pomocą wzajemnego łączenia rangi.

{
    "@search.score": 0.032786883413791656,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Następne kroki

W następnym kroku zalecamy przejrzenie kodu demonstracyjnego dla języków Python, C# lub JavaScript.