Ajouter des profils de scoring pour surévaluer les scores de recherche

Dans cet article, vous allez apprendre à définir un profil de score. Un profil de score est un critère permettant d’augmenter le score d’une recherche en fonction des paramètres que vous fournissez. Par exemple, vous pouvez souhaiter que les correspondances trouvées dans un champ « balises » soient plus pertinentes que la même correspondance trouvée dans « descriptions ». Un critère peut être un champ pondéré (par exemple, l’exemple « balises ») ou une fonction.

Les profils de score sont définis dans un index de recherche et sont appelés sur des champs non vectoriels sur des demandes de requête. Vous pouvez créer plusieurs profils, puis modifier la logique de requête pour choisir le profil à utiliser.

Remarque

Les concepts de pertinence ne vous sont pas familiers ? Le segment vidéo suivant sur YouTube permet d’accéder rapidement au fonctionnement des profils de score dans Recherche Azure AI. Vous pouvez également consulter Pertinence et scoring dans la Recherche Azure AI pour en savoir plus.

Définition d’un profil de scoring

Un profil de score est un objet nommé défini dans un schéma d’index. Un profil peut être composé de champs, de fonctions et de paramètres pondérés.

La définition suivante montre un profil simple nommé « géo ». Cet exemple surévalue les résultats dont le champ hotelName contient le terme recherché. Il utilise également la fonction distance pour favoriser les résultats qui se trouvent dans un rayon de 10 kilomètres de l’emplacement actuel. Si quelqu'un effectue une recherche sur le terme « inn » dans un rayon de 10 km par rapport à la position actuelle, les documents d'hôtels dont le nom contient cette chaîne de caractères apparaissent en tête des résultats de la recherche.

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

Pour utiliser ce profil de scoring, votre requête est formulée de façon à spécifier le paramètre scoringProfile dans la requête. Si vous utilisez l’API REST, les requêtes sont spécifiées via des requêtes GET et POST. Dans l’exemple suivant, « currentLocation » a un délimiteur d’un tiret unique (-). Il est suivi des coordonnées longitude et latitude, où la longitude est une valeur négative.

GET /indexes/hotels/docs?search+inn&scoringProfile=geo&scoringParameter=currentLocation--122.123,44.77233&api-version=2020-06-30

Notez les différences de syntaxe lors de l’utilisation de POST. Dans POST, « scoringParameters » est au pluriel et il s’agit d’un tableau.

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

Cette requête recherche le terme « inn » et transmet l’emplacement actuel. Notez que cette requête inclut d’autres paramètres, tels que scoringParameter. Les paramètres de requête, notamment « scoringParameter », sont décrits dans Recherche dans des documents (API REST).

Pour voir un exemple plus détaillé de profil de scoring, consultez Exemple étendu.

Mode de calcul des scores

Les scores sont calculés pour les requêtes de recherche en texte intégral. Les correspondances sont notées en fonction de la pertinence de la correspondance et les correspondances de score les plus élevées sont retournées dans la réponse de requête. Le score global pour chaque document est une agrégation des scores individuels pour chaque champ, où le score individuel de chaque champ est calculé sur la base de la fréquence des termes et de la fréquence des documents des termes recherchés dans ce champ (connu sous le nom de TF-IDF ou « fréquence de terme-fréquence inverse de document »).

Vous pouvez utiliser le paramètre featuresMode (préversion) pour demander des détails de scoring supplémentaires (dont les scores au niveau des champs) avec les résultats de la recherche.

Quand ajouter une logique de notation

Quand le classement par défaut produit des résultats trop éloignés de vos objectifs, vous devez créer un ou plusieurs profils de calcul de score. Par exemple, vous pouvez décider que la pertinence de la recherche doit privilégier les éléments récemment ajoutés. De même, il se peut qu'un champ affiche une marge bénéficiaire, ou un autre un revenu potentiel. La surévaluation des résultats qui sont plus significatifs pour vos utilisateurs ou pour l’entreprise est souvent le facteur décisif dans l’adoption des profils de scoring.

