Vytvoření hybridního dotazu ve službě Azure AI Search
Hybridní vyhledávání kombinuje text (klíčové slovo) a vektorové dotazy v jediné žádosti o vyhledávání. Všechny poddotazy v požadavku se provádějí paralelně. Výsledky se sloučí a přeuspořádají podle nových skóre hledání pomocí reciproční Rank Fusion (RRF) k vrácení sjednocené sady výsledků. V mnoha případech vrátí hybridní dotazy s sémantickým řazením nejrelevavantnější výsledky na testy srovnávacích testů.
V tomto článku se dozvíte, jak:
- Nastavení základního požadavku
- Formulace hybridních dotazů s více parametry a filtry
- Zlepšení relevance pomocí sémantického řazení nebo vektorových vah
- Optimalizace chování dotazů pomocí řízení vstupů textu a vektorů
Poznámka:
Novinkou v roce 2024-09-01-preview je možnost cílit filtry jenom na poddotazy vektorů v hybridním požadavku. Díky tomu můžete přesněji zjistit, jak se filtry použijí. Další informace najdete v tématu Cílení filtrů na poddotazy vektoru v tomto článku.
Požadavky
Index vyhledávání obsahující
searchable
vektorová a nevectorová pole. K rychlému vytvoření indexu doporučujeme průvodce importem a vektorizací dat. V opačném případě viz Vytvoření indexu a Přidání vektorových polí do indexu vyhledávání.(Volitelné) Pokud chcete sémantický ranker, musí být vaše vyhledávací služba úroveň Basic nebo vyšší s povoleným sémantickým rankerem.
(Volitelné) Pokud chcete předdefinovaný převod textu na vektor řetězce dotazu, vytvořte a přiřaďte vektorizátor vektorizačním polím v indexu vyhledávání.
Volba rozhraní API nebo nástroje
Průzkumník služby Search na webu Azure Portal (podporuje stabilní i náhled syntaxe vyhledávání rozhraní API) má zobrazení JSON, které umožňuje vložit hybridní požadavek.
2024-07-01 stabilní verze nebo nejnovější verze rozhraní API ve verzi Preview, pokud používáte funkce preview, jako je maxTextRecallSize a countAndFacetMode(Preview).
Pro čitelnost používáme příklady REST, abychom vysvětlili, jak rozhraní API fungují. K vytváření hybridních dotazů můžete použít klienta REST, jako je Visual Studio Code s rozšířením REST. Další informace najdete v tématu Rychlý start: Vektorové vyhledávání pomocí rozhraní REST API.
Novější stabilní nebo beta balíčky sad SDK Azure (viz protokoly změn podpory funkcí sady SDK).
Nastavení hybridního dotazu v Průzkumníku služby Search
V Průzkumníku služby Search se ujistěte, že verze rozhraní API je 2024-07-01 nebo novější verze rozhraní API ve verzi Preview.
V části Zobrazení vyberte zobrazení JSON, abyste mohli vložit vektorový dotaz.
Nahraďte výchozí šablonu dotazu hybridním dotazem, například příkladem "Spustit hybridní dotaz", který začíná na řádku 539 v rychlém startu vektoru. Pro stručnost je vektor zkrácený v tomto článku.
Hybridní dotaz má textový dotaz zadaný v
search
a vektorový dotaz zadaný v částivectorQueries.vector
.Textový dotaz a vektorový dotaz můžou být ekvivalentní nebo divergentní, ale je běžné, že sdílejí stejný záměr.
{ "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 } ] }
Vyberte Hledat.
Tip
Výsledky hledání se snadněji čtou, pokud vektory skryjete. V možnostech dotazu zapněte možnost Skrýt vektorové hodnoty ve výsledcích hledání.
Žádost o hybridní dotaz (REST API)
Hybridní dotaz kombinuje vyhledávání textu a vektorové vyhledávání, kde search
parametr přebírá řetězec dotazu a vectorQueries.vector
přebírá vektorový dotaz. Vyhledávací web spouští paralelně fulltextové a vektorové dotazy. Sjednocení všech shod se vyhodnocuje z hlediska relevance pomocí reciproční rank fusion (RRF) a v odpovědi se vrátí jedna sada výsledků.
Výsledky se vrátí ve formátu prostého textu, včetně vektorů v polích označených jako retrievable
. Vzhledem k tomu, že číselné vektory nejsou ve výsledcích hledání užitečné, zvolte jiná pole v indexu jako proxy pro shodu vektoru. Pokud má například index pole descriptionVector a descriptionText, dotaz se může shodovat s "descriptionVector", ale výsledek hledání může zobrazit "descriptionText". Pomocí parametru select
můžete ve výsledcích zadat pouze pole čitelná pro člověka.
Následující příklad ukazuje konfiguraci hybridního dotazu.
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
}
Klíčové body:
Řetězec vektorového
vectorQueries.vector
dotazu je určen prostřednictvím vlastnosti. Dotaz se spustí v poli DescriptionVector. Nastavtekind
na "vector" pro označení typu dotazu. Volitelně můžete nastavitexhaustive
hodnotu true pro dotazování na úplný obsah vektorového pole.Hledání klíčových slov je zadáno prostřednictvím
search
vlastnosti. Provede se paralelně s vektorovým dotazem.k
určuje, kolik nejbližších shod sousedů se vrátí z vektorového dotazu a poskytne ho rankeru RRF.top
určuje, kolik shod se vrátí v odpovědi all-up. V tomto příkladu odpověď obsahuje 10 výsledků za předpokladu, že ve sloučených výsledcích je alespoň 10 shod.
Hybridní vyhledávání s filtrem
Tento příklad přidá filtr, který se použije u filterable
polí nevectoru indexu vyhledávání.
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"
}
Klíčové body:
Filtry se použijí na obsah filtrovatelných polí. V tomto příkladu je pole ParkingIncluded logická hodnota a je označená jako
filterable
ve schématu indexu.V hybridních dotazech je možné filtry použít před provedením dotazu, aby se snížila plocha dotazu nebo po provedení dotazu, aby se výsledky ořízly.
"preFilter"
je výchozí možnost. Pokud chcete použítpostFilter
, nastavte režim zpracování filtru, jak je znázorněno v tomto příkladu.Při postfiltrování výsledků dotazu může být počet výsledků menší než prvních n.
Hybridní vyhledávání s filtry, které cílí na poddotazové vektory (Preview)
Pomocí verze 2024-09-01-preview můžete přepsat globální filtr žádosti o vyhledávání použitím sekundárního filtru, který cílí pouze na poddotazy vektoru v hybridním požadavku.
Tato funkce poskytuje jemně odstupňované řízení tím, že zajišťuje, aby filtry ovlivnily pouze výsledky vektorového hledání, takže výsledky hledání založené na klíčových slovech nejsou ovlivněné.
Cílový filtr plně přepíše globální filtr, včetně všech filtrů používaných pro oříznutí zabezpečení nebo geoprostorové vyhledávání. V případech, kdy jsou vyžadovány globální filtry, například oříznutí zabezpečení, musíte tyto filtry explicitně zahrnout do filtru nejvyšší úrovně i do každého filtru na úrovni vektorů, aby se zajistilo konzistentní vynucování zabezpečení a dalších omezení.
Použití cílových filtrů vektorů:
Použijte nejnovější verzi preview rozhraní REST API služby Search Documents nebo beta balíček sady Azure SDK, který tuto funkci poskytuje.
Upravte požadavek dotazu a přidejte do výrazu filtru OData novou
vectorQueries.filterOverride
sadu parametrů.
Tady je příklad hybridního dotazu, který přidá přepsání filtru. Globální filtr "Rating gt 3" je nahrazen za běhu 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
}
Sémantické hybridní vyhledávání
Za předpokladu, že jste povolili sémantický ranker a definice indexu obsahuje sémantickou konfiguraci, můžete formulovat dotaz, který obsahuje vektorové vyhledávání a vyhledávání klíčových slov, sémantické řazení nad sloučenou sadou výsledků. Volitelně můžete přidat titulky a odpovědi.
Kdykoli použijete sémantické řazení s vektory, ujistěte se, že k
je nastavená hodnota 50. Sémantický ranker používá jako vstup až 50 shod. Určení méně než 50 zbaví sémantických modelů řazení nezbytných vstupů.
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"
}
Klíčové body:
Sémantický ranker přijímá až 50 výsledků z sloučené odpovědi.
Vyžaduje se "queryType" a "sémanticConfiguration".
"titulky" a "odpovědi" jsou volitelné. Hodnoty se ve výsledcích extrahují z doslovného textu. Odpověď se vrátí pouze v případě, že výsledky obsahují obsah, který má charakteristiky odpovědi na dotaz.
Sémantické hybridní vyhledávání s využitím filtru
Tady je poslední dotaz v kolekci. Jedná se o stejný sémantický hybridní dotaz jako v předchozím příkladu, ale s 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"
}
Klíčové body:
Režim filtru může ovlivnit počet výsledků dostupných pro sémantickou reranker. Osvědčeným postupem je dát sémantickému rankeru maximální počet dokumentů (50). Pokud jsou prefiltery nebo postfiltery příliš selektivní, možná si zarezervujete sémantický ranker tím, že mu poskytnete méně než 50 dokumentů, se kterými můžete pracovat.
Před spuštěním dotazu se použije před filtrováním. Pokud prefilter zmenšuje vyhledávací oblast na 100 dokumentů, provede vektorový dotaz u těchto 100 dokumentů pole PopisVector a vrátí nejlepší shody k=50. Tyto 50 odpovídajících dokumentů pak předají RRF pro sloučené výsledky a pak do sémantického rankeru.
Postfilter se použije po spuštění dotazu. Pokud výsledek k=50 vrátí 50 shod na straně vektorového dotazu následovaný následným filtrem použitým na 50 shod, sníží se výsledky počtem dokumentů, které splňují kritéria filtru. Díky tomu budete mít méně než 50 dokumentů, které se předávají sémantickému rankeru. Mějte na paměti, pokud používáte sémantické hodnocení. Sémantický ranker funguje nejlépe, pokud má jako vstup 50 dokumentů.
Nastavení maxTextRecallSize a countAndFacetMode (Preview)
Tato část vysvětluje, jak upravit vstupy do hybridního dotazu tím, že řídí množství výsledků seřazených podle BM25, které proudí do modelu hybridního řazení. Řízení nad vstupem seřazeným podle BM25 nabízí více možností pro ladění relevance v hybridních scénářích.
Doporučujeme rozhraní REST API verze Preview 2024-05-01-preview.
Tip
Další možností, jak zvážit, je doplňková nebo náhradní technika, je vektorová váha, která zvyšuje důležitost vektorových dotazů v požadavku.
K zadání těchto parametrů použijte funkci Hledat – POST nebo Search – GET v roce 2024-05-01-preview.
Přidejte objekt parametru
hybridSearch
dotazu pro nastavení maximálního počtu dokumentů, které byly staženy prostřednictvím výsledků hybridního dotazu seřazených podle BM25. Má dvě vlastnosti:maxTextRecallSize
určuje počet výsledků seřazených BM25, které se mají poskytnout rankeru reciproční fúzi pořadí (RRF), který se používá v hybridních dotazech. Výchozí hodnota je 1 000. Maximum je 10 000.countAndFacetMode
hlásí počty výsledků seřazených podle BM25 (a omezující vlastnosti, pokud je používáte). Výchozí hodnota je všechny dokumenty, které odpovídají dotazu. Volitelně můžete nastavit rozsah "count" namaxTextRecallSize
hodnotu .
Zmenšete
maxTextRecallSize
, pokud hledání vektorové podobnosti obvykle provádí textovou stranu hybridního dotazu.Zvýšit
maxTextRecallSize
, pokud máte velký index a výchozí hodnota nezachytí dostatečný počet výsledků. Pokud máte větší sadu výsledků seřazenou podle BM25, můžete také nastavittop
skip
anext
načíst části těchto výsledků.
Následující příklady REST ukazují dva případy použití pro nastavení maxTextRecallSize
.
První příklad se zmenšuje maxTextRecallSize
na 100 a omezuje text na straně hybridního dotazu jenom na 100 dokumentů. Nastaví se také countAndFacetMode
tak, aby zahrnoval pouze ty výsledky 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"
}
}
Druhý příklad zvýší maxTextRecallSize
na 5 000. Používá také horní, přeskočovací a další k načtení výsledků z velkých sad výsledků. V tomto případě žádost o přijetí změn v seřazených výsledcích BM25 začíná na pozici 1 500 až 2 000 jako příspěvek textového dotazu do složené sady výsledků 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"
}
}
Konfigurace odpovědi dotazu
Při nastavování hybridního dotazu se zamyslete nad strukturou odpovědí. Odpověď je zploštěná sada řádků. Parametry dotazu určují, která pole jsou v každém řádku a kolik řádků je v odpovědi. Vyhledávací web řadí odpovídající dokumenty a vrací nejrelevavantnější výsledky.
Pole v odpovědi
Výsledky hledání se skládají z retrievable
polí z indexu vyhledávání. Výsledek je jeden z těchto:
- Všechna
retrievable
pole (výchozí rozhraní REST API). - Pole jsou explicitně uvedena v parametru "select" v dotazu.
Příklady v tomto článku použily příkaz "select" k určení textových polí (nonvector) v odpovědi.
Poznámka:
Vektory nejsou zpětně analyzovat do čitelného textu člověka, takže je v odpovědi nevracejte. Místo toho zvolte nevectorová pole, která jsou reprezentativní pro hledaný dokument. Pokud například dotaz cílí na pole PopisVector, vrátí ekvivalentní textové pole, pokud máte v odpovědi jedno pole ("Popis").
Počet výsledků
Dotaz se může shodovat s libovolným počtem dokumentů, tolik jako všechny, pokud jsou vyhledávací kritéria slabá (například "search=*" pro dotaz s hodnotou null). Vzhledem k tomu, že vrácení nevázaných výsledků je velmi praktické, měli byste pro celkovou odpověď zadat maximum:
"top": n
výsledky pro dotazy pouze s klíčovými slovy (bez vektoru)"k": n
výsledky pro dotazy pouze s vektory"top": n
výsledky pro hybridní dotazy (s sémantickou nebo bez nich), které obsahují parametr "search".
"k" i "top" jsou volitelné. Není zadáno, výchozí počet výsledků v odpovědi je 50. Můžete nastavit "horní" a "přeskočit" na stránku prostřednictvím dalších výsledků nebo změnit výchozí.
Poznámka:
Pokud používáte hybridní vyhledávání v rozhraní API verze 2024-05-01-preview, můžete řídit počet výsledků z dotazu klíčových slov pomocí maxTextRecallSize. Zkombinujte ho s nastavením "k" pro řízení reprezentace z každého vyhledávacího subsystému (klíčové slovo a vektor).
Sémantické výsledky rankeru
Poznámka:
Sémantický ranker může trvat až 50 výsledků.
Pokud používáte sémantický ranker v rozhraní API verze 2024-05-01-Preview, je osvědčeným postupem nastavit "k" a "maxTextRecallSize" na součet alespoň na 50. Výsledky vrácené uživateli pak můžete omezit pomocí parametru "top".
Pokud používáte sémantický ranker v předchozích rozhraních API, postupujte takto:
- Pokud vyhledávání jen pro klíčové slovo (bez vektoru) nastaví "top" na 50
- pokud se při hybridním vyhledávání nastaví "k" na 50, aby se zajistilo, že sémantický ranker získá alespoň 50 výsledků.
Hodnocení
Pro hybridní dotazy se vytvoří více sad s volitelným sémantickým pořadím nebo bez. Hodnocení výsledků se počítá podle reciproční Rank Fusion (RRF).
V této části porovnejte odpovědi mezi vyhledáváním s jedním vektorem a jednoduchým hybridním vyhledáváním pro nejlepší výsledek. Různé algoritmy řazení, metrika podobnosti HNSW a RRF jsou v tomto případě výsledkem skóre s různými velikostmi. Toto chování je záměrné. Skóre RRF se může objevit poměrně nízká, i když se shodou s vysokou podobností. Nižší skóre jsou charakteristickým prvkem algoritmu RRF. V hybridním dotazu s RRF se do výsledků zahrne více recipročních dokumentů seřazených dokumentů vzhledem k relativně menšímu skóre seřazených dokumentů RRF na rozdíl od čistě vektorového vyhledávání.
Jednoduché hledání vektorů: @search.score výsledky seřazené podle kosinus podobnosti (výchozí funkce vzdálenosti vektoru).
{
"@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"
}
}
Hybridní hledání: @search.score Hybridní výsledky seřazené pomocí reciproční Rank Fusion.
{
"@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"
}
}
Další kroky
Jako další krok doporučujeme projít si ukázkový kód pro Python, C# nebo JavaScript.