在 Azure AI 搜尋中建立混合式查詢
混合式搜尋 會在單一搜尋要求中結合一或多個關鍵詞查詢與一或多個向量查詢。 查詢會以平行方式執行。 結果會由新的搜尋分數合併並重新排序,使用 倒數排名融合 (RRF) 傳回單一排名結果集。
在大部分情況下,根據基準檢驗,具有語意排名的混合式查詢會傳回最相關的結果。
若要定義混合式查詢,請使用 REST API 2023-11-01、2023-10-01-preview、2024-03-01-preview、Azure 入口網站 中的搜尋總管或較新版本的 Azure SDK。
必要條件
包含向量和非向量欄位的搜尋索引
searchable
。 請參閱 建立索引 和 將向量字段新增至搜尋索引。(選擇性)如果您想要查詢字串的文字到向量轉換(目前為預覽版), 請建立向量化工具,並將向量欄位 指派給搜尋索引中的向量字段。
在搜尋總管中執行混合式查詢
在 [搜尋總管] 中,確定 API 版本為 2023-10-01-preview 或更新版本。
在 [檢視] 底下,選取 [JSON 檢視]。
將預設查詢範本取代為混合式查詢,例如從第 539 行開始的 向量快速入門範例。 為了簡潔起見,本文會截斷向量。
混合式查詢在 中
search
指定文字查詢,以及在 下vectorQueries.vector
指定的向量查詢。文字查詢和向量查詢應該相等或至少不衝突。 如果查詢不同,您就不會獲得混合式的優點。
{ "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 } ] }
選取搜尋。
混合式查詢要求 (REST API)
混合式查詢結合了文字搜尋和向量搜尋,其中 search
參數會採用查詢字串,並 vectorQueries.vector
採用向量查詢。 搜尋引擎會以平行方式執行全文檢索和向量查詢。 所有相符項目的聯集會使用倒數排名融合 (RRF) 評估相關性,並在響應中傳回單一結果集。
結果會以純文本傳回,包括標示為 retrievable
的欄位中的向量。 因為數值向量不適用於搜尋結果,所以請選擇索引中的其他欄位做為向量比對的 Proxy。 例如,如果索引具有 "descriptionVector" 和 "descriptionText" 欄位,查詢可以比對 "descriptionVector",但搜尋結果可以顯示 "descriptionText"。 使用 select
參數,只指定結果中人類可讀取的欄位。
下列範例顯示混合式查詢組態。
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"
}
重點︰
向量查詢字串是透過
vectorQueries.vector
屬性來指定。 查詢會針對 [DescriptionVector] 字段執行。 設定kind
為 「vector」 表示查詢類型。 或者,將 設定exhaustive
為 true 以查詢向量欄位的完整內容。關鍵詞搜尋是透過
search
屬性來指定。 它會與向量查詢平行執行。k
會決定從向量查詢傳回的近鄰相符項目數目,並提供給 RRF 排名器。top
會決定回應全部傳回的相符項目數目。 在此範例中,回應包含10個結果,假設合併的結果中至少有10個相符專案。
混合式搜尋與篩選
此範例會新增篩選,其會套用至 filterable
搜尋索引的非vector 字段。
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"
}
重點︰
篩選會套用至可篩選欄位的內容。 在這裡範例中,ParkingIncluded 欄位是布林值,且在索引架構中標示為
filterable
。在混合式查詢中,篩選可以在查詢執行之前套用,以減少查詢介面,或在查詢執行之後套用以修剪結果。
"preFilter"
是預設值。 若要使用postFilter
,請設定 篩選處理模式 ,如此範例所示。當您在篩選后查詢結果時,結果數目可能小於 top-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": 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"
}
重點︰
語意排名可接受來自合併回應的最多50個結果。 將 「k」 和 「top」 設定為 50,以表示這兩個查詢。
需要 「queryType」 和 “semanticConfiguration”。
「標題」和「答案」是選擇性的。 值會從結果中的逐字文字擷取。 只有在結果包含具有查詢答案特性的內容時,才會傳回答案。
使用篩選的語意混合式搜尋
以下是集合中的最後一個查詢。 它是與上一個範例相同的語意混合式查詢,但具有篩選條件。
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"
}
重點︰
篩選模式可能會影響語意重新執行程式可用的結果數目。 最佳做法是,為語意排名器提供檔數目上限(50)。 如果預先篩選或後置篩選過於選擇性,您可能會藉由提供少於 50 份文件來處理來保留語意排名器。
預先篩選會在查詢執行之前套用。 如果預先篩選會將搜尋區域縮減為 100 份檔,向量查詢會針對這 100 個檔執行 “DescriptionVector” 字段,並傳回 k=50 最佳相符專案。 這 50 個相符的文件接著會傳遞至 RRF 以取得合併的結果,然後傳遞至語意排名器。
後續篩選會在查詢執行之後套用。 如果 k=50 傳回向量查詢端的 50 個相符專案,則篩選後會套用至 50 個相符專案,減少符合篩選準則的結果,讓您擁有少於 50 份檔以傳遞至語意排名器
設定查詢回應
當您設定混合式查詢時,請考慮響應結構。 回應是扁平化資料列集。 查詢上的參數會決定每個資料列中有哪些欄位,以及回應中有多少個資料列。 搜尋引擎會對相符的文件進行排名,並傳回最相關的結果。
回應中的欄位
搜尋結果是由搜尋索引中的欄位所組成 retrievable
。 結果為:
- 所有
retrievable
欄位(REST API 預設值)。 - 在查詢的 "select" 參數中明確列出的欄位。
本文中的範例使用了 "select" 陳述式來指定回應中的文字 (非向量化) 欄位。
注意
向量不會反向工程成人類可讀取的文字,因此請避免在響應中傳回它們。 請改為選擇代表搜尋檔的非函式欄位。 例如,如果查詢以 「DescriptionVector」 欄位為目標,則如果您在回應中有一個 (“Description”) ,則傳回對等的文字欄位。
結果數
如果搜尋準則薄弱,查詢可能會與任意數目的檔相符(例如 null 查詢的 “search=*” )。 因為傳回未系結的結果很少實用,所以您應該為回應指定最大值:
- 僅限向量查詢的
"k": n
結果 - 混合式查詢的
"top": n
結果,而這些查詢包含 "search" 參數
"k" 和 "top" 都是選用的。 未指定,回應中的預設結果數目為 50。 您可以設定 "top" 和 "skip",逐頁檢視更多的結果或變更預設值。
如果您使用語意排名,最佳做法是將 “k” 和 “top” 設定為至少 50。 語意排名器最多可能需要50個結果。 藉由為每個查詢指定 50 個,您會從這兩個搜尋子系統取得相等的表示法。
排名
系統會針對混合式查詢建立多個集合,且不需要選擇性 的語意重新製作。 結果的排名是由倒數排名融合 (RRF) 計算。
在本節中,比較單一向量搜尋與最上層結果的簡單混合式搜尋之間的回應。 不同排名演算法 HNSW 的相似度計量和 RRF 就是這種情況,會產生不同大小的分數。 這是依照設計的行為。 RRF 分數看起來相當低,即使有很高的相似度比對。 較低的分數是 RRF 演算法的特性。 在與 RRF 的混合式查詢中,由於 RRF 排名檔的分數相對較小,而不是純向量搜尋,因此在結果中會包含更多排名檔的相互比較。
單一向量搜尋: @search.score 針對依餘弦相似性排序的結果(預設向量相似度距離函數)。
{
"@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"
}
}
混合式搜尋: @search.score 針對使用倒數排名融合排名的混合式結果。
{
"@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"
}
}
下一步
做為下一個步驟,建議您檢閱 Python、C# 或 JavaScript 的示範程式碼。