Le classement par pertinence dans une page de recherche est mis en œuvre par l’intermédiaire de profils de scoring. Songez aux pages de résultats de recherche que vous avez utilisées par le passé, qui vous permettaient de trier par prix, date, évaluation ou pertinence. Dans Recherche Azure AI, les profils de score peuvent être utilisés pour gérer l’option « pertinence ». Définition de la pertinence définie par l’utilisateur en fonction de vos objectifs et du type d'expérience de recherche que vous souhaitez.

Étapes d’ajout d’un profil de scoring

Pour mettre en œuvre un calcul de score personnalisé, ajoutez un profil de calcul de score au schéma qui définit l'index. Vous pouvez avoir jusqu’à 100 profils de calcul de score au sein d’un même index (consultez Limites de service), mais vous ne pouvez spécifier qu’un seul profil à la fois dans une requête donnée.

  1. Commencez par une définition d’index. Vous pouvez ajouter et mettre à jour des profils de scoring sur un index existant sans avoir à le régénérer. Utilisez une requête Update Index pour afficher votre révision.

  2. Collez le modèle fourni dans cet article.

  3. Donnez-lui un nom. Les profils de calcul de score sont facultatifs mais, si vous en ajoutez un, le nom est obligatoire. Veillez à respecter les conventions d’affectation de noms de Recherche Azure AI pour les champs (commencer par une lettre, éviter les caractères spéciaux et les mots réservés).

  4. Spécifiez les critères de surévaluation. Un profil unique peut contenir des champs pondérés, des fonctions, ou les deux.

Vous devez travailler de manière itérative, en utilisant un jeu de données qui vous aidera à prouver ou à réfuter l’efficacité d’un profil donné.

Les profils de scoring peuvent être définis dans le portail Azure, comme le montre la capture d’écran suivante, ou par programmation via les API REST ou les Kits de développement logiciel (SDK) Azure, comme la classe ScoringProfile du SDK Azure pour .NET.

Add scoring profiles page

Utilisation de champs pondérés

Utilisez des champs pondérés lorsque le contexte du champ est important et que les requêtes sont une recherche en texte intégral. Par exemple, si une requête comprend le terme « aéroport », vous souhaiterez peut-être que « aéroport » ait plus de poids dans le champ Description que dans le champ HotelName.

Les champs pondérés se composent d’un champ avec recherche possible et d’un nombre positif utilisé comme multiplicateur. Si le score original du champ HotelName est de 3, le score surévalué pour ce champ est de 6, ce qui contribue à un score global plus élevé pour le document parent lui-même.

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

Utilisation des fonctions

Utilisez des fonctions lorsque les pondérations relatives simples sont insuffisantes ou ne s’appliquent pas, comme dans le cas de « distance » et de « freshness », qui sont des calculs sur des données numériques. Vous pouvez spécifier plusieurs fonctions par profil de scoring. Pour plus d’informations sur les types de données EDM utilisés dans Recherche Azure AI, consultez Types de données pris en charge.

Fonction Description
« freshness » Augmente par valeurs d’un champ DateHeure (Edm.DateTimeOffset). Cette fonction a un attribut « boostingDuration » qui vous permet de spécifier une valeur représentant un intervalle de temps pendant lequel la surévaluation se produit.
« magnitude » Surévalue selon le niveau élevé ou bas d’une valeur numérique. Parmi les scénarios qui appellent cette fonction figurent la valorisation de la marge bénéficiaire, du prix le plus élevé, du prix le plus bas ou du nombre de téléchargements. Cette fonction peut être utilisée uniquement avec les champs Edm.Double et Edm.Int. Pour la fonction magnitude, vous pouvez inverser la plage (de la valeur la plus élevée à la valeur la plus basse) si vous souhaitez obtenir le modèle inverse (par exemple, pour surévaluer les articles les moins chers davantage que les articles les plus chers). Pour une gamme de prix allant de 100 USD à 1 USD, vous pouvez définir « boostingRangeStart » à 100 et « boostingRangeEnd » à 1 pour surévaluer les articles les moins chers.
« distance » Surévalue en fonction de la proximité ou de l’emplacement géographique. Cette fonction peut être utilisée uniquement avec des champs Edm.GeographyPoint .
« tag » Surévalue selon les étiquettes communes aux documents de recherche et aux chaînes de requête. Les étiquettes sont fournies dans un « tagsParameter ». Cette fonction peut être utilisée uniquement avec des champs de type Edm.String et Collection(Edm.String).

