Dodawanie semantycznego rankingu do zapytań w usłudze Azure AI Search
Artykuł
Klasyfikację semantyczną można zastosować do zapytań tekstowych, zapytań hybrydowych i zapytań wektorowych, jeśli dokumenty wyszukiwania zawierają pola ciągów, a zapytanie wektorowe zawiera reprezentację tekstową w dokumencie wyszukiwania.
W tym artykule wyjaśniono, jak wywołać semantyczny rangator zapytań. Założono, że używasz najnowszych stabilnych lub zapoznawczych interfejsów API. Aby uzyskać pomoc dotyczącą starszych wersji, zobacz Migrowanie semantycznego kodu klasyfikacji.
Wymagania wstępne
Usługa wyszukiwania, warstwa Podstawowa lub nowsza z włączonym semantycznym rankerem.
Przejrzyj klasyfikację semantyczną, jeśli potrzebujesz wprowadzenia do funkcji.
Uwaga
Transkrypty i odpowiedzi są wyodrębniane z tekstu w dokumencie wyszukiwania. Podsystem semantyczny używa zrozumienia odczytu maszynowego do rozpoznawania zawartości o cechach podpisu lub odpowiedzi, ale nie komponuje nowych zdań ani fraz. Z tego powodu zawartość zawierająca wyjaśnienia lub definicje najlepiej sprawdza się w przypadku klasyfikacji semantycznej. Jeśli chcesz użyć interakcji w stylu czatu z wygenerowanymi odpowiedziami, zobacz Pobieranie rozszerzonej generacji (RAG).
Wybieranie klienta
Aby utworzyć zapytanie korzystające z klasyfikacji semantycznej, można użyć dowolnego z następujących narzędzi i zestawów SDK:
Witryna Azure Portal, korzystając z projektanta indeksów, aby dodać konfigurację semantyczną.
Kilka możliwości zapytań pomija ocenianie istotności, co sprawia, że są one niezgodne z klasyfikacją semantyczną. Jeśli logika zapytań zawiera następujące funkcje, nie można semantycznie sklasyfikować wyników:
Zapytanie z search=* pustym ciągiem wyszukiwania, takim jak czyste zapytanie tylko do filtrowania, nie będzie działać, ponieważ nie ma nic do mierzenia istotności semantycznej względem i dlatego wyniki wyszukiwania są zerowe. Zapytanie musi podać terminy lub frazy, które można ocenić podczas przetwarzania.
Sortowanie (klauzule orderBy) dla określonych pól zastępuje wyniki wyszukiwania i wynik semantyczny. Biorąc pod uwagę, że semantyczny wynik ma dostarczyć klasyfikację, dodanie klauzuli orderby powoduje błąd HTTP 400, jeśli zastosujesz semantyczny ranking dla uporządkowanych wyników.
Konfigurowanie zapytania
Domyślnie zapytania nie używają klasyfikacji semantycznej. Aby użyć klasyfikacji semantycznej, można użyć dwóch różnych parametrów. Każdy parametr obsługuje inny zestaw scenariuszy.
Zapytania semantyczne, niezależnie od tego, czy są określone za pomocą search znaku plus queryType, czy za pośrednictwem semanticQuery, muszą mieć zwykły tekst i nie mogą być puste. Puste zapytania nie powodują zastosowania klasyfikacji semantycznej do wyników.
1queryType=semantic nie może obsługiwać jawnych simple lub full wartości, ponieważ queryType parametr jest używany dla elementu semantic. Skuteczne zachowania zapytań są wartościami domyślnymi prostego analizatora.
2 Parametr semanticQuery może być używany dla wszystkich typów zapytań. Jednak nie jest on obsługiwany w Eksploratorze wyszukiwania w witrynie Azure Portal.
Niezależnie od wybranego parametru indeks powinien zawierać pola tekstowe z zawartością semantyczną sformatowaną i konfiguracją semantyczną.
Otwórz indeks wyszukiwania i wybierz pozycję Eksplorator wyszukiwania.
Wybierz pozycję Opcje zapytania. Jeśli konfiguracja semantyczna została już zdefiniowana, jest ona domyślnie wybrana. Jeśli go nie masz, utwórz konfigurację semantyczną dla indeksu.
Wprowadź zapytanie, takie jak "zabytkowy hotel z dobrym jedzeniem", a następnie wybierz pozycję Wyszukaj.
Alternatywnie wybierz widok JSON i wklej definicje do edytora zapytań. Witryna Azure Portal nie obsługuje używania polecenia semanticQuery, dlatego wymagane jest ustawienie queryType"semantic" :
Przykładowy kod JSON służący do ustawiania typu zapytania na semantyczny, który można wkleić do widoku:
{
"search": "funky or interesting hotel with good food on site",
"count": true,
"queryType": "semantic",
"semanticConfiguration": "my-semantic-config",
"captions": "extractive|highlight-true",
"answers": "extractive|count-3",
"highlightPreTag": "<strong>",
"highlightPostTag": "</strong>",
"select": "HotelId,HotelName,Description,Category"
}
Odpowiedź zawiera @search.rerankerScore automatycznie. Jeśli chcesz uzyskać podpisy lub odpowiedzi w odpowiedzi, włącz semantyczny ranking, ustawiając queryTypesemantic lub ustawiając semanticQuery podpisy i odpowiedzi na żądanie.
W poniższych przykładach w tej sekcji użyto indeksu hotels-sample-index , aby zademonstrować semantyczny ranking z semantycznymi odpowiedziami i podpisami.
Użyj parametru queryType=semantic
Jeśli chcesz ustawić wartość queryTypesemanticna , wklej następujące żądanie do klienta internetowego jako szablon. Zastąp search-service-name ciąg nazwą usługi wyszukiwania i zastąp ciąg hotels-sample-index , jeśli masz inną nazwę indeksu.
POST https://[search-service-name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
"search": "interesting hotel with restaurant on site and cozy lobby or shared area",
"count": true,
"queryType": "semantic",
"semanticConfiguration": "semantic-config",
"captions": "extractive|highlight-true",
"answers": "extractive|count-3",
"highlightPreTag": "<strong>",
"highlightPostTag": "</strong>",
"select": "HotelId,HotelName,Description,Category"
}
Ustaw wartość opcji queryType na semantic.
Ustaw search na proste zapytanie w postaci zwykłego tekstu. Ponieważ parametr queryType jest ustawiony na semanticwartość , prosta składnia lub pełna składnia Lucene nie są obsługiwane.
* Podanie lub pustego ciągu powoduje, że do zapytania nie zastosowano klasyfikacji semantycznej.
Ustaw semanticConfiguration na wstępnie zdefiniowaną konfigurację semantyczną osadzoną w indeksie.
Ustaw answers wartość , aby określić, czy w wyniku znajdują się odpowiedzi semantyczne. Obecnie jedyną prawidłową wartością tego parametru jest extractive. Odpowiedzi można skonfigurować tak, aby zwracały maksymalnie 10. Wartość domyślna to jeden. W tym przykładzie przedstawiono liczbę trzech odpowiedzi: extractive|count-3.
Odpowiedzi nie są gwarantowane na każde żądanie. Aby uzyskać odpowiedź, zapytanie musi wyglądać jak pytanie, a zawartość musi zawierać tekst, który wygląda jak odpowiedź.
Ustaw captions wartość , aby określić, czy podpisy semantyczne są uwzględniane w wyniku. Obecnie jedyną prawidłową wartością tego parametru jest extractive. Podpisy można skonfigurować tak, aby zwracały wyniki z wyróżnionymi wyróżnieniami lub bez. Wartością domyślną jest zwracanie wyróżnień. W tym przykładzie zwracane są podpisy bez wyróżniania: extractive|highlight-false.
Podstawą podpisów i odpowiedzi są pola, do których odwołuje się "semanticConfiguration". Te pola są objęte łącznym limitem w zakresie 2000 tokenów lub około 20 000 znaków. Jeśli przewidujesz, że liczba tokenów przekracza ten limit, rozważ krok fragmentowania danych przy użyciu umiejętności dzielenia tekstu. To podejście wprowadza zależność od potoku wzbogacania sztucznej inteligencji i indeksatorów.
Ustaw highlightPreTag i highlightPostTag , jeśli chcesz zastąpić domyślne formatowanie wyróżnienia, które jest stosowane do podpisów.
Podpisy stosują formatowanie wyróżnienia w kluczowych fragmentach dokumentu, które podsumowują odpowiedź. Wartość domyślna to <em>. Jeśli chcesz określić typ formatowania (na przykład żółte tło), możesz ustawić element highlightPreTag i highlightPostTag.
Ustaw opcję wybierz , aby określić, które pola są zwracane w odpowiedzi, i "count", aby zwrócić liczbę dopasowań w indeksie. Te parametry zwiększają jakość żądania i czytelność odpowiedzi.
Wyślij żądanie, aby wykonać zapytanie i zwrócić wyniki.
Korzystanie z semantykiQuery
Za pomocą polecenia semanticQuerymożna jawnie zastosować prostą składnię tekstu lub składnię pełnotekstu, co oznacza, że można teraz wykonywać wyszukiwanie w polu, zwiększanie terminów i wyszukiwanie w pobliżu. Można również określić czystą kwerendę wektorową zamiast tylko hybrydowej.
Dostosuj żądanie do następującego kodu JSON, aby użyć polecenia semanticQuery.
POST https://[search-service-name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
"search": "Description:breakfast",
"semanticQuery": "interesting hotel with restaurant on site and cozy lobby or shared area",
"count": true,
"queryType": "full",
"semanticConfiguration": "semantic-config",
"captions": "extractive|highlight-true",
"answers": "extractive|count-3",
"highlightPreTag": "<strong>",
"highlightPostTag": "</strong>",
"select": "HotelId,HotelName,Description,Category"
}
Ustaw queryType na używaną składnię wyszukiwania — prostą lub pełną.
Ustaw semanticQuery na proste zapytanie w postaci zwykłego tekstu, którego chcesz użyć do klasyfikacji semantycznej. Puste zapytania nie są obsługiwane. Unikaj operatorów lub jakiejkolwiek składni zapytania wewnątrz samego ciągu.
Użyj metody QueryType lub SemanticQuery, aby wywołać semantyczny rangą w zapytaniu semantycznym. Poniższy przykład pochodzi z zespołu zestawu Azure SDK.
SearchResults<Hotel> response = await searchClient.SearchAsync<Hotel>(
"interesting hotel with restaurant on site and cozy lobby or shared area",
new SearchOptions
{
SemanticSearch = new()
{
SemanticConfigurationName = "my-semantic-config",
QueryCaption = new(QueryCaptionType.Extractive),
QueryAnswer = new(QueryAnswerType.Extractive)
},
QueryType = SearchQueryType.Semantic
});
int count = 0;
Console.WriteLine($"Semantic Search Results:");
Console.WriteLine($"\nQuery Answer:");
foreach (QueryAnswerResult result in response.SemanticSearch.Answers)
{
Console.WriteLine($"Answer Highlights: {result.Highlights}");
Console.WriteLine($"Answer Text: {result.Text}");
}
await foreach (SearchResult<Hotel> result in response.GetResultsAsync())
{
count++;
Hotel doc = result.Document;
Console.WriteLine($"{doc.HotelId}: {doc.HotelName}");
if (result.SemanticSearch.Captions != null)
{
var caption = result.SemanticSearch.Captions.FirstOrDefault();
if (caption.Highlights != null && caption.Highlights != "")
{
Console.WriteLine($"Caption Highlights: {caption.Highlights}");
}
else
{
Console.WriteLine($"Caption Text: {caption.Text}");
}
}
}
Console.WriteLine($"Total number of search results:{count}");
Aby użyć semanticQuery zamiast ustawienia queryType na semantic, fragment kodu wyszukiwania można zastąpić następującym fragmentem kodu:
SearchResults<Hotel> response = await searchClient.SearchAsync<Hotel>(
"Luxury hotel",
new SearchOptions
{
SemanticSearch = new()
{
SemanticConfigurationName = "my-semantic-config",
QueryCaption = new(QueryCaptionType.Extractive),
QueryAnswer = new(QueryAnswerType.Extractive),
SemanticQuery = "Is there any hotel located on the main commercial artery of the city in the heart of New York?"
}
});
Ocenianie odpowiedzi
Tylko 50 pierwszych dopasowań z początkowych wyników może być semantycznie sklasyfikowanych. Podobnie jak w przypadku wszystkich zapytań odpowiedź składa się ze wszystkich pól oznaczonych jako możliwe do pobrania lub tylko tych pól wymienionych w parametrze select . Odpowiedź zawiera oryginalny wynik istotności i może również zawierać liczbę lub wyniki wsadowe, w zależności od sposobu sformułowania żądania.
W klasyfikacji semantycznej odpowiedź ma więcej elementów: nowy semantycznie sklasyfikowany wynik istotności, opcjonalny podpis w postaci zwykłego tekstu i z wyróżnieniami oraz opcjonalna odpowiedź. Jeśli wyniki nie zawierają tych dodatkowych elementów, zapytanie może zostać nieprawidłowo skonfigurowane. W pierwszym kroku rozwiązywania problemu sprawdź konfigurację semantyczną, aby upewnić się, że jest ona określona zarówno w definicji indeksu, jak i zapytaniu.
W aplikacji klienckiej można utworzyć strukturę strony wyszukiwania, aby dołączyć podpis jako opis dopasowania, a nie całą zawartość określonego pola. Takie podejście jest przydatne, gdy poszczególne pola są zbyt gęste dla strony wyników wyszukiwania.
Odpowiedź na powyższe przykładowe zapytanie ("ciekawy hotel z restauracją na miejscu i przytulny lobby lub wspólny obszar") zwraca trzy odpowiedzi ("answers": "extractive|count-e"). Zwracane są podpisy, ponieważ właściwość "captions" jest ustawiona z tekstem zwykłym i wyróżnionymi wersjami. Jeśli nie można określić odpowiedzi, zostanie pominięta w odpowiedzi. W przypadku zwięzłości w tym przykładzie przedstawiono tylko trzy odpowiedzi i trzy najwyższe wyniki oceniania z zapytania.
{
"@odata.count": 29,
"@search.answers": [
{
"key": "24",
"text": "Chic hotel near the city. High-rise hotel in downtown, within walking distance to theaters, art galleries, restaurants and shops. Visit Seattle Art Museum by day, and then head over to Benaroya Hall to catch the evening's concert performance.",
"highlights": "Chic hotel near the city. <strong>High-rise hotel in downtown, </strong>within<strong> walking distance to </strong>theaters, art<strong> galleries, restaurants and shops.</strong> Visit Seattle Art Museum by day, and then head over to Benaroya Hall to catch the evening's concert performance.",
"score": 0.9340000152587891
},
{
"key": "40",
"text": "Only 8 miles from Downtown. On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, All non-smoking hotel. Only 15 miles from airport.",
"highlights": "Only 8 miles from Downtown. <strong>On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, </strong>All non-smoking<strong> hotel.</strong> Only 15 miles from airport.",
"score": 0.9210000038146973
},
{
"key": "38",
"text": "Nature is Home on the beach. Explore the shore by day, and then come home to our shared living space to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
"highlights": "Nature is Home on the beach. Explore the shore by day, and then come home to our<strong> shared living space </strong>to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
"score": 0.9200000166893005
}
],
"value": [
{
"@search.score": 3.2328331,
"@search.rerankerScore": 2.575303316116333,
"@search.captions": [
{
"text": "The best of old town hospitality combined with views of the river and cool breezes off the prairie. Our penthouse suites offer views for miles and the rooftop plaza is open to all guests from sunset to 10 p.m. Enjoy a complimentary continental breakfast in the lobby, and free Wi-Fi throughout the hotel.",
"highlights": "The best of old town hospitality combined with views of the river and cool breezes off the prairie. Our<strong> penthouse </strong>suites offer views for miles and the rooftop<strong> plaza </strong>is open to all guests from sunset to 10 p.m. Enjoy a<strong> complimentary continental breakfast in the lobby, </strong>and free Wi-Fi<strong> throughout </strong>the hotel."
}
],
"HotelId": "50",
"HotelName": "Head Wind Resort",
"Description": "The best of old town hospitality combined with views of the river and cool breezes off the prairie. Our penthouse suites offer views for miles and the rooftop plaza is open to all guests from sunset to 10 p.m. Enjoy a complimentary continental breakfast in the lobby, and free Wi-Fi throughout the hotel.",
"Category": "Suite"
},
{
"@search.score": 0.632956,
"@search.rerankerScore": 2.5425150394439697,
"@search.captions": [
{
"text": "Every stay starts with a warm cookie. Amenities like the Counting Sheep sleep experience, our Wake-up glorious breakfast buffet and spacious workout facilities await.",
"highlights": "Every stay starts with a warm cookie. Amenities like the<strong> Counting Sheep sleep experience, </strong>our<strong> Wake-up glorious breakfast buffet and spacious workout facilities </strong>await."
}
],
"HotelId": "34",
"HotelName": "Lakefront Captain Inn",
"Description": "Every stay starts with a warm cookie. Amenities like the Counting Sheep sleep experience, our Wake-up glorious breakfast buffet and spacious workout facilities await.",
"Category": "Budget"
},
{
"@search.score": 3.7076726,
"@search.rerankerScore": 2.4554927349090576,
"@search.captions": [
{
"text": "Chic hotel near the city. High-rise hotel in downtown, within walking distance to theaters, art galleries, restaurants and shops. Visit Seattle Art Museum by day, and then head over to Benaroya Hall to catch the evening's concert performance.",
"highlights": "Chic hotel near the city. <strong>High-rise hotel in downtown, </strong>within<strong> walking distance to </strong>theaters, art<strong> galleries, restaurants and shops.</strong> Visit Seattle Art Museum by day, and then head over to Benaroya Hall to catch the evening's concert performance."
}
],
"HotelId": "24",
"HotelName": "Uptown Chic Hotel",
"Description": "Chic hotel near the city. High-rise hotel in downtown, within walking distance to theaters, art galleries, restaurants and shops. Visit Seattle Art Museum by day, and then head over to Benaroya Hall to catch the evening's concert performance.",
"Category": "Suite"
},
. . .
]
}
Oczekiwane obciążenia
W przypadku klasyfikacji semantycznej należy oczekiwać, że usługa wyszukiwania będzie obsługiwać maksymalnie 10 współbieżnych zapytań na replikę.
Usługa ogranicza semantyczne żądania klasyfikacji, jeśli woluminy są zbyt wysokie. Komunikat o błędzie zawierający te frazy wskazuje, że usługa znajduje się w pojemności na potrzeby klasyfikacji semantycznej:
Error in search query: Operation returned an invalid status 'Partial Content'`
@search.semanticPartialResponseReason`
CapacityOverloaded
Jeśli przewidujesz spójne wymagania dotyczące przepływności w pobliżu, na poziomie lub wyższym niż na tym poziomie, utwórz bilet pomocy technicznej, abyśmy mogli aprowizować obciążenie.
Następne kroki
Klasyfikacja semantyczna może być używana w zapytaniach hybrydowych, które łączą wyszukiwanie słów kluczowych i wyszukiwanie wektorów w jednym żądaniu i ujednoliconą odpowiedź.