Vytvoření hybridního dotazu ve službě Azure AI Search

Hybridní vyhledávání kombinuje jeden nebo více dotazů klíčových slov s jedním nebo více vektorovými dotazy v jednom požadavku hledání. Dotazy se provádějí paralelně. Výsledky se sloučí a přeuspořádají podle nových skóre hledání pomocí reciproční fúzní rank fusion (RRF) a vrátí jednu seřazenou sadu výsledků.

Ve většině případů vrátí hybridní dotazy s sémantické řazení nejrelevavantnější výsledky na testy srovnávacích testů.

Pokud chcete definovat hybridní dotaz, použijte rozhraní REST API 2023-11-01, 2023-10-01-preview, 2024-03-01-preview, Průzkumník služby Search na webu Azure Portal nebo novější verze sad SDK Azure.

Požadavky

Spuštění 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 2023-10-01-preview nebo novější.

  2. V části Zobrazení vyberte zobrazení JSON.

  3. Nahraďte výchozí šablonu dotazu hybridním dotazem, například šablonou začínající na řádku 539 pro příklad rychlého 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 by měly být ekvivalentní nebo alespoň nekonfliktu. Pokud se dotazy liší, nezískute výhodu hybridního nasazení.

    {
        "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.

Žá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=2023-11-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
    }],
    "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=2023-11-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.

Za předpokladu, že jste povolili sémantické řazení a definice indexu obsahuje sémantickou konfiguraci, můžete formulovat dotaz, který zahrnuje vyhledávání vektorů a vyhledávání klíčových slov, sémantické řazení nad sloučenou sadou výsledků. Volitelně můžete přidat popis a odpovědi.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-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é hodnocení přijímá až 50 výsledků z sloučené odpovědi. U obou dotazů nastavte "k" a "top" na 50.

  • Vyžaduje se "queryType" a "sémanticConfiguration".

  • "popis" 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=2023-11-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ů splňujících kritéria filtru a nechá vás méně než 50 dokumentů, které se předávají sémantickému rankeru.

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 odpověď zadat maximum:

  • "k": n výsledky pro dotazy pouze s vektory
  • "top": n výsledky pro hybridní dotazy, 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í.

Pokud používáte sémantické hodnocení, je osvědčeným postupem nastavit "k" i "top" alespoň na 50. Sémantický ranker může trvat až 50 výsledků. Zadáním hodnoty 50 pro každý dotaz získáte stejnou reprezentaci z obou vyhledávacích subsystémů.

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": "Old Carrabelle 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": "Old Carrabelle 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.