由於不同產業的搜尋需求可能不同,且會隨時間變化,因此預設排名行為可能無法滿足所有業務需求。如要解決這個問題,可以使用自訂排序修改排序行為。
本頁說明如何在搜尋要求中使用自訂排序公式,以及如何調整公式。這項功能適用於結構化、非結構化和網站資料。
總覽
自訂排序功能可讓您提供數學運算式,該運算式會依據一組模型計算信號 (例如語意相關分數和關鍵字相似度分數),以及文件信號 (例如距離或文件年齡等自訂欄位)。
透過自訂排名,您可以達成下列目標:
- 提高曝光度:瞭解哪些信號會影響搜尋結果的最終排名。
- 調整現有信號:調整各種信號的權重,例如語意相似度、關鍵字比對或文件新鮮度。
- 納入商業邏輯:直接將文件資料中的自訂信號加入排名公式。
- 有系統地進行最佳化:使用開放原始碼 Python 程式庫,以程式輔助方式找出最佳排名公式。
需要自訂排序的範例
假設在飯店訂房網站上查詢下列字串:
luxury hotel with a large rooftop pool in Vancouver, pet-friendly and close to airport.
假設系統擷取下列項目:
- 飯店 A:「溫哥華頂級豪華飯店,可俯瞰機場。設有令人驚豔的頂樓泳池。請勿攜帶寵物。」
- 飯店 B:「位於溫哥華市中心的時尚現代飯店。寵物友善,客房寬敞。設有大型室內泳池和健身中心。
- 飯店 C:「這間寵物友善的精品飯店充滿魅力,鄰近水族館 (步行 10 分鐘可達市中心)。設有美麗的花園庭院。沒有游泳池。
- 飯店 D:「這間鄉村風格的度假村是當地地標,以精緻餐飲和無可挑剔的服務聞名。設有室內泳池和 SPA 中心。 可應要求提供寵物友善選項。
目錄中的所有飯店都包含以公里 (km) 為單位的 distance_from_airport
欄位。
以嵌入為基礎的排名
搜尋系統會將查詢轉換為單一嵌入項目。然後將這個查詢嵌入與目錄中所有飯店的嵌入進行比較。系統會根據飯店嵌入與查詢嵌入在數值上的接近程度,決定飯店的排名。
以下是純粹根據嵌入式關聯性搜尋得出的可能排名:
排名 | 飯店 | 這項排名的可能原因 |
---|---|---|
1 | 飯店 A | 與「豪華」、「機場」、「頂樓泳池」的語意相符程度極高。「請勿攜帶寵物」並非理想的結果,但其他強烈相符的結果占優勢。 |
2 | 飯店 B | 「寵物友善」和「游泳池」的語意比對結果良好。但「室內」而非「屋頂」、「現代」和「時尚」而非「豪華」,以及「市中心」而非「機場」,都讓 B 的相關性不如 A。 |
3 | 飯店 D | 與寵物友善、大型泳池的語意相符程度高,但「室內」而非「頂樓」,以及「鄉村風」而非「奢華風」,使語意相關性略低於 A 和 D。 |
4 | Hotel C | 寵物友善程度高,但「無泳池」和「精品」會大幅降低與這項特定查詢的關聯性。 |
這項排名無法提供最相關的結果。即使「不允許攜帶寵物」的規定可能不符合許多使用者的需求,A 飯店仍會排在最前面。飯店 D 符合多項條件,但由於「鄉村風」狀態不一定對應到「豪華」,且「室內」泳池的排名低於「大型」和「室外」的完全相符項目,因此排名較低。
自訂排名
假設您已為這個範例情境設定下列排名運算式。如要瞭解這個運算式的元件,請參閱「關於導入自訂排名」。
rankingExpression = rr(semantic_similarity_score, 32) * 0.4 + rr(keyword_similarity_score, 32) * 0.3 + rr(c.distance_from_airport * -1, 32) * 0.8
其中 distance_from_airport
是目錄中可擷取的欄位,而 c.distance_from_airport
則做為信號。
在自訂排序中,您會考量影響文件相關性的不同信號。然後,使用有效語法建立包含這些信號的數學運算式。在這個運算式中,您會將信號正規化,並為衍生分數新增權重。系統會計算最終自訂分數,並對文件進行排名。
在本例中,這項程序可說明如下:
每間飯店都會獲得語意相似度分數和關鍵字相似度分數。此外,與機場的距離也是從文件中擷取的重要信號。
互惠等級轉換函式或
rr()
用於將所有分數轉換為相同比例。系統會為每個信號衍生出的分數加權,然後將所有個別分數加總,得出各飯店的自訂排名分數。
各飯店的不同信號如下表所示:
飯店 | semantic_similarity_score |
keyword_similarity_score |
c.distance_from_airport |
自訂排名分數 | 自訂排名 | 以嵌入為基礎的排名 |
---|---|---|---|---|---|---|
A 飯店 | 9.0 | 6.2 (「機場」、「豪華」、「頂樓泳池」) | 5.0 | 0.04879 | 2 | 1 |
Hotel B | 7.5 | 5.6 ("pet-friendly", "downtown", "indoor pool", "stylish") | 12.5 | 0.04691 | 3 | 2 |
Hotel C | 5.0 | 3.4 (「寵物友善」、「市中心」) | 18 | 0.04525 | 4 | 4 |
Hotel D | 8.0 | 4.5 分 (「室內泳池」、「寵物友善」、「鄉村風」) | 1 | 0.04890 | 1 | 3 |
比較這兩種排名方法,自訂排名會提供更周全的排名,可能比單純根據嵌入內容的排名更符合使用者需求。
導入自訂排序功能簡介
如要在搜尋結果中取得自訂排名,您必須呼叫
search
方法,並提供下列欄位:
排名運算式後端 (
rankingExpressionBackend
):這個欄位會指出要使用下列哪種排名機制。RANK_BY_EMBEDDING
:如果未指定此欄位,系統會使用這個預設值。選擇這個選項後,系統會根據預先定義的排名運算式 (以嵌入或相關性為依據) 排列結果。RANK_BY_FORMULA
:這會覆寫預設排名,並讓您在rankingExpression
欄位中提供自訂公式。
排名運算式 (
rankingExpression
):這個欄位包含決定擷取文件排名的數學公式。如果是
RANK_BY_EMBEDDING
,則是以關聯性分數 (double * relevanceScore
) 或嵌入 (double * dotProduct(embedding_field_path)
) 為依據。對於
RANK_BY_FORMULA
,這是經過精心設計的運算式,會結合多個信號,計算每個搜尋結果的新分數。
標準信號
Vertex AI Search 提供多種信號,可用於制定自訂排名。可用的標準信號如下:
信號名稱 | 說明 |
---|---|
default_rank |
標準 VAIS 排名演算法決定的文件預設排名 |
semantic_similarity_score |
根據查詢和內容嵌入計算的分數,用於判斷搜尋查詢與文件內容的相似程度。這項指標是使用 Google 專屬演算法計算得出。 |
relevance_score |
由深度相關性模型產生的評分,可處理複雜的查詢與文件互動。模型會根據內容情境判斷查詢的意義和意圖。這項指標是使用 Google 專屬演算法計算得出。 |
keyword_similarity_score |
這項分數會著重於關鍵字比對,這項信號會使用 Best Match 25 (BM25) 排序函式。 |
document_age |
文件建立時間長度 (以小時為單位)。支援浮點值。舉例來說,值為 0.5 代表 30 分鐘,值為 50 則代表 2 天 2 小時。 |
pctr_rank |
根據使用者事件資料計算出的預估轉換率排名。這項信號會使用預估點閱率 (pCTR),從使用者的角度評估搜尋結果的關聯性。 |
topicality_rank |
用來表示關鍵字相似度調整項的等級,是使用 Google 專有演算法計算得出。 |
boosting_factor |
您套用至文件的所有自訂加成。 |
除了這些欄位,您也可以使用文件中標示為可擷取的任何自訂欄位。如要這麼做,請在欄位名稱中加入 c.
前置字串。舉例來說,如果自訂欄位名稱為 date_approved
,則可使用 c.date_approved
做為自訂信號。
信號名稱是由英文字母和底線 (_
) 組成。以下是保留名稱清單,不得做為信號名稱:log
、exp
、rr
、is_nan
和 fill_nan
。
排名公式語法
自訂排名公式是數學運算式,包含下列元件:
數字 (
double
):正數或負數的浮點值,可為信號或運算式新增權重。算術運算子:
+
(加法) 和*
(乘法)。數學函式:
log(expression)
:自然對數exp(expression)
:自然指數
每個運算式都只接受一個引數,也就是以信號表示的運算式。
有效函式範例:
exp(c.document_age)
和log(keywordSimilarityScore * 0.2 + 1.0)
。倒數排名轉換函式 (
rr
): 此函式表示為rr(expression, k)
。系統會先依expression
的值遞減排序文件,然後為文件指派排名。然後使用1 / (rank_i + k)
運算式計算最終值;其中rank_i
是從 0 開始的排序清單中,文件的位置,而k
是您提供的正浮點數。rr()
函式會將所有分數轉換為相同比例,因此不需要額外進行正規化。非數字 (NaN) 處理函式:
is_nan(expression)
:如果運算式評估結果為 NaN,例如文件缺少信號時,系統會傳回1
。否則會傳回0
。fill_nan(arg_expression, fill_with_expression)
:如果arg_expression
評估結果為 NaN,則會傳回fill_with_expression
。否則,會傳回arg_expression
。這對於處理可能缺少特定信號的文件至關重要。
排名公式範例
基本線性組合:
semantic_similarity_score * 0.7 + keyword_similarity_score * 0.3
使用倒數排名和 NaN 處理的複雜公式:
rr(fill_nan(semantic_similarity_score, 0), 40) * 0.5 + topicality_rank * 0.5
使用倒數排名、指數函式和 NaN 處理的複雜公式:
rr(fill_nan(semantic_similarity_score, 0), 40) * 0.2 + exp(keyword_similarity_score) * 0.3 + is_nan(keyword_similarity_score) * 0.1
在搜尋結果中,使用排名公式自訂排名
如要自訂搜尋結果中文件的排名,請手動草擬公式,然後將公式加進 search
API 呼叫。
制定排名運算式。
取得搜尋結果。
curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \ -d '{ "servingConfig": "projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search", "query": "QUERY", "rankingExpression": "RANKING_EXPRESSION", "rankingExpressionBackend": "RANK_BY_FORMULA" }'
更改下列內容:
PROJECT_ID
:您的 Google Cloud 專案 ID。APP_ID
:要查詢的 Vertex AI Search 應用程式 ID。QUERY
:要搜尋的查詢文字。RANKING_EXPRESSION
:自訂排序公式,您可以使用可用信號,並採用有效的排序公式語法編寫。- 如需有效範例,請參閱「排名公式範例」。
- 如要調整排名公式,以獲得最佳結果,請參閱「使用 Python 程式庫調整排名公式」。
使用 Python 程式庫調整排名公式
如果是更進階的使用案例,要找出公式的最佳權重可能會有難度。為解決這個問題,您可以使用 Vertex AI Search 的排名調整 Python 程式庫 (開放原始碼工具),找出適合您用途的公式。
一般工作流程如下所示:
- 準備查詢資料集,並加上相應的黃金標籤。這些黃金標籤可以是文件 ID 等專屬識別欄位,可協助您將搜尋回應中的
SearchResult
物件建立關聯。 - 針對一組代表性查詢,呼叫
search
API,取得所有傳回文件的可用排名信號。您可以在「SearchResult.rankSignals
」欄位中找到這項資訊。連同黃金標籤一併儲存這項資料。 使用 Python 程式庫,根據這個資料集訓練排名模型。詳情請參閱「Clearbox Python 程式庫」。
將訓練結果中的公式轉換為排序運算式,然後在 API 呼叫中使用。