Règles d'utilisation des fonctions

  • Les fonctions ne peuvent être appliquées qu’aux champs filtrables.
  • Le type de fonction (« freshness », « magnitude », « distance », « tag ») doit être en lettres minuscules.
  • Les fonctions ne peuvent pas contenir de valeurs null ou vides.

Modèle

Cette section présente la syntaxe et le modèle de profils de calcul de score. Pour obtenir des descriptions des attributs des profils de scoring, consultez Informations de référence sur les propriétés dans la section suivante.

"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) "...", 

Informations de référence sur les propriétés

Attribut Description
name Obligatoire. Nom du profil de calcul de score. Il suit les conventions d'affectation de noms applicables aux champs. Il doit commencer par une lettre, ne peut pas contenir les signes point, deux-points ou @, et ne peut pas commencer par l’expression azureSearch (respecte la casse).
texte Contient la propriété weights.
weights facultatif. Des paires nom-valeur qui spécifient un champ avec recherche possible et un entier positif ou un nombre à virgule flottante pour surévaluer le score du champ. L’entier ou le nombre positif devient un multiplicateur du score original du champ généré par l’algorithme de classement. Par exemple, si le score d’un champ est de 2 et que la valeur de pondération est de 3, le score surévalué du champ est de 6. Les scores des champs individuels sont ensuite agrégés pour créer un score de champ de document, qui est ensuite utilisé pour classer le document parmi les résultats.
functions facultatif. Vous pouvez appliquer une fonction de calcul de score uniquement à des champs filtrables.
functions > type Obligatoire pour les fonctions de calcul de score. Indique le type de fonction à utiliser. Les valeurs autorisées sont magnitude, freshness, distance et tag. Vous pouvez inclure plusieurs fonctions dans chaque profil de calcul de score. Le nom de fonction doit être en lettres minuscules.
functions > boost Obligatoire pour les fonctions de calcul de score. Nombre positif utilisé comme multiplicateur pour le score brut. Il ne peut pas être égal à 1.
functions > fieldname Obligatoire pour les fonctions de calcul de score. Vous pouvez appliquer une fonction de calcul de score uniquement à des champs faisant partie de la collection de champs de l'index, et qui sont filtrables. De plus, chaque type de fonction fait l'objet de restrictions supplémentaires (la valeur freshness est utilisée avec des champs datetime, la valeur amplitude avec des champs integer ou double, et la valeur distance avec des champs location). Vous pouvez spécifier un seul champ par définition de fonction. Par exemple, pour utiliser une valeur magnitude deux fois dans le même profil, vous devez inclure deux définitions de magnitude, une pour chaque champ.
functions > interpolation Obligatoire pour les fonctions de calcul de score. Définit la pente pour laquelle la valorisation du score augmente, du début à la fin de la plage. Les valeurs autorisées sont Linear (par défaut), Constant, Quadratic et Logarithmic. Consultez la rubrique Définition d’interpolations pour plus d’informations.
functions > magnitude La fonction de calcul de score magnitude est utilisée pour modifier des classements en fonction de la plage de valeurs pour un champ numérique. Voici quelques exemples d’utilisation les plus courants :

« évaluations en étoile : » modifiez la notation en fonction de la valeur dans le champ « évaluation en étoile ». Lorsque deux éléments sont pertinents, l’élément associé à l’évaluation la plus élevée s’affiche en premier.
« Marge » : quand deux documents sont pertinents, un détaillant peut souhaiter surévaluer le document présentant les marges les plus élevées.
« Nombres de clics » : pour les applications qui suivent les actions de clic sur des produits ou des pages, vous pouvez utiliser la fonction magnitude pour surévaluer les éléments qui drainent le plus de trafic.
« Nombres de téléchargements » : pour les applications qui suivent les téléchargements, la fonction magnitude permet de surévaluer les éléments les plus téléchargés.
functions > magnitude > boostingRangeStart Définit la valeur de début de la plage sur la base de laquelle les scores de magnitude sont calculés. La valeur doit être un entier ou un nombre à virgule flottante. Pour des évaluations de 1 à 4, il s'agit de 1. Pour des marges de plus de 50 %, il s'agit de 50.
functions > magnitude > boostingRangeEnd Définit la valeur de fin de la plage sur laquelle les scores de magnitude sont calculés. La valeur doit être un entier ou un nombre à virgule flottante. Pour les évaluations de 1 à 4, il s'agit de 4.
functions > magnitude > constantBoostBeyondRange Les valeurs autorisées sont true ou false (par défaut). Quand la valeur est true, la valorisation complète continue de s'appliquer aux documents dont la valeur pour le champ cible est supérieure à la limite supérieure de la plage. Quand la valeur est false, la valorisation de cette fonction ne s'applique pas aux documents dont la valeur pour le champ cible se situe en dehors de la plage.
functions > freshness La fonction de calcul de score freshness permet de modifier les scores de classement d'éléments en fonction des valeurs des champs DateTimeOffset. Par exemple, un élément dont la date est plus récente peut être classé plus haut que des éléments plus anciens.

Il est également possible de classer les éléments tels que les événements de calendrier comportant des dates ultérieures afin que les éléments plus proches de la date du jour soient classés plus haut que les éléments plus éloignés dans le temps.

Dans la version de service actuelle, une extrémité de la plage doit être définie sur l'heure réelle. L’autre extrémité est une heure dans le passé selon l’attribut boostingDuration. Pour surévaluer une plage d’heures à venir, utilisez un attribut boostingDuration négatif.

La vitesse à laquelle la valorisation passe d'une plage maximale à une plage minimale est déterminée par l'interpolation appliquée au profil de calcul de score (voir la figure ci-dessous). Pour inverser le facteur de valorisation appliqué, choisissez un facteur inférieur à 1.
functions > freshness > boostingDuration Définit une période d'expiration après laquelle la valorisation s'arrête pour un document spécifique. Pour plus d’informations sur la syntaxe et des exemples, consultez Set boostingDuration dans la section suivante.
functions > distance La fonction de scoring à distance est utilisée pour affecter le score de documents sur la base de leur proximité ou de leur éloignement par rapport à un emplacement géographique de référence. L’emplacement de référence est indiqué comme partie intégrante de la requête dans un paramètre (à l’aide du paramètre de requête scoringParameter) en tant qu’argument lon,lat.
functions > distance > referencePointParameter Paramètre à transmettre dans les requêtes, à utiliser comme emplacement de référence (à l’aide du paramètre de requête scoringParameter).
functions > distance > boostingDistance Nombre indiquant la distance en kilomètres par rapport à l'emplacement de référence où la valorisation se termine.
functions > tag La fonction de calcul de score de balises est utilisée pour affecter le score de documents sur la base de balises dans des documents et des requêtes de recherche. Les documents contenant des balises communes avec la requête de recherche seront privilégiés. Les étiquettes pour la requête de recherche sont fournies en tant que paramètre de scoring dans chaque requête de recherche (à l’aide du paramètre de requête scoringParameter).
functions > tag > tagsParameter Paramètre à transmettre dans les requêtes pour spécifier les étiquettes d’une requête particulière (à l’aide du paramètre de requête scoringParameter). Le paramètre se compose d’une liste délimitée par des virgules de termes entiers. Si une balise donnée dans la liste est elle-même une liste délimitée par des virgules, vous pouvez utiliser un normaliseur de texte sur le champ pour supprimer les virgules au moment de la requête (mapper le caractère virgule avec un espace). Cette approche va « aplatir » la liste afin que tous les termes soient une chaîne unique et longue de termes délimités par des virgules.
functionAggregation facultatif. S'applique uniquement quand des fonctions sont spécifiées. Les valeurs autorisées sont les suivantes : sum (par défaut), average, minimum, maximum et firstMatching. Un score de recherche est une valeur unique calculée à partir de plusieurs variables, notamment plusieurs fonctions. Cet attribut indique comment les valorisations de toutes les fonctions sont combinées en une valorisation agrégée qui est ensuite appliquée au score du document de base. Le score de base dépend de la valeur tf-idf calculée à partir du document et de la requête de recherche.
defaultScoringProfile Lors de l'exécution d'une requête de recherche, le calcul de score par défaut est utilisé (tf-idf uniquement) si aucun profil de calcul de score n'est spécifié.

Vous pouvez remplacer la valeur par défaut intégrée, en substituant un profil personnalisé comme celui à utiliser lorsqu’aucun profil spécifique n’est indiqué dans la requête de recherche.

Définition d'interpolations

Les interpolations vous permettent de définir la forme de la pente utilisée pour calculer les scores. Le score allant d'élevé à faible, la pente est toujours décroissante, mais l’interpolation détermine la courbe de la pente descendante. Les interpolations utilisables sont les suivantes :

Interpolation Description
linear pour les éléments qui s’inscrivent dans la plage de max à min, la valorisation appliquée décroît de manière constante. L'interpolation de type Linear est l'interpolation par défaut pour un profil de calcul de score.
constant Pour les éléments qui s'inscrivent dans la plage du début à la fin, une valorisation constante est appliquée aux résultats du classement.
quadratic Par rapport à une interpolation de type Linear dont la valorisation décroît de façon constante, une interpolation de type Quadratic décroît initialement plus lentement, puis, lorsqu’elle approche de la plage de fin, beaucoup plus rapidement. Cette option d’interpolation n’est pas autorisée dans les fonctions de scoring d’étiquettes.
logarithmic Par rapport à une interpolation de type Linear dont la valorisation décroît de façon constante, une interpolation de type Logarithmic décroît initialement plus rapidement, puis, lorsqu’elle approche de la plage de fin, beaucoup plus lentement. Cette option d’interpolation n’est pas autorisée dans les fonctions de scoring d’étiquettes.

Constant, linear, quadratic, log10 lines on graph

Définition de boostingDuration

boostingDuration est un attribut de la fonction freshness. Il permet de définir une période d'expiration après laquelle la valorisation s'arrête pour un document spécifique. Par exemple, pour valoriser une ligne de produits ou une marque pendant une période promotionnelle de 10 jours, vous spécifiez la période de 10 jours en tant que « P10D » pour les documents correspondants.

boostingDuration doit être au format « dayTimeDuration » XSD (sous-ensemble limité d'une valeur de durée ISO 8601). Le modèle appliqué est : « P[nD][T[nH][nM][nS]] ».

Le tableau suivant fournit plusieurs exemples.

Durée boostingDuration
1 jour « P1D »
2 jours et 12 heures « P2DT12H »
15 minutes « PT15M »
30 jours, 5 heures 10 minutes, et 6 334 secondes « P30DT5H10M6.334S »

Pour plus d'exemples, consultez Schéma XML : types de données (site Web W3.org).

Exemple étendu

L’exemple suivant montre le schéma d’un index comprenant deux profils de scoring (boostGenre, newAndHighlyRated). Toute requête sur cet index qui comprend un profil comme paramètre de requête utilise le profil pour évaluer le jeu de résultats.

Le profil boostGenre utilise des champs de texte pondérés, surévaluant les correspondances trouvées dans les champs albumTitle, genre, et artistName. Ces champs sont respectivement multipliés par 1,5, 5 et 2. Pourquoi la pondération du champ genre est-elle beaucoup plus élevée que celle des autres champs ? Si la recherche est effectuée sur des données relativement homogènes (comme c’est le cas de « genre » dans musicstoreindex), il se peut que vous ayez besoin d’une variance plus importante dans les pondérations relatives. Par exemple, dans musicstoreindex, « rock » apparaît à la fois comme genre et dans des descriptions de genre formulées de façon identique. Si vous souhaitez que le genre ait une pondération plus élevée que la description du genre, la pondération relative du champ Genre doit être sensiblement plus importante.

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

Voir aussi