Sdílet prostřednictvím


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

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

  1. 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.

  2. V části Zobrazení vyberte zobrazení JSON, abyste mohli vložit vektorový dotaz.

  3. 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 searcha vektorový dotaz zadaný v části vectorQueries.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
            }
        ]
    }
    
  4. 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. Nastavte kind na "vector" pro označení typu dotazu. Volitelně můžete nastavit exhaustive 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žít postFilter, 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ů:

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
}

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.

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 k=50 vrátí 50 shod na straně vektorového dotazu, použije se postfiltr na 50 shod, čímž se sníží počet výsledků, které splňují kritéria filtru, a ponecháte méně než 50 dokumentů, které se předávají sémantickému rankeru.

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.

  1. K zadání těchto parametrů použijte funkci Hledat – POST nebo Search – GET v roce 2024-05-01-preview.

  2. 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" na maxTextRecallSizehodnotu .

  3. Zmenšete maxTextRecallSize , pokud hledání vektorové podobnosti obvykle provádí textovou stranu hybridního dotazu.

  4. 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é nastavit topskipa next 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.