Ponowne zapisywanie zapytań za pomocą semantycznego rankera w usłudze Azure AI Search (wersja zapoznawcza)
Uwaga
Ta funkcja jest obecnie w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie jest zalecana w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą być nieobsługiwane lub ograniczone. Aby uzyskać więcej informacji, zobacz Uzupełniające warunki korzystania z wersji zapoznawczych platformy Microsoft Azure.
Ponowne zapisywanie zapytań to proces przekształcania zapytania użytkownika w bardziej skuteczny, dodając więcej terminów i ujmując wyniki wyszukiwania. Usługa wyszukiwania wysyła zapytanie wyszukiwania (lub odmianę) do modelu generowania, który generuje alternatywne zapytania.
Ponowne zapisywanie zapytań poprawia wyniki z klasyfikacji semantycznej przez poprawianie literówek lub błędów pisowni w zapytaniach użytkowników oraz rozszerzanie zapytań o synonimy.
Wyszukiwanie za pomocą ponownego zapisywania zapytań działa następująco:
- Zapytanie użytkownika jest wysyłane za pośrednictwem
search
właściwości w żądaniu. - Usługa wyszukiwania wysyła zapytanie wyszukiwania (lub odmianę) do modelu generowania, który generuje alternatywne zapytania.
- Usługa wyszukiwania używa oryginalnego zapytania i przepisanych zapytań w celu pobrania wyników wyszukiwania.
Ponowne zapisywanie zapytań jest funkcją opcjonalną. Bez ponownego zapisywania zapytań usługa wyszukiwania używa tylko oryginalnego zapytania do pobierania wyników wyszukiwania.
Uwaga
Przepisane zapytania mogą nie zawierać wszystkich dokładnych terminów, które zawierały oryginalne zapytanie. Może to mieć wpływ na wyniki wyszukiwania, jeśli zapytanie było wysoce specyficzne i wymagane dokładne dopasowania unikatowych identyfikatorów lub kodów produktów.
Wymagania wstępne
- Usługa wyszukiwania, warstwa Podstawowa lub nowsza.
Uwaga
Zapisywanie zapytań jest obecnie dostępne w regionach Europa Północna i Azja Południowo-Wschodnia.
- Usługa wyszukiwania musi mieć włączoną semantyczną rangę. Przejrzyj klasyfikację semantyczną, jeśli potrzebujesz wprowadzenia do funkcji.
Ważne
Klasyfikacja semantyczna jest obecnie wymagana do ponownego zapisywania zapytań.
Istniejący indeks wyszukiwania z konfiguracją semantyczną i zawartością tekstu sformatowanego. W przykładach w tym przewodniku użyto przykładowych danych hotels-sample-index w celu zademonstrowania ponownego zapisywania zapytań. Możesz użyć własnych danych i indeksu do testowania ponownego zapisywania zapytań.
Potrzebujesz klienta internetowego obsługującego żądania interfejsu API REST. Przykłady w tym przewodniku zostały przetestowane przy użyciu programu Visual Studio Code z rozszerzeniem klienta REST.
Napiwek
Zawartość zawierająca wyjaśnienia lub definicje najlepiej sprawdza się w przypadku klasyfikacji semantycznej.
Tworzenie żądania wyszukiwania przy użyciu ponownego zapisywania zapytań
W tym przykładzie interfejsu API REST użyjemy funkcji Search Documents do sformułowania żądania. Aby uzyskać więcej informacji na temat właściwości żądania i odpowiedzi, zobacz dokumentację referencyjną interfejsu API.
Wklej następujące żądanie do klienta internetowego jako szablonu.
POST https://[search-service-name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-11-01-preview { "search": "newer hotel near the water with a great restaurant", "semanticConfiguration":"en-semantic-config", "queryType":"semantic", "queryRewrites":"generative|count-5", "queryLanguage":"en-US", "debug":"queryRewrites", "top": 1 }
Zastąp ciąg
search-service-name
nazwą usługi wyszukiwania.Jeśli jest inna, zastąp
hotels-sample-index
ciąg nazwą indeksu.Ustawiliśmy "wyszukiwanie" na zapytanie wyszukiwania pełnotekstowego. Właściwość wyszukiwania jest wymagana do ponownego zapisywania zapytań, chyba że określono zapytania wektorowe. Jeśli określisz zapytania wektorowe, tekst "wyszukaj" musi być zgodny z właściwością
"text"
"vectorQueries"
obiektu. Ciąg wyszukiwania może obsługiwać prostą składnię lub pełną składnię Lucene.Ustawiliśmy "semanticConfiguration" na wstępnie zdefiniowaną konfigurację semantyczną osadzoną w indeksie.
Ustawiliśmy wartość "queryType" na "semantyczną". Musimy ustawić właściwość "queryType" na "semantyczną" lub dołączyć w żądaniu właściwość "semanticQuery". Klasyfikacja semantyczna jest wymagana do ponownego zapisywania zapytań.
Ustawiliśmy wartość "queryRewrites" na wartość "generative|count-5", aby uzyskać maksymalnie pięć ponownych zapisywania zapytań. Liczbę można ustawić na dowolną wartość z zakresu od 1 do 10.
Ponieważ zażądaliśmy ponownego zapisywania zapytań przez ustawienie właściwości "queryRewrites", musimy ustawić wartość "queryLanguage" na język tekstu wyszukiwania. Usługa wyszukiwania używa tego samego języka do ponownego zapisywania zapytań. W tym przykładzie używamy ciągu "en-US". Obsługiwane ustawienia regionalne to:
en-AU
, ,id-ID
fa-AE
ca-ES
cs-CZ
bn-IN
de-DE
da-DK
el-GR
es-ES
es-MX
et-EE
eu-ES
bg-BG
fr-CA
fi-FI
fr-FR
ga-IE
gl-ES
gu-IN
he-IL
ar-SA
hr-BA
hi-IN
hr-HR
hu-HU
hy-AM
is-IS
it-IT
ar-MA
kn-IN
ja-JP
nl-BE
nb-NO
nl-NL
ms-MY
ms-BN
mr-IN
no-NO
ml-IN
lv-LV
lt-LT
pa-IN
ko-KR
ar-KW
pl-PL
ru-RU
ro-RO
sk-SK
pt-PT
sl-SL
sr-BA
en-GB
en-US
sr-ME
en-IN
ar-EG
ar-JO
pt-BR
en-CA
sr-RS
,sv-SE
, ,ta-IN
,th-TH
ur-PK
te-IN
uk-UA
vi-VN
tr-TR
,zh-CN
, .zh-TW
Ustawiliśmy "debugowanie" na "queryRewrites", aby uzyskać ponowne zapisywanie zapytania w odpowiedzi.
Napiwek
Ustawiane
"debug": "queryRewrites"
tylko na potrzeby testowania. Aby uzyskać lepszą wydajność, nie używaj debugowania w środowisku produkcyjnym.Ustawiliśmy wartość "top" na 1, aby zwrócić tylko górny wynik wyszukiwania.
Wyślij żądanie, aby wykonać zapytanie i zwrócić wyniki.
Następnie oceniamy wyniki wyszukiwania przy użyciu ponownie napisanych zapytań.
Ocenianie odpowiedzi
Oto przykład odpowiedzi zawierającej ponowne zapisywanie zapytań:
"@search.debug": {
"semantic": null,
"queryRewrites": {
"text": {
"inputQuery": "newer hotel near the water with a great restaurant",
"rewrites": [
"new waterfront hotels with top-rated eateries",
"new waterfront hotels with top-rated restaurants",
"new waterfront hotels with excellent dining",
"new waterfront hotels with top-rated dining",
"new water-side hotels with top-rated restaurants"
]
},
"vectors": []
}
},
"value": [
{
"@search.score": 58.992092,
"@search.rerankerScore": 2.815633535385132,
"HotelId": "18",
"HotelName": "Ocean Water Resort & Spa",
"Description": "New Luxury Hotel for the vacation of a lifetime. Bay views from every room, location near the pier, rooftop pool, waterfront dining & more.",
"Description_fr": "Nouvel h\u00f4tel de luxe pour des vacances inoubliables. Vue sur la baie depuis chaque chambre, emplacement pr\u00e8s de la jet\u00e9e, piscine sur le toit, restaurant au bord de l'eau et plus encore.",
"Category": "Luxury",
"Tags": [
"view",
"pool",
"restaurant"
],
"ParkingIncluded": true,
"LastRenovationDate": "2020-11-14T00:00:00Z",
"Rating": 4.2,
"Location": {
"type": "Point",
"coordinates": [
-82.537735,
27.943701
],
"crs": {
"type": "name",
"properties": {
"name": "EPSG:4326"
}
}
},
//... more properties redacted for brevity
}
]
Oto kilka kluczowych kwestii, które należy zwrócić uwagę:
- Ponieważ ustawiamy właściwość "debuguj" na "queryRewrites" na potrzeby testowania, odpowiedź zawiera obiekt z zapytaniem
@search.debug
wejściowym tekstowym i ponownym zapisywaniem zapytań. - Ponieważ ustawiliśmy właściwość "queryRewrites" na "generative|count-5", odpowiedź zawiera maksymalnie pięć ponownych zapisywania zapytań.
- Wartość
"inputQuery"
to zapytanie wysyłane do modelu generowania na potrzeby ponownego zapisywania zapytań. Zapytanie wejściowe nie zawsze jest takie samo jak zapytanie użytkownika"search"
.
Oto przykład odpowiedzi bez ponownego zapisywania zapytań.
"@search.debug": {
"semantic": null,
"queryRewrites": {
"text": {
"inputQuery": "",
"rewrites": []
},
"vectors": []
}
},
"value": [
{
"@search.score": 7.774868,
"@search.rerankerScore": 2.815633535385132,
"HotelId": "18",
"HotelName": "Ocean Water Resort & Spa",
"Description": "New Luxury Hotel for the vacation of a lifetime. Bay views from every room, location near the pier, rooftop pool, waterfront dining & more.",
"Description_fr": "Nouvel h\u00f4tel de luxe pour des vacances inoubliables. Vue sur la baie depuis chaque chambre, emplacement pr\u00e8s de la jet\u00e9e, piscine sur le toit, restaurant au bord de l'eau et plus encore.",
"Category": "Luxury",
"Tags": [
"view",
"pool",
"restaurant"
],
"ParkingIncluded": true,
"LastRenovationDate": "2020-11-14T00:00:00Z",
"Rating": 4.2,
"Location": {
"type": "Point",
"coordinates": [
-82.537735,
27.943701
],
"crs": {
"type": "name",
"properties": {
"name": "EPSG:4326"
}
}
},
//... more properties redacted for brevity
}
]
Zapytania wektorowe z ponownym zapisywaniem zapytań
Zapytania wektorowe można uwzględnić w żądaniu wyszukiwania, aby połączyć wyszukiwanie słów kluczowych i wyszukiwanie wektorów w jednym żądaniu i ujednoliconą odpowiedź.
Oto przykład zapytania zawierającego zapytanie wektorowe z ponownym zapisywaniem zapytań. Zmodyfikujemy poprzedni przykład , aby uwzględnić zapytanie wektorowe.
- Do żądania dodamy obiekt "vectorQueries". Ten obiekt zawiera zapytanie wektorowe z "kind" ustawionym na "text".
- Wartość "text" jest taka sama jak wartość "search". Te wartości muszą być identyczne, aby ponowne zapisywanie zapytań działało.
POST https://[search-service-name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-11-01-preview
{
"search": "newer hotel near the water with a great restaurant",
"vectorQueries": [
{
"kind": "text",
"text": "newer hotel near the water with a great restaurant",
"k": 50,
"fields": "Description",
"queryRewrites": "generative|count-3"
}
],
"semanticConfiguration":"en-semantic-config",
"queryType":"semantic",
"queryRewrites":"generative|count-5",
"queryLanguage":"en-US",
"top": 1
}
Odpowiedź zawiera ponowne zapisywanie zapytań zarówno dla zapytania tekstowego, jak i zapytania wektorowego.
Ponowne zapisywanie zapytań testowych przy użyciu debugowania
Należy przetestować ponowne zapisywanie zapytań, aby upewnić się, że działają zgodnie z oczekiwaniami. "debug": "queryRewrites"
Ustaw właściwość w żądaniu zapytania, aby uzyskać ponowne zapisywanie zapytania w odpowiedzi. Ustawienie "debug"
jest opcjonalne do celów testowych. Aby uzyskać lepszą wydajność, nie należy ustawiać tej właściwości w środowisku produkcyjnym.
Przyczyny częściowej odpowiedzi
Możesz zauważyć, że odpowiedź debugowania (testu) zawiera pustą tablicę dla text.rewrites
właściwości i vectors
.
{
"@odata.context": "https://demo-search-svc.search.windows.net/indexes('hotels-sample-index')/$metadata#docs(*)",
"@search.debug": {
"semantic": null,
"queryRewrites": {
"text": {
"rewrites": []
},
"vectors": []
}
},
"@search.semanticPartialResponseReason": "Transient",
"@search.semanticQueryRewriteResultType": "OriginalQueryOnly",
//... more properties redacted for brevity
}
W powyższym przykładzie:
- Odpowiedź zawiera
@search.semanticPartialResponseReason
właściwość z wartością "Przejściowy". Ten komunikat oznacza, że co najmniej jedno z zapytań nie powiodło się. - Odpowiedź zawiera
@search.semanticQueryRewriteResultType
również właściwość z wartością "OriginalQueryOnly". Ten komunikat oznacza, że ponowne zapisywanie zapytań jest niedostępne. Tylko oryginalne zapytanie jest używane do pobierania wyników wyszukiwania.
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ź.