自訂搜尋結果排名

由於不同產業的搜尋需求可能不同,且會隨時間變化,因此預設排名行為可能無法滿足所有業務需求。如要解決這個問題,可以使用自訂排序修改排序行為。

本頁說明如何在搜尋要求中使用自訂排序公式,以及如何調整公式。這項功能適用於結構化、非結構化和網站資料。

總覽

自訂排序功能可讓您提供數學運算式,該運算式會依據一組模型計算信號 (例如語意相關分數和關鍵字相似度分數),以及文件信號 (例如距離或文件年齡等自訂欄位)。

透過自訂排名,您可以達成下列目標:

  • 提高曝光度:瞭解哪些信號會影響搜尋結果的最終排名。
  • 調整現有信號:調整各種信號的權重,例如語意相似度、關鍵字比對或文件新鮮度。
  • 納入商業邏輯:直接將文件資料中的自訂信號加入排名公式。
  • 有系統地進行最佳化:使用開放原始碼 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 則做為信號。

在自訂排序中,您會考量影響文件相關性的不同信號。然後,使用有效語法建立包含這些信號的數學運算式。在這個運算式中,您會將信號正規化,並為衍生分數新增權重。系統會計算最終自訂分數,並對文件進行排名。

在本例中,這項程序可說明如下:

  1. 每間飯店都會獲得語意相似度分數和關鍵字相似度分數。此外,與機場的距離也是從文件中擷取的重要信號。

  2. 互惠等級轉換函式或 rr() 用於將所有分數轉換為相同比例。

  3. 系統會為每個信號衍生出的分數加權,然後將所有個別分數加總,得出各飯店的自訂排名分數。

各飯店的不同信號如下表所示:

飯店 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 做為自訂信號。

信號名稱是由英文字母和底線 (_) 組成。以下是保留名稱清單,不得做為信號名稱:logexprris_nanfill_nan

排名公式語法

自訂排名公式是數學運算式,包含下列元件:

  • 數字 (double):正數或負數的浮點值,可為信號或運算式新增權重。

  • 信號 (signal):列於「可用信號」部分中的信號名稱。

  • 算術運算子+ (加法) 和 * (乘法)。

  • 數學函式

    • 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。這對於處理可能缺少特定信號的文件至關重要。

排名公式範例

  1. 基本線性組合:

    semantic_similarity_score * 0.7 + keyword_similarity_score * 0.3
    
  2. 使用倒數排名和 NaN 處理的複雜公式:

    rr(fill_nan(semantic_similarity_score, 0), 40) * 0.5 + topicality_rank * 0.5
    
  3. 使用倒數排名、指數函式和 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 呼叫。

  1. 制定排名運算式。

  2. 取得搜尋結果。

    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"
    }'
    

    更改下列內容:

使用 Python 程式庫調整排名公式

如果是更進階的使用案例,要找出公式的最佳權重可能會有難度。為解決這個問題,您可以使用 Vertex AI Search 的排名調整 Python 程式庫 (開放原始碼工具),找出適合您用途的公式。

一般工作流程如下所示:

  1. 準備查詢資料集,並加上相應的黃金標籤。這些黃金標籤可以是文件 ID 等專屬識別欄位,可協助您將搜尋回應中的 SearchResult 物件建立關聯。
  2. 針對一組代表性查詢,呼叫 search API,取得所有傳回文件的可用排名信號。您可以在「SearchResult.rankSignals」欄位中找到這項資訊。連同黃金標籤一併儲存這項資料。
  3. 使用 Python 程式庫,根據這個資料集訓練排名模型。詳情請參閱「Clearbox Python 程式庫」。

  4. 將訓練結果中的公式轉換為排序運算式,然後在 API 呼叫中使用。