新增評分設定檔以提高搜尋分數

評分設定檔可讓您根據準則提升比對文件的排名。 在本文中,了解如何指定及指派評分設定檔,以根據您提供的參數來提升搜尋分數。

您可以使用評分設定檔進行關鍵字搜尋向量搜尋混合式搜尋。 不過,評分設定檔僅適用於非函式欄位,因此請確定您的索引具有可用於評分設定檔中的文字或數值欄位。 向量和混合式搜尋的評分設定檔支援可在 2024-05-01-preview 和 2024-07-01 REST API 以及以這些版本為目標的 Azure SDK 套件中取得。

評分設定檔的要點

評分設定檔參數為:

  • 加權欄位,其中會在特定字串欄位中找到相符項目。 例如,您可能想要在 [摘要] 欄位中找到的相符項目比在 [內容] 欄位中找到的同一相符項目更有相關性。

  • 數值資料的函式,包括日期、範圍和地理座標。 另外還有一個 Tags 函式,可在提供任意字串集合的欄位上運作。 如果您要根據標籤欄位中是否找到相符項目來提升分數,則可以透過加權欄位選擇此方法。

您可以建立多個設定檔,然後修改查詢邏輯以選擇要使用哪一個設定檔。

一個索引內最多可以有 100 個評分設定檔 (請參閱服務限制 (英文)),但在任何特定查詢中,一次只能指定一個設定檔。

注意

不熟悉相關性概念嗎? 請造訪 Azure AI 搜尋服務中的相關性和評分 (英文),以取得背景資訊。 您也可以在 YouTube 上觀看這段影片 (英文),以取得 BM25 排名結果的評分設定檔。

評分設定檔定義

評分設定檔是在索引結構描述中定義的具名物件。 評分設定檔是由加權欄位、函式和參數組成。

下列定義顯示名為 "geo" 的簡單設定檔。 此範例會提升 hotelName 欄位中有搜尋字詞的結果。 也會使用 distance 函式,優先列出與目前位置相距 10 公里以內的結果。 如果有人搜尋 'inn' 一詞,而 'inn' 剛好是飯店名稱的一部分,則文件中只要包含具有 'inn'、且位於目前所在位置半徑 10 公里範圍內的飯店,就會出現在搜尋結果中的較高位置。

"scoringProfiles": [
  {  
    "name":"geo",
    "text": {  
      "weights": {  
        "hotelName": 5
      }                              
    },
    "functions": [
      {  
        "type": "distance",
        "boost": 5,
        "fieldName": "location",
        "interpolation": "logarithmic",
        "distance": {
          "referencePointParameter": "currentLocation",
          "boostingDistance": 10
        }                        
      }                                      
    ]                     
  }            
]

若要使用此評分設定檔,系統會編寫您的查詢,以在要求中指定 scoringProfile 參數。 如果您使用 REST API,則會透過 GET 和 POST 要求來指定查詢。 在下列範例中,"currentLocation" 具有單一破折號的分隔符號 (-)。 其後面接著經度和緯度座標,其中經度是負值。

GET /indexes/hotels/docs?search+inn&scoringProfile=geo&scoringParameter=currentLocation--122.123,44.77233&api-version=2024-07-01

請注意使用 POST 時的語法差異。 在 POST 中,「scoringParameters」是複數且為陣列。

POST /indexes/hotels/docs&api-version=2024-07-01
{
    "search": "inn",
    "scoringProfile": "geo",
    "scoringParameters": ["currentLocation--122.123,44.77233"]
}

此查詢會搜尋「inn」一詞,並傳入目前的位置。 請注意這個查詢包括其他參數,例如 scoringParameter。 如需包括「scoringParameter」在內的查詢參數說明,請參閱搜尋文件 (REST API)

如需更多案例,請參閱向量和混合式搜尋的延伸範例 (英文) 和關鍵字搜尋的延伸範例 (英文)。

評分設定檔會提升符合設定檔準則的相符項目分數,藉此補充預設評分演算法。 評分函式適用於關鍵字搜尋、單純向量查詢,以及混合式查詢。

當您在 Azure AI 搜尋服務中使用評分設定檔或任何其他提升功能時,倒數次序函數 (RRF) 演算法會指派分數,包括獨立文字和向量查詢。 RRF 之後,所有評分/提升、語意排名向量加權調整都會發生。

顯示哪些欄位具有評分設定檔,以及何時進行排名的圖表。

提示

您可以使用 featuresMode (預覽版) 參數,透過搜尋結果要求額外的評分詳細資料 (包括欄位層級分數)。

將評分設定檔新增至搜尋索引

  1. 索引定義開始。 您可以在現有的索引上新增和更新評分設定檔,而不需要重建。 使用建立或更新索引要求來發佈修訂。

  2. 在本文提供的範本中貼上。

  3. 提供遵守命名慣例的名稱。

  4. 指定提升條件。 單一設定檔可以包含文字加權欄位和/或函式

