Поделиться через


Добавление профилей повышения для повышения оценок поиска

Профили оценки позволяют повысить рейтинг соответствующих документов на основе критериев. В этой статье вы узнаете, как указать и назначить профиль оценки, повышающий оценку поиска на основе предоставленных параметров.

Вы можете использовать профили оценки для поиска ключевых слов, векторного поиска и гибридного поиска. Однако профили оценки применяются только к невекторным полям, поэтому убедитесь, что индекс содержит текст или числовые поля, которые можно использовать в профиле оценки. Поддержка профиля оценки для векторного и гибридного поиска доступна в 2024-05-01-preview и 2024-07-01 REST API и в пакетах SDK Azure, предназначенных для этих выпусков.

Ключевые моменты о профилях оценки

Параметры профиля оценки:

  • Весовые поля, в которых совпадение найдено в определенном строковом поле. Например, может потребоваться, чтобы совпадения, найденные в поле "сводка", были более релевантными, чем те же совпадения, найденные в поле "содержимое".

  • Функции для числовых данных, включая даты, диапазоны и географические координаты. Существует также функция Тегов, которая работает с полем, предоставляющим произвольную коллекцию строк. Этот подход можно выбрать по весовым полям, если вы хотите повысить оценку на основе того, найден ли совпадение в поле тегов.

Вы можете создать несколько профилей, а затем изменить логику запроса, чтобы выбрать, какой из них используется.

В индексе можно использовать до 100 профилей оценки (см . ограничения службы), но в любом запросе можно указать только один профиль.

С помощью семантического ранга можно использовать профили оценки. Если несколько функций ранжирования или релевантности находятся в игре, семантический ранжирование является последним шагом. Как работает оценка поиска, предоставляет иллюстрацию.

Примечание.

Не знакомы с понятиями релевантности? Посетите страницу релевантности и оценки в службе "Поиск ИИ Azure" для фонового поиска. Вы также можете посмотреть этот сегмент видео на YouTube для оценки профилей по результатам BM25.

Определение профиля оценки

Профиль оценки называется объектом, определенным в схеме индекса. Профиль оценки состоит из весовых полей, функций и параметров.

В следующем определении показан простой профиль с именем geo. Этот пример повышает результаты, имеющие поисковый термин в поле hotelName. Она также использует distance функцию для того, чтобы использовать результаты, которые находятся в пределах 10 километров от текущего расположения. Если кто-то ищет слово 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).

См. расширенный пример для векторного и гибридного поиска и расширенного примера поиска ключевых слов для получения дополнительных сценариев.

Профили оценки дополняют алгоритм оценки по умолчанию путем повышения показателей совпадений, удовлетворяющих критериям профиля. Функции оценки применяются к следующим функциям:

Для автономных текстовых запросов профили оценки определяют максимум 1000 совпадений в поиске по BM25, а первые 50 возвращаются в результатах.

Для чистых векторов запрос предназначен только для векторов, но если документы с сопоставлением k включают буквенно-цифровые поля, которые может обрабатывать профиль оценки, применяется профиль оценки. Профиль оценки пересматривает результирующий набор, повышая документы, соответствующие критериям в профиле.

Для текстовых запросов в гибридном запросе профили оценки определяют максимум 1000 совпадений в поиске по BM25. Однако после определения этих 1000 результатов они восстанавливаются в исходном порядке BM25, чтобы их можно было перезаписывать вместе с векторами, что приводит к окончательному упорядочению функции обратного ранжирования (RRF), где профиль оценки (идентифицируемый как "окончательный документ повышения корректировки" на рисунке) применяется к объединенным результатам, а также семантического ранжирования в качестве последнего шага.

Схема, показывающая, какие поля имеют профиль оценки и когда происходит ранжирование.

Добавление профиля оценки в индекс поиска

  1. Начните с определения индекса. Вы можете добавлять и обновлять профили повышения в имеющемся индексе без необходимости перестраивать его. Используйте запрос на создание или обновление индекса для публикации редакции.

  2. Вставьте шаблон, указанный в этой статье.

  3. Укажите имя, которое соответствует соглашениям об именовании.

  4. Укажите критерии повышения. Один профиль может содержать текстовые взвешанные поля, функции или оба.

Вы должны работать итеративно, используя набор данных, который поможет доказать или опровергнуть эффективность данного профиля.

Профили повышения можно определить на портале Azure, как показано на следующем снимке экрана, или программно с помощью REST API или в пакетах SDK Azure, например с использованием класса ScoringProfile в пакете Azure SDK для .NET.

Страница добавления профилей повышения

Использование текстовых взвешированных полей

Используйте текстовые поля, если контекст поля важен, а запросы включают searchable строковые поля. Например, если запрос содержит термин airport, то для airport в поле "Описание" может потребоваться больше веса, чем в HotelName.

Взвешенные поля — это пары "имя-значение", состоящие из searchable поля, и положительное число, которое используется в качестве умножения. Если исходная оценка поля HotelName равна 3, повышенной оценкой для этого поля будет 6, что повышает общую оценку самого родительского документа.

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

Использование функций

Используйте функции, когда простые относительные весы недостаточно или не применяются, как и в случае с расстоянием и свежестью, которые являются вычислениями по числовым данным. Вы можете указать несколько функций для профиля повышения. Дополнительные сведения о типах данных EDM, используемых в поиске ИИ Azure, см. в статье "Поддерживаемые типы данных".

