在 Azure AI 搜尋中建立混合式查詢

混合式搜尋 會在單一搜尋要求中結合一或多個關鍵詞查詢與一或多個向量查詢。 查詢會以平行方式執行。 結果會由新的搜尋分數合併並重新排序,使用 倒數排名融合 (RRF) 傳回單一排名結果集。

在大部分情況下,根據基準檢驗具有語意排名的混合式查詢會傳回最相關的結果。

若要定義混合式查詢,請使用 REST API 2023-11-01、2023-10-01-preview、2024-03-01-previewAzure 入口網站 中的搜尋總管或較新版本的 Azure SDK。

必要條件

在搜尋總管中執行混合式查詢

  1. [搜尋總管] 中,確定 API 版本為 2023-10-01-preview 或更新版本。

  2. 在 [檢視] 底下,選取 [JSON 檢視]。

  3. 將預設查詢範本取代為混合式查詢,例如從第 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
            }
        ]
    }
    
  4. 選取搜尋

混合式查詢要求 (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"
    }
}

下一步

做為下一個步驟,建議您檢閱 PythonC#JavaScript 的示範程式碼。