您應該反覆運作,使用資料集協助您證明或反駁設定檔的效力。

評分設定檔可以在 Azure 入口網站中定義,如下列螢幕擷取畫面所示,或是透過 REST API 或在 Azure SDK 中以程式設計方式定義,例如 Azure SDK for .NET 中的 ScoringProfile 類別。

新增評分設定檔頁面

使用文字加權欄位

當欄位內容很重要且查詢包含 searchable 字串欄位時,請使用文字加權欄位。 例如,如果查詢包含「airport」一詞,您可能希望「airport」在 [描述] 欄位中比在 HotelName 中的權數還多。

加權欄位是由 searchable 欄位與做為乘數的正數組成的名稱/值對。 如果 HotelName 的原始欄位分數為 3,該欄位的提升分數會變成 6,因而讓父文件本身的整體分數提高。

"scoringProfiles": [  
    {  
      "name": "boostSearchTerms",  
      "text": {  
        "weights": {  
          "HotelName": 2,  
          "Description": 5 
        }  
      }  
    }
]

使用函式

當簡單相對權數不足或不適用時,請使用函式,如同距離和時效性的情況,需對數值資料進行計算。 您可以為每個評分設定檔指定多個函式。 如需 Azure AI 搜尋服務中所用 EDM 資料類型的詳細資訊,請參閱支援的資料類型

函式 描述 使用案例
distance 依鄰近性或地理位置提升。 此函數僅適用於 Edm.GeographyPoint 欄位。 用於「尋找我附近」案例。
時效性 依日期時間欄位 (Edm.DateTimeOffset) 中的值提升。 設定 boostingDuration 以指定值,代表發生提升的時間範圍。 請在您要依較新或較舊的日期來提升時使用。 對未來日期行事曆事件這類項目進行排名,因此,越接近目前日期的項目排名會高於未來日期較遠的項目。 範圍的一端固定為目前時間。 若要提升過去的某個時間範圍,請使用正數的 boostingDuration。 若要提升未來的某個時間範圍,請使用負數的 boostingDuration。
範圍 根據數值欄位的值範圍改變排名。 此值必須是整數或浮點數。 就 1 到 4 的星級評等而言,這會是 1。 就超過 50% 的利潤而言,這會是 50。 此函數僅適用於 Edm.DoubleEdm.Int 欄位。 使用 magnitude 函式時,若您想要反轉模式 (例如將價格低的項目提升為高於價格高的項目),可將高至低的範圍反轉。 假設價格範圍為 $100 美元到 $1 美元,您會將 boostingRangeStart 設定為 100,並將 boostingRangeEnd 設定為 1,以在較低的價格項目提升。 請在您要依獲利率、評等、點選連結計數、下載次數、最高價格、最低價格或下載計數來提升時使用。 當兩個項目相關時,會先顯示具有更高評等的項目。
標籤 依搜尋文件和查詢字串共通的標記提升。 標籤會在 tagsParameter 中提供。 此函式只能與 Edm.StringCollection(Edm.String) 類型的搜尋欄位搭配使用。 請在您有標籤欄位時使用。 如果清單中的指定標記本身是逗號分隔清單,您可以對欄位使用文字正規化程式,在查詢時移除逗號 (將逗號字元對應至空格)。 此方法會將清單「壓平合併」,讓所有字詞都變成以逗號分隔的單一長字串。

使用函數的規則

  • 函式只能套用至屬性為 filterable 的欄位。
  • 函式類型 ("freshness"、"magnitude"、"distance"、"tag") 必須是小寫。
  • 函式不可包含 null 或空值。
  • 函式的每個函式定義只能有一個欄位。 若要在同一個設定檔中使用範圍兩次,請提供兩個定義範圍,每個欄位各一個。

範本

本節說明評分設定檔的語法與範本。 如需屬性的描述,請參閱 REST API 參考