Function Description Случаи использования
distance Повышение по близости или географическому расположению. Эта функция может использоваться только с полями типа Edm.GeographyPoint . Используйте для сценариев "найти рядом со мной".
свежесть Повышение по значениям в поле datetime (Edm.DateTimeOffset). Задайте boostingDuration , чтобы указать значение, представляющее интервал времени, по которому происходит повышение. Используйте, когда вы хотите увеличить более новые или старые даты. Ранговые элементы, такие как события календаря с будущими датами, таким образом, что элементы ближе к настоящему времени могут быть ранжированы выше, чем элементы дальше в будущем. Один конец диапазона фиксирован до текущего времени. Чтобы повысить диапазон раз в прошлом, используйте положительное повышениеduration. Чтобы повысить приоритет диапазона будущего времени, используйте отрицательное значение параметра boostingDuration.
величина Изменение ранжирования на основе диапазона значений для числового поля. Значение должно быть целым числом или числом с плавающей запятой. Для оценок по звездам от 1 до 4 — 1. Для маржи более 50 % — 50. Эта функция может использоваться только с полями Edm.Double и Edm.Int. Для функции magnitude можно задать обратный диапазон (от высоких оценок до низких), если результаты нужно отобразить в обратном порядке (например, повысить приоритет для элементов с более низкими ценами по сравнению с элементами с более высокими ценами). Если у вас есть диапазон цен от 100 до 1 доллара США, для параметров boostingRangeStart и boostingRangeEnd следует установить значения 100 и 1 соответственно, чтобы повысить приоритет для элементов с более низкими ценами. Используйте, если вы хотите повысить прибыль, рейтинги, счетчики щелчков, количество загрузок, максимальной цены, наименьшей цены или количество загрузок. Если релевантны два элемента, первым отобразится элемент с более высокой оценкой.
тег Повышение по тегам, которые являются общими для поиска документов и строк запроса. Теги предоставляются в tagsParameter. Эту функцию можно использовать только с полями поиска типа Edm.String и Collection(Edm.String). Используйте при наличии полей тегов. Если заданный тег в списке является списком с разделителями-запятыми, можно использовать нормализатор текста в поле для удаления запятых во время запроса (сопоставлять символ запятой с пробелом). Этот подход будет "плоско" в списке, чтобы все термины были одной длинной строкой терминов с разделителями-запятыми.

Правила использования функции

  • Функции могут применяться только к полям, которые относятся как filterable.
  • Тип функции (freshness, magnitude, distance, tag) необходимо указывать в нижнем регистре.
  • Функции не могут содержать пустые или пустые значения.
  • Функции могут иметь только одно поле для определения функции. Чтобы использовать величину дважды в одном профиле, укажите два определения величины, по одному для каждого поля.

Template

В этом разделе показан синтаксис и шаблон для профилей оценки. Описание свойств см. в справочнике по 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) "...", 

Настройка интерполяций

Интерполяции задают форму наклона, используемого для оценки. Так как оценка идет по убыванию, наклон всегда снижается, но интерполяция определяет кривую нисходящего наклона. Можно использовать следующие типы интерполяции.

Интерполяция Description
linear Для элементов, находящихся в пределах максимального и минимального диапазона, повышение применяется в постоянно уменьшающейся сумме. Линейная интерполяция — это интерполяция для оценки профиля по умолчанию.
constant Для элементов, находящихся в начальном и конечном диапазоне, к результатам ранжирования применяется постоянный импульс.
quadratic По сравнению с линейной интерполяцией, которая постоянно уменьшается, квадратично первоначально уменьшается на меньшем темпе, а затем, когда он приближается к конечному диапазону, он уменьшается на гораздо более высоком интервале. Этот параметр интерполяции не допускается в функциях оценки тегов.
logarithmic По сравнению с линейной интерполяцией, которая постоянно уменьшается, логарифмический изначально уменьшается в более высоком темпе, а затем, когда он приближается к конечному диапазону, он уменьшается на гораздо меньшем интервале. Этот параметр интерполяции не допускается в функциях оценки тегов.

Константная, линейная, квадратная, лог10 линий на графе

Настройка boostingDuration для функции свежести

boostingDuration — это атрибут функции freshness. Он задает срок действия, после которого повышение приоритета перестает применяться для определенного документа. Например, для повышения приоритета линейки продуктов или торговой марки в течение 10-дневного периода следует указать для соответствующих документов 10-дневный период как "P10D".

boostingDuration необходимо отформатировать как XSD-значение dayTimeDuration (ограниченное подмножество значения длительности ISO 8601). Используется следующий шаблон: "P[nD][T[nH][nM][nS]]".

Следующая таблица содержит несколько примеров.

Duration boostingDuration
1 день "P1D"
2 дня и 12 часов "P2DT12H"
15 минут "PT15M"
30 дней, 5 часов, 10 минут и 6,334 секунды "P30DT5H10M6.334S"

Дополнительные примеры см. в документе о типах данных в схеме XML (веб-сайт W3.org).

Ознакомьтесь с этой записью блога и записной книжкой для демонстрации использования профилей оценки и повышения уровня документов в сценариях векторного и генерного ИИ.

В следующем примере показана схема индекса с двумя профилями повышения (boostGenre, newAndHighlyRated). Любой запрос к этому индексу, включающий профиль в качестве параметра запроса, будет использовать профиль для оценки результирующего набора.

Профиль boostGenre использует взвешенные текстовые поля, повышая совпадения в полях albumTitle, genre и artistName. Поля повышаются на 1.5, 5 и 2 позиции соответственно. Почему для поля genre приоритет повышен намного больше, чем для других полей? Если поиск выполняется в однородных данных (как в случае с genre в musicstoreindex), вам может потребоваться большая вариативность в относительных весах. Например, слово rock появляется в musicstoreindex как жанр и в идентично сформулированных описаниях жанра. Если жанр должен обладать большим весом, чем описание жанра, полю genre потребуется назначить гораздо больший относительный вес.

{  
  "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" ]  
    }  
  ]   
}  

См. также