混合式搜尋是一個單一查詢請求,可同時設定全文與向量查詢。 它運行於一個包含可搜尋純文字內容及生成嵌入的搜尋索引上。 為了查詢目的,混合式搜尋:
- 是一個包含兩者
search和vectors查詢參數的單一查詢請求。 - 並行執行全文搜尋與向量搜尋。
- 使用 互惠排序融合(RRF)方法合併每個查詢的結果。
本文說明混合式搜尋的概念、優點和限制。 最後的連結提供使用說明和後續步驟。 您也可以觀看 嵌入影片 ,了解混合檢索如何促進高品質生成式搜尋應用。
為什麼要使用混合式搜尋?
混合式搜尋結合了向量搜尋和關鍵詞搜尋的優點。 向量搜尋的優點,是尋找在概念上與搜尋查詢相似的資訊,即使反向索引中沒有關鍵詞相符結果也一樣。 關鍵字或全文搜尋的優點是精確度,且可選擇性地進行語意排序,提升初始結果的品質。 某些情境,例如查詢產品代碼、高度專業的術語、日期和姓名,關鍵字搜尋表現較佳,因為它能辨識完全匹配的關鍵字。
對真實世界和基準資料集的基準測試指出,具有語意排名工具的混合式擷取在搜尋相關性方面具有顯著優勢。
下列影片說明混合式擷取如何為您提供最佳的基礎資料,以產生實用的 AI 回應。
混合式搜尋如何運作?
在搜尋索引中,包含嵌入的向量場與文字場和數值場共存。 你可以設計同時執行的混合式查詢。 混合式查詢會利用現有的文字型功能,例如篩選、分面、排序、評分設定檔以及語意排名,同時在單一搜尋要求中對向量執行相似性搜尋。
混合式搜尋結合了全文查詢和向量查詢的結果,這些查詢使用了不同的排名函數,例如用於文本的 BM25,以及用於向量查詢的 Hierarchical Navigable Small World (HNSW) 和全量 K 最近鄰(eKNN)。 RRF 演算法會將結果合併。 查詢回應只會提供一個結果集,並使用 RRF 來對統一結果進行排名。
混合式查詢的結構
混合式搜尋依賴一個包含多種 資料類型的欄位的搜尋索引,包括純文字和數字、地理座標(若需要地理空間搜尋),以及用向量數學方式表示一段文字。 幾乎所有在 Azure AI Search 中的查詢功能都可以透過向量查詢來使用,但不包括純文字的客戶端互動功能,例如自動補全功能和建議功能。
一個代表性的混合查詢可能如下。 為了簡潔起見,向量查詢使用佔位值。
POST https://{{searchServiceName}}.search.windows.net/indexes/hotels-vector-quickstart/docs/search?api-version=2025-09-01
content-type: application/JSON
{
"count": true,
"search": "historic hotel walk to restaurants and shopping",
"select": "HotelId, HotelName, Category, Description, Address/City, Address/StateProvince",
"filter": "geo.distance(Location, geography'POINT(-77.03241 38.90166)') le 300",
"vectorFilterMode": "postFilter",
"facets": [ "Address/StateProvince"],
"vectorQueries": [
{
"kind": "vector",
"vector": [ <array of embeddings> ]
"k": 50,
"fields": "DescriptionVector",
"exhaustive": true,
"oversampling": 20
},
{
"kind": "vector",
"vector": [ <array of embeddings> ]
"k": 50,
"fields": "Description_frVector",
"exhaustive": false,
"oversampling": 10
}
],
"skip": 0,
"top": 10,
"queryType": "semantic",
"queryLanguage": "en-us",
"semanticConfiguration": "my-semantic-config"
}
關鍵點:
-
search指定一個完整的全文搜尋查詢。 -
vectorQueries指定多個向量查詢,這些查詢針對多個向量欄位進行。 若嵌入空間包含多語言內容,向量查詢即可無需語言分析器或翻譯即可找到匹配。 如果你用的是語意排名器,請設k為 50 以最大化輸入。 -
select指定要在結果中回傳哪些欄位,若你要向使用者展示或傳送給大型語言模型(LLM),這些欄位應該是人類可讀的文字欄位。 -
filters可指定地理空間搜尋或其他包含與排除條件,例如是否包含停車位。 此範例中的地理空間查詢會在華盛頓特區的 300 公里半徑內尋找旅館。您可以在查詢處理的開頭或結尾套用篩選。 如果你用的是語意排序器,你可能會想把後過濾當作最後一步,但你應該先測試確認哪種行為最適合你的查詢。 -
facets可用來計算從混合式查詢傳回之結果的 Facet 貯體。 -
queryType=semantic運用語 意排序器,運用機器閱讀理解來呈現更相關的搜尋結果。 語意排名是選擇性的。 如果你沒有使用這個功能,請移除混合查詢的最後三行。
篩選條件和 Facet 會將索引內的資料結構,與用於全文搜索的反向索引和用於向量搜尋的向量索引加以區別。 因此,當篩選和多面向作業執行時,搜尋引擎可以將作業結果套用至回應中的混合式搜尋結果。
請注意查詢中沒有 orderby。 明確排序順序會覆蓋相關性排名的結果,所以如果你想要相似性和 BM25 相關性,就不要在查詢中排序。
查詢的回應可能看起來像以下 JSON。
{
"@odata.count": 3,
"@search.facets": {
"Address/StateProvince": [
{
"count": 1,
"value": "NY"
},
{
"count": 1,
"value": "VA"
}
]
},
"value": [
{
"@search.score": 0.03333333507180214,
"@search.rerankerScore": 2.5229012966156006,
"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",
"StateProvince": "VA"
}
},
{
"@search.score": 0.032522473484277725,
"@search.rerankerScore": 2.111117362976074,
"HotelId": "48",
"HotelName": "Nordick's Valley Motel",
"Description": "Only 90 miles (about 2 hours) from the nation's capital and nearby most everything the historic valley has to offer. Hiking? Wine Tasting? Exploring the caverns? It's all nearby and we have specially priced packages to help make our B&B your home base for fun while visiting the valley.",
"Category": "Boutique",
"Address": {
"City": "Washington D.C.",
"StateProvince": null
}
}
]
}