"scoringProfiles": [  
  {   
    "name": "name of scoring profile",   
    "text": (optional, only applies to searchable fields) {   
      "weights": {   
        "searchable_field_name": relative_weight_value (positive #'s),   
        ...   
      }   
    },   
    "functions": (optional) [  
      {   
        "type": "magnitude | freshness | distance | tag",   
        "boost": # (positive number used as multiplier for raw score != 1),   
        "fieldName": "(...)",   
        "interpolation": "constant | linear (default) | quadratic | logarithmic",   

        "magnitude": {
          "boostingRangeStart": #,   
          "boostingRangeEnd": #,   
          "constantBoostBeyondRange": true | false (default)
        }  

        // ( - or -)  

        "freshness": {
          "boostingDuration": "..." (value representing timespan over which boosting occurs)   
        }  

        // ( - or -)  

        "distance": {
          "referencePointParameter": "...", (parameter to be passed in queries to use as reference location)   
          "boostingDistance": # (the distance in kilometers from the reference location where the boosting range ends)   
        }   

        // ( - or -)  

        "tag": {
          "tagsParameter":  "..."(parameter to be passed in queries to specify a list of tags to compare against target field)   
        }
      }
    ],   
    "functionAggregation": (optional, applies only when functions are specified) "sum (default) | average | minimum | maximum | firstMatching"   
  }   
],   
"defaultScoringProfile": (optional) "...", 

設定內插補點

插補會設定用於評分的斜率圖形。 因為評分會由高至低排序,因此斜率一律為遞減,但插補可決定向下斜率的曲線。 可用的內插補點如下:

插補 描述
linear 對於在最大和最小範圍內的項目,會在已持續遞減的量中套用提升。 線性是評分設定檔的預設插補。
constant 對於在開始和結束範圍內的項目,會對排名結果套用常數提升。
quadratic 相較於採用持續遞減提升的線性插補,二次方程式一開始會以較小的步調減少,待接近結束範圍時,再以較大的間隔減少。 tag 計分函式不允許使用此插補選項。
logarithmic 相較於採用持續遞減提升的線性插補,對數一開始會以較大的步調減少,待接近結束範圍時,再以較小的間隔減少。 tag 計分函式不允許使用此插補選項。

圖表上的常數、線性、二次方、log10 線

設定 boostingDuration for freshness 函式

boostingDurationfreshness 函式的屬性。 您可以用它來設定要開始停止對特定文件進行提升的到期時間。 例如,若要在為期 10 天的促銷期間提升某個產品系列或品牌,您可以為這些文件指定 10 天的期間 "P10D"。

boostingDuration 必須格式化為 XSD "dayTimeDuration" 值 (ISO 8601 持續時間值的限定子集)。 其模式為:"P[nD][T[nH][nM][nS]]"。

下表提供數個範例。

期間 boostingDuration
1 天 "P1D"
2 天又 12 個小時 "P2DT12H"
15 分鐘 "PT15M"
30 天 5 小時 10 分鐘又 6.334 秒 "P30DT5H10M6.334S"

如需更多範例,請參閱 XML 結構描述:資料類型 (W3.org 網站)

請參閱此部落格文章 (英文) 和筆記本 (英文),以取得使用評分設定檔的示範,以及記錄向量和生成式 AI 案例中的提升。

下列範例說明具有兩個評分設定檔 (boostGenrenewAndHighlyRated) 的索引結構描述。 任何以其中一個設定檔做為查詢參數而對此索引所做的查詢,都將使用該設定檔為結果集評分。

boostGenre 設定檔使用加權文字欄位,提升在 albumTitle、genre 和 musicName 欄位中找到的相符項目。 欄位分別提升了 1.5、5 和 2。 為何內容類型提升的程度遠比其他多? 如果是對同質的資料進行搜尋 (如同 musicstoreindex 中的 'genre'),相對加權可能會需要較大的變異數。 例如,在 musicstoreindex 中,'rock' 不僅顯示為內容類型,也出現在措詞相同的內容類型說明中。 如果您要讓類型的權數高於類型說明,則類型欄位需要更高的相對權數。

{  
  "name": "musicstoreindex",  
  "fields": [  
    { "name": "key", "type": "Edm.String", "key": true },  
    { "name": "albumTitle", "type": "Edm.String" },  
    { "name": "albumUrl", "type": "Edm.String", "filterable": false },  
    { "name": "genre", "type": "Edm.String" },  
    { "name": "genreDescription", "type": "Edm.String", "filterable": false },  
    { "name": "artistName", "type": "Edm.String" },  
    { "name": "orderableOnline", "type": "Edm.Boolean" },  
    { "name": "rating", "type": "Edm.Int32" },  
    { "name": "tags", "type": "Collection(Edm.String)" },  
    { "name": "price", "type": "Edm.Double", "filterable": false },  
    { "name": "margin", "type": "Edm.Int32", "retrievable": false },  
    { "name": "inventory", "type": "Edm.Int32" },  
    { "name": "lastUpdated", "type": "Edm.DateTimeOffset" }  
  ],  
  "scoringProfiles": [  
    {  
      "name": "boostGenre",  
      "text": {  
        "weights": {  
          "albumTitle": 1.5,  
          "genre": 5,  
          "artistName": 2  
        }  
      }  
    },  
    {  
      "name": "newAndHighlyRated",  
      "functions": [  
        {  
          "type": "freshness",  
          "fieldName": "lastUpdated",  
          "boost": 10,  
          "interpolation": "quadratic",  
          "freshness": {  
            "boostingDuration": "P365D"  
          }  
        },  
        {
          "type": "magnitude",  
          "fieldName": "rating",  
          "boost": 10,  
          "interpolation": "linear",  
          "magnitude": {  
            "boostingRangeStart": 1,  
            "boostingRangeEnd": 5,  
            "constantBoostBeyondRange": false  
          }  
        }  
      ]  
    }  
  ],  
  "suggesters": [  
    {  
      "name": "sg",  
      "searchMode": "analyzingInfixMatching",  
      "sourceFields": [ "albumTitle", "artistName" ]  
    }  
  ]   
}  

另請參閱