Tworzenie zapytania hybrydowego w usłudze Azure AI Search
Wyszukiwanie hybrydowe łączy tekst (słowo kluczowe) i zapytania wektorowe w jednym żądaniu wyszukiwania. Wszystkie podzapytania w żądaniu 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 ujednoliconego zestawu wyników. W wielu przypadkach na testy porównawcze zapytania hybrydowe z semantycznym rankingiem zwracają najbardziej odpowiednie wyniki.
Z tego artykułu dowiesz się, jak wykonywać następujące działania:
- Konfigurowanie podstawowego żądania
- Formułowanie zapytań hybrydowych przy użyciu większej liczby parametrów i filtrów
- Zwiększanie istotności przy użyciu semantycznego klasyfikacji lub wagi wektorów
- Optymalizowanie zachowań zapytań przez kontrolowanie danych wejściowych tekstu i wektorów
Uwaga
Nowość w wersji 2024-09-01-preview to możliwość określania docelowych filtrów tylko do podzapytania wektorów w żądaniu hybrydowym. Zapewnia to większą precyzję w stosunku do sposobu stosowania filtrów. Aby uzyskać więcej informacji, zobacz określanie wartości docelowych filtrów do podzapytania wektorów w tym artykule.
Wymagania wstępne
Indeks wyszukiwania zawierający
searchable
pola wektora i niewektora. Zalecamy kreator importowania i wektoryzacji danych, aby szybko utworzyć indeks. W przeciwnym razie zobacz Tworzenie indeksu i Dodawanie pól wektorów do indeksu wyszukiwania.(Opcjonalnie) Jeśli chcesz semantycznego rankera, usługa wyszukiwania musi być warstwą Podstawowa lub nowsza z włączonym semantycznym rankerem.
(Opcjonalnie) Jeśli chcesz, aby wbudowana konwersja tekstu na wektor ciągu zapytania, utwórz i przypisz wektory do pól wektorów w indeksie wyszukiwania.
Wybieranie interfejsu API lub narzędzia
Eksplorator wyszukiwania w witrynie Azure Portal (obsługuje zarówno stabilną, jak i zapoznawną składnię wyszukiwania interfejsu API) ma widok JSON, który umożliwia wklejanie żądania hybrydowego.
Stabilna wersja 2024-07-01 lub najnowsza wersja zapoznawcza interfejsu API, jeśli używasz funkcji w wersji zapoznawczej, takich jak maxTextRecallSize i countAndFacetMode(wersja zapoznawcza).
Aby uzyskać czytelność, użyjemy przykładów REST, aby wyjaśnić, jak działają interfejsy API. Do tworzenia zapytań hybrydowych można użyć klienta REST, takiego jak Program Visual Studio Code z rozszerzeniem REST. Aby uzyskać więcej informacji, zobacz Szybki start: wyszukiwanie wektorów przy użyciu interfejsów API REST.
Nowsze pakiety stabilne lub beta zestawów AZURE SDK (zobacz dzienniki zmian obsługi funkcji zestawu SDK).
Konfigurowanie zapytania hybrydowego w Eksploratorze wyszukiwania
W Eksploratorze wyszukiwania upewnij się, że wersja interfejsu API to 2024-07-01 lub nowsza wersja zapoznawcza interfejsu API.
W obszarze Widok wybierz widok JSON, aby można było wkleić zapytanie wektorowe.
Zastąp domyślny szablon zapytania zapytaniem hybrydowym, takim jak przykład "Uruchamianie zapytania hybrydowego", zaczynając od wiersza 539 w przewodniku Szybki start dotyczącym wektora. W przypadku zwięzłości wektor jest obcięty w tym artykule.
Zapytanie hybrydowe ma zapytanie tekstowe określone w
search
pliku i zapytanie wektorowe określone w obszarzevectorQueries.vector
.Zapytanie tekstowe i zapytanie wektorowe mogą być równoważne lub rozbieżne, ale często współużytkują tę samą intencję.
{ "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 } ] }
Wybierz Wyszukaj.
Napiwek
Wyniki wyszukiwania są łatwiejsze do odczytania w przypadku ukrycia wektorów. W obszarze Opcje zapytania włącz opcję Ukryj wartości wektorów w wynikach wyszukiwania.
Żą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=2024-07-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
},
{
"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". Ustawkind
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=2024-07-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ćpostFilter
metody , 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.
Wyszukiwanie hybrydowe z filtrami przeznaczonymi dla podzapytania wektorów (wersja zapoznawcza)
Korzystając z wersji 2024-09-01-preview, można zastąpić filtr globalny żądania wyszukiwania, stosując pomocniczy filtr przeznaczony tylko dla podzapytania wektorów w żądaniu hybrydowym.
Ta funkcja zapewnia szczegółową kontrolę, zapewniając, że filtry wpływają tylko na wyniki wyszukiwania wektorów, pozostawiając wyniki wyszukiwania oparte na słowach kluczowych bez wpływu.
Filtr docelowy w pełni zastępuje filtr globalny, w tym wszelkie filtry używane do przycinania zabezpieczeń lub wyszukiwania geoprzestrzennego. W przypadkach, gdy wymagane są filtry globalne, takie jak przycinanie zabezpieczeń, należy jawnie uwzględnić te filtry zarówno w filtrze najwyższego poziomu, jak i w każdym filtrze na poziomie wektorów, aby zapewnić spójne wymuszanie zabezpieczeń i innych ograniczeń.
Aby zastosować filtry wektorów docelowych:
Użyj najnowszego interfejsu API REST dokumentów wyszukiwania w wersji zapoznawczej lub pakietu beta zestawu Azure SDK, który udostępnia tę funkcję.
Zmodyfikuj żądanie zapytania, dodając nowy
vectorQueries.filterOverride
parametr ustawiony na wyrażenie filtru OData.
Oto przykład zapytania hybrydowego, które dodaje przesłonięcia filtru. Filtr globalny "Ocena gt 3" jest zastępowany w czasie wykonywania przez filtrOvrride.
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview
{
"vectorQueries": [
{
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"fields": "DescriptionVector",
"kind": "vector",
"exhaustive": true,
"filterOverride": "Address/City eq 'Seattle'",
"k": 10
}
],
"search": "historic hotel walk to restaurants and shopping",
"select": "HotelName, Description, Address/City, Rating",
"filter": "Rating gt 3"
"debug": "vector",
"top": 10
}
Wyszukiwanie hybrydowe semantyczne
Zakładając, że włączono semantyczną rangę, 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 dodawać podpisy i odpowiedzi.
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}}
{
"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:
Semantyczny ranger akceptuje maksymalnie 50 wyników ze scalonej odpowiedzi.
Wymagane są "queryType" i "semanticConfiguration".
"podpisy" 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=2024-07-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 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 klasyfikatora semantycznego.
Ustaw parametr maxTextRecallSize i countAndFacetMode (wersja zapoznawcza)
W tej sekcji wyjaśniono, jak dostosować dane wejściowe do zapytania hybrydowego, kontrolując liczbę wyników sklasyfikowanych w modelu klasyfikacji hybrydowej BM25. Kontrolowanie danych wejściowych klasy BM25 zapewnia więcej opcji dostrajania istotności w scenariuszach hybrydowych.
Zalecamy wersję zapoznawczą interfejsu API REST w wersji 2024-05-01-preview.
Napiwek
Inną opcją, którą należy wziąć pod uwagę, jest technika uzupełniającą lub zastępczą, jest ważonie wektorów, co zwiększa znaczenie zapytań wektorowych w żądaniu.
Użyj opcji Wyszukaj — POST lub Search — GET w wersji 2024-05-01-preview, aby określić te parametry.
Dodaj obiekt parametru zapytania, aby ustawić maksymalną
hybridSearch
liczbę dokumentów odwołanych za pomocą wyników klasyfikacji BM25 zapytania hybrydowego. Ma dwie właściwości:maxTextRecallSize
Określa liczbę wyników klasyfikacji BM25 w celu zapewnienia rangi wzajemnej rangi rangi (RRF) rangi używanej w zapytaniach hybrydowych. Wartość domyślna to 1000. Wartość maksymalna to 10 000.countAndFacetMode
raportuje liczbę wyników w rankingu BM25 (i dla aspektów, jeśli ich używasz). Wartość domyślna to wszystkie dokumenty zgodne z zapytaniem. Opcjonalnie możesz określić zakres "count" do .maxTextRecallSize
Zmniejsz,
maxTextRecallSize
jeśli wyszukiwanie podobieństwa wektorów zwykle przewyższa tekst zapytania hybrydowego.Podnieś
maxTextRecallSize
, jeśli masz duży indeks, a wartość domyślna nie przechwytuje wystarczającej liczby wyników. W przypadku większego zestawu wyników sklasyfikowanych BM25 można również ustawićtop
wartości ,skip
inext
w celu pobrania części tych wyników.
W poniższych przykładach REST pokazano dwa przypadki użycia ustawienia maxTextRecallSize
.
Pierwszy przykład zmniejsza maxTextRecallSize
do 100, ograniczając tekst zapytania hybrydowego do zaledwie 100 dokumentów. Ustawia również, countAndFacetMode
aby uwzględnić tylko te wyniki z maxTextRecallSize
.
POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview
{
"vectorQueries": [
{
"kind": "vector",
"vector": [1.0, 2.0, 3.0],
"fields": "my_vector_field",
"k": 10
}
],
"search": "hello world",
"hybridSearch": {
"maxTextRecallSize": 100,
"countAndFacetMode": "countRetrievableResults"
}
}
Drugi przykład zgłasza maxTextRecallSize
się do 5000. Używa również wierzchołka, pomijania i obok ściągnięcia wyników z dużych zestawów wyników. W takim przypadku żądanie ściąga wyniki w rankingu BM25 rozpoczynające się od pozycji 1500 do 2000 jako udziału zapytania tekstowego w zestawie wyników złożonych RRF.
POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview
{
"vectorQueries": [
{
"kind": "vector",
"vector": [1.0, 2.0, 3.0],
"fields": "my_vector_field",
"k": 10
}
],
"search": "hello world",
"top": 500,
"skip": 1500,
"next": 500,
"hybridSearch": {
"maxTextRecallSize": 5000,
"countAndFacetMode": "countRetrievableResults"
}
}
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 praktyczne zwracanie niezwiązanych wyników, należy określić maksymalną wartość dla ogólnej odpowiedzi:
"top": n
wyniki zapytań tylko dla słów kluczowych (bez wektora)"k": n
wyniki dla zapytań tylko wektorów"top": n
wyniki zapytań hybrydowych (z semantyczną lub bez nich), które zawierają 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ą.
Uwaga
Jeśli używasz wyszukiwania hybrydowego w interfejsie API 2024-05-01-preview, możesz kontrolować liczbę wyników z zapytania kluczowego przy użyciu polecenia maxTextRecallSize. Połącz to z ustawieniem "k", aby kontrolować reprezentację z każdego podsystemu wyszukiwania (słowo kluczowe i wektor).
Wyniki klasyfikatora semantycznego
Uwaga
Semantyczny rangą może zająć do 50 wyników.
Jeśli używasz semantycznego rankera w interfejsie API 2024-05-01-preview, najlepszym rozwiązaniem jest ustawienie wartości "k" i "maxTextRecallSize" na sumę co najmniej 50. Następnie można ograniczyć wyniki zwrócone użytkownikowi za pomocą parametru "top".
Jeśli używasz semantycznego klasyfikatora w poprzednich interfejsach API, wykonaj następujące czynności:
- w przypadku wyszukiwania tylko słowa kluczowego (bez wektora) ustaw wartość "top" na 50
- w przypadku wyszukiwania hybrydowego ustaw wartość "k" na 50, aby upewnić się, że semantyczny ranger pobiera co najmniej 50 wyników.
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": "Swirling Currents 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": "Swirling Currents 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.