Vytvoření vektorového dotazu ve službě Azure AI Search
Pokud máte ve službě Azure AI Search vektorový index, tento článek vysvětluje, jak:
Tento článek používá rest pro ilustraci. Ukázky kódu v jiných jazycích najdete v úložišti GitHubu azure-search-vector-samples pro ucelená řešení, která zahrnují vektorové dotazy.
Průzkumníka služby Search můžete použít také na webu Azure Portal, pokud nakonfigurujete vektorizátor, který převádí řetězce na vložené položky.
Požadavky
Azure AI Search, v libovolné oblasti a na libovolné úrovni.
Vektorový index ve službě Azure AI Search
vectorSearch
Zkontrolujte oddíl v indexu a potvrďte vektorový index.Visual Studio Code s klientem REST a ukázkovými daty, pokud chcete tyto příklady spustit sami. Pokud chcete začít s klientem REST, přečtěte si rychlý start: Azure AI Search s využitím REST.
Převod vstupu řetězce dotazu na vektor
Pokud chcete dotazovat vektorové pole, musí být samotný dotaz vektorem.
Jedním z přístupů k převodu textového řetězce dotazu uživatele na jeho vektorové vyjádření je volání vložené knihovny nebo rozhraní API do kódu aplikace. Osvědčeným postupem je vždy použít stejné modely vkládání, které se používají k vygenerování vkládání ve zdrojových dokumentech. Ukázky kódu ukazující , jak vygenerovat vkládání v úložišti azure-search-vector-samples .
Druhým přístupem je použití integrované vektorizace, která je aktuálně ve verzi Public Preview, aby služba Azure AI Search zpracovávala vstupy a výstupy vektorizace dotazů.
Tady je příklad rozhraní REST API řetězce dotazu odeslaného do nasazení modelu vkládání Azure OpenAI:
POST https://{{openai-service-name}}.openai.azure.com/openai/deployments/{{openai-deployment-name}}/embeddings?api-version={{openai-api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
"input": "what azure services support generative AI'"
}
Očekávaná odpověď je 202 pro úspěšné volání nasazeného modelu.
Pole "embedding" v těle odpovědi je vektorové znázornění řetězce dotazu "input". Pro účely testování byste v požadavku dotazu zkopírovali hodnotu pole embedding do vectorQueries.vector pomocí syntaxe uvedené v následujících několika částech.
Skutečná odpověď pro toto volání POST nasazeného modelu zahrnuje 1536 vkládání, oříznuto zde pouze na několik prvních vektorů pro čitelnost.
{
"object": "list",
"data": [
{
"object": "embedding",
"index": 0,
"embedding": [
-0.009171937,
0.018715322,
...
-0.0016804502
]
}
],
"model": "ada",
"usage": {
"prompt_tokens": 7,
"total_tokens": 7
}
}
V tomto přístupu zodpovídá kód aplikace za připojení k modelu, generování vložených objektů a zpracování odpovědi.
Žádost o vektorový dotaz
Tato část ukazuje základní strukturu vektorového dotazu. K formulování vektorového dotazu můžete použít Azure Portal, rozhraní REST API nebo sady Azure SDK. Pokud migrujete z verze 2023-07-01-Preview, dojde k zásadním změnám. Podrobnosti najdete v tématu Upgrade na nejnovější rozhraní REST API .
2023-11-01 je stabilní verze rozhraní REST API pro Search POST. Tato verze podporuje:
vectorQueries
je konstruktor pro vektorové vyhledávání.kind
parametr nastaven navector
hodnotu určuje, že dotaz je vektorové pole.vector
je dotaz (vektorové znázornění textu nebo obrázku).exhaustive
(volitelné) vyvolá vyčerpávající síť KNN v době dotazu, i když je pole indexováno pro HNSW.
V následujícím příkladu je vektor reprezentací tohoto řetězce: "jaké služby Azure podporují fulltextové vyhledávání". Dotaz cílí na contentVector
pole. Dotaz vrátí k
výsledky. Skutečný vektor má 1536 vkládání, takže je v tomto příkladu oříznutý kvůli čitelnosti.
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}}
{
"count": true,
"select": "title, content, category",
"vectorQueries": [
{
"kind": "vector",
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"exhaustive": true,
"fields": "contentVector",
"k": 5
}
]
}
Odpověď vektorových dotazů
Ve službě Azure AI Search se odpovědi na dotazy ve výchozím nastavení skládají ze všech retrievable
polí. Je ale běžné omezit výsledky hledání na podmnožinu retrievable
polí jejich výpisem select
v příkazu.
V vektorovém dotazu pečlivě zvažte, jestli v odpovědi potřebujete vektorová pole. Vektorová pole nejsou čitelná pro člověka, takže pokud odesíláte odpověď na webovou stránku, měli byste zvolit nevectorová pole, která představují výsledek. Pokud se například dotaz provede contentVector
proti, můžete místo toho vrátit content
.
Pokud chcete ve výsledku vektorová pole, tady je příklad struktury odpovědi. contentVector
je pole řetězců vkládání, které je zde oříznuto pro stručnost. Skóre hledání označuje relevanci. Další nevectorová pole jsou zahrnuta pro kontext.
{
"@odata.count": 3,
"value": [
{
"@search.score": 0.80025613,
"title": "Azure Search",
"category": "AI + Machine Learning",
"contentVector": [
-0.0018343845,
0.017952163,
0.0025753193,
...
]
},
{
"@search.score": 0.78856903,
"title": "Azure Application Insights",
"category": "Management + Governance",
"contentVector": [
-0.016821077,
0.0037742127,
0.016136652,
...
]
},
{
"@search.score": 0.78650564,
"title": "Azure Media Services",
"category": "Media",
"contentVector": [
-0.025449317,
0.0038463024,
-0.02488436,
...
]
}
]
}
Klíčové body:
k
určuje, kolik výsledků nejbližšího souseda se vrátí, v tomto případě tři. Vektorové dotazy vždy vracík
výsledky za předpokladu, že existují alespoňk
dokumenty, i když existují dokumenty se špatnou podobností, protože algoritmus najde nejbližšík
sousedy vektoru dotazu.Určuje algoritmus
@search.score
vektorového vyhledávání.Pole ve výsledcích hledání jsou všechna
retrievable
pole nebo pole v klauzuliselect
. Během provádění vektorového dotazu se shoda provádí pouze u vektorových dat. Odpověď však může obsahovat libovolnéretrievable
pole v indexu. Vzhledem k tomu, že neexistuje žádné zařízení pro dekódování výsledku vektorového pole, je zahrnutí nevectorových textových polí užitečné pro jejich lidské čitelné hodnoty.
Vektorový dotaz s filtrem
Požadavek dotazu může obsahovat vektorový dotaz a výraz filtru. Filtry se vztahují na filterable
nevectorová pole, pole řetězce nebo číselné hodnoty a jsou užitečné pro zahrnutí nebo vyloučení vyhledávacích dokumentů na základě kritérií filtru. I když není vektorové pole filtrovatelné, filtry je možné použít u jiných polí ve stejném indexu.
Filtry můžete použít jako kritéria vyloučení před spuštěním dotazu nebo po provedení dotazu a filtrovat výsledky hledání. Porovnání jednotlivých režimů a očekávaného výkonu na základě velikosti indexu najdete v tématu Filtry v vektorových dotazech.
Tip
Pokud nemáte zdrojová pole s textovými nebo číselnými hodnotami, zkontrolujte metadata dokumentu, jako jsou vlastnosti LastModified nebo CreatedBy, které můžou být užitečné ve filtru metadat.
2023-11-01 je stabilní verze tohoto rozhraní API. Má:
vectorFilterMode
pro režimy filtrování předfiltru (výchozí) nebo postfilter.filter
poskytuje kritéria.
V následujícím příkladu je vektor reprezentací tohoto řetězce dotazu: "jaké služby Azure podporují fulltextové vyhledávání". Dotaz cílí na contentVector
pole. Skutečný vektor má 1536 vkládání, takže je v tomto příkladu oříznutý kvůli čitelnosti.
Kritéria filtru se použijí u filtrovatelného textového pole (category
v tomto příkladu) před spuštěním vektorového dotazu vyhledávacím webem.
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}}
{
"count": true,
"select": "title, content, category",
"filter": "category eq 'Databases'",
"vectorFilterMode": "preFilter",
"vectorQueries": [
{
"kind": "vector",
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"exhaustive": true,
"fields": "contentVector",
"k": 5
}
]
}
Více vektorových polí
Vlastnost vectorQueries.fields můžete nastavit na více vektorových polí. Vektorový dotaz se provede pro každé vektorové pole, které zadáte v fields
seznamu. Při dotazování na více vektorových polí se ujistěte, že každý z nich obsahuje vkládání ze stejného modelu vkládání a že se dotaz generuje také ze stejného modelu vkládá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}}
{
"count": true,
"select": "title, content, category",
"vectorQueries": [
{
"kind": "vector",
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"exhaustive": true,
"fields": "contentVector, titleVector",
"k": 5
}
]
}
Více vektorových dotazů
Víceotázové vektorové vyhledávání odesílá více dotazů napříč více vektorovými poli ve vyhledávacím indexu. Běžným příkladem tohoto požadavku dotazu je použití modelů, jako je CLIP pro vícemodální vektorové vyhledávání, kde stejný model může vektorizovat obrazový a textový obsah.
Následující příklad dotazu hledá podobnost v obou myImageVector
a myTextVector
, ale odesílá ve dvou různých vložených dotazů v uvedeném pořadí, přičemž každý provádí paralelně. Tento dotaz vytvoří výsledek, který se vyhodnotí pomocí reciproční Rank Fusion (RRF).
vectorQueries
poskytuje pole vektorových dotazů.vector
obsahuje vektory obrázků a textové vektory v indexu vyhledávání. Každá instance je samostatný dotaz.fields
určuje, které vektorové pole se má cílit.k
je počet nejbližších sousedů, které se mají zahrnout do výsledků.
{
"count": true,
"select": "title, content, category",
"vectorQueries": [
{
"kind": "vector",
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"fields": "myimagevector",
"k": 5
},
{
"kind": "vector"
"vector": [
-0.002222222,
0.018708462,
-0.013770515,
. . .
],
"fields": "mytextvector",
"k": 5
}
]
}
Výsledky hledání by zahrnovaly kombinaci textu a obrázků za předpokladu, že index vyhledávání obsahuje pole pro soubor obrázku (index vyhledávání neukládá obrázky).
Dotaz s využitím integrované vektorizace (Preview)
Tato část ukazuje vektorový dotaz, který vyvolá novou funkci integrované vektorizace preview, která převede textový dotaz na vektor. Použijte rozhraní REST API verze 2023-10-01-Preview a novější rozhraní REST API verze Preview nebo aktualizovaný beta balíček sady Azure SDK.
Předpokladem je index vyhledávání s nakonfigurovaným vektorizátorem a přiřazeným k vektorovým polím. Vektorizátor poskytuje informace o připojení k modelu vkládání použitému v době dotazu. Zkontrolujte definici indexu pro specifikaci vektorizátorů.
Dotazy poskytují textové řetězce místo vektorů:
kind
musí být nastavena natext
hodnotu .text
musí obsahovat textový řetězec. Předá se vektorizačnímu objektu přiřazeného k poli vektoru.fields
je vektorové pole, které se má prohledávat.
Tady je jednoduchý příklad dotazu, který je vektorizovaný v době dotazu. Textový řetězec se vektorizuje a pak se použije k dotazu na pole descriptionVector.
POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2024-05-01-preview
{
"select": "title, genre, description",
"vectorQueries": [
{
"kind": "text",
"text": "mystery novel set in London",
"fields": "descriptionVector",
"k": 5
}
]
}
Tady je hybridní dotaz s využitím integrované vektorizace textových dotazů. Tento dotaz obsahuje více vektorových polí dotazu, více nevectorových polí, filtr a sémantické řazení. Opět, rozdíly jsou kind
vektorový dotaz a text
řetězec místo vector
.
V tomto příkladu vyhledávací modul provádí tři vektorizační volání vektorizátorů přiřazených descriptionVector
k , synopsisVector
a authorBioVector
v indexu. Výsledné vektory se používají k načtení dokumentů do příslušných polí. Vyhledávací web také provede hledání klíčových slov na search
dotaz "tajemný román set v Londýně".
POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2024-05-01-preview
Content-Type: application/json
api-key: {{admin-api-key}}
{
"search":"mystery novel set in London",
"searchFields":"description, synopsis",
"semanticConfiguration":"my-semantic-config",
"queryType":"semantic",
"select": "title, author, synopsis",
"filter": "genre eq 'mystery'",
"vectorFilterMode": "postFilter",
"vectorQueries": [
{
"kind": "text",
"text": "mystery novel set in London",
"fields": "descriptionVector, synopsisVector",
"k": 5
},
{
"kind": "text"
"text": "living english author",
"fields": "authorBioVector",
"k": 5
}
]
}
Výsledek skóre ze všech čtyř dotazů je naplněný hodnocením RRF. Sekundární sémantické řazení je vyvoláno nad sloučenými výsledky hledání, ale pouze na searchFields
zvýšení výsledků, které jsou nejvíce sémanticky sladěny s "search":"mystery novel set in London"
.
Poznámka:
Vektorizátory se používají při indexování a dotazování. Pokud v indexu nepotřebujete blokování a vektorizaci dat, můžete přeskočit kroky, jako je vytvoření indexeru, sady dovedností a zdroje dat. V tomto scénáři se vektorizátor používá pouze v době dotazu k převodu textového řetězce na vložení.
Počet seřazených výsledků v odpovědi vektorového dotazu
Vektorový dotaz určuje k
parametr, který určuje, kolik shod se vrátí ve výsledcích. Vyhledávací web vždy vrátí k
počet shod. Pokud k
je větší než počet dokumentů v indexu, určuje počet dokumentů horní mez toho, co lze vrátit.
Pokud znáte fulltextové vyhledávání, víte, že očekáváte nulové výsledky, pokud index neobsahuje termín nebo frázi. Při vektorovém vyhledávání ale operace hledání identifikuje nejbližší sousedy a vždy vrátí k
výsledky, i když nejbližší sousedé nejsou tak podobné. Proto je možné získat výsledky pro nesmyslné nebo off-topic dotazy, zejména pokud nepoužíváte výzvy k nastavení hranic. Méně relevantní výsledky mají horší skóre podobnosti, ale stále jsou "nejbližšími" vektory, pokud není nic bližšího. Odpověď bez smysluplných výsledků tak může stále vracet k
výsledky, ale skóre podobnosti každého výsledku by bylo nízké.
Tento problém může zmírnit hybridní přístup , který zahrnuje fulltextové vyhledávání. Dalším zmírněním je nastavení minimální prahové hodnoty pro skóre hledání, ale pouze v případě, že je dotaz čistě jedním vektorovým dotazem. Hybridní dotazy nejsou příznivé pro minimální prahové hodnoty, protože rozsahy RRF jsou tak menší a nestálé.
Mezi parametry dotazu ovlivňující počet výsledků patří:
"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í.
Algoritmy řazení používané ve vektorovém dotazu
Hodnocení výsledků se vypočítá buď takto:
- Metrika podobnosti
- Reciproční fúzní pořadí (RRF), pokud existuje více sad výsledků hledání.
Metrika podobnosti
Metrika podobnosti zadaná v části indexu vectorSearch
dotazu jen pro vektor. Platné hodnoty jsou cosine
, euclidean
a dotProduct
.
Modely vkládání Azure OpenAI používají kosinusovou podobnost, takže pokud používáte modely vkládání Azure OpenAI, cosine
je doporučená metrika. Mezi další podporované metriky řazení patří euclidean
a dotProduct
.
Použití RRF
Více sad se vytvoří, pokud dotaz cílí na více vektorových polí, spustí paralelně více vektorových dotazů nebo pokud je dotaz hybridní vektorové a fulltextové vyhledávání s sémantickým řazením nebo bez.
Během provádění dotazu může vektorový dotaz cílit pouze na jeden interní vektorový index. Pro více vektorových polí a více vektorových dotazů proto vyhledávací web generuje více dotazů, které cílí na odpovídající vektorové indexy každého pole. Výstup je sada seřazených výsledků pro každý dotaz, které jsou sloučeny pomocí RRF. Další informace naleznete v tématu Bodování relevance pomocí reciproční Rank Fusion (RRF).
Nastavení prahových hodnot pro vyloučení výsledků s nízkým skóre (Preview)
Vzhledem k tomu, že hledání nejbližšího souseda vždy vrací požadované k
sousedy, je možné v rámci splnění k
požadavku na číslo u výsledků hledání získat více shod s nízkým skóre.
Pomocí rozhraní REST API verze 2024-05-01-preview teď můžete přidat threshold
parametr dotazu, který vyloučí výsledky hledání s nízkým skóre na základě minimálního skóre. Filtrování probíhá před rozdělením výsledků z různých sad úplností.
V tomto příkladu jsou všechny shody, které skóre nižší než 0,8 jsou vyloučeny z výsledků hledání vektorů, i když počet výsledků klesne pod k
.
POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview
Content-Type: application/json
api-key: [admin key]
{
"vectorQueries": [
{
"kind": "vector",
"vector": [1.0, 2.0, 3.0],
"fields": "my-cosine-field",
"threshold": {
"kind": "vectorSimilarity",
"value": 0.8
}
}
]
}
MaxTextSizeRecall pro hybridní vyhledávání (Preview)
Vektorové dotazy se často používají v hybridních konstruktorech, které obsahují nevectorová pole. Pokud zjistíte, že výsledky seřazené podle BM25 jsou ve výsledcích hybridních dotazů vyšší nebo nižší, můžete nastavit maxTextRecallSize
zvýšení nebo snížení výsledků seřazených podle BM25 pro hybridní řazení.
Tuto vlastnost můžete nastavit pouze v hybridních požadavcích, které obsahují komponenty "search" i "vectorQueries".
Další informace naleznete v tématu Set maxTextRecallSize – Vytvoření hybridního dotazu.
Vážené vektory (Preview)
weight
Přidejte parametr dotazu, který určuje relativní váhu každého vektorového dotazu zahrnutého do vyhledávacích operací. Tato hodnota se používá při kombinování výsledků více seznamů řazení vytvořených dvěma nebo více vektorovými dotazy ve stejném požadavku nebo z vektorové části hybridního dotazu.
Výchozí hodnota je 1,0 a hodnota musí být kladné číslo větší než nula.
Váhy se používají při výpočtu skóre sloučeného pořadí jednotlivých dokumentů. Výpočet je násobitelem weight
hodnoty oproti skóre pořadí dokumentu v příslušné sadě výsledků.
Následující příklad je hybridní dotaz se dvěma řetězci vektorového dotazu a jedním textovým řetězcem. Váhy se přiřazují vektorům dotazů. První dotaz je 0,5 nebo polovina váhy, což snižuje jeho důležitost v požadavku. Druhý vektorový dotaz je dvakrát důležitý.
Textové dotazy nemají žádné parametry hmotnosti, ale jejich důležitost můžete zvýšit nebo snížit nastavením 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_first_vector_field",
"k": 10,
"weight": 0.5
},
{
"kind": "vector",
"vector": [4.0, 5.0, 6.0],
"fields": "my_second_vector_field",
"k": 10,
"weight": 2.0
}
],
"search": "hello world"
}
Další kroky
V dalším kroku si projděte příklady kódu vektorového dotazu v Pythonu, C# nebo JavaScriptu.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro