Personnaliser le classement des résultats de recherche

Étant donné que les besoins de recherche peuvent différer selon les secteurs et varier de temps en temps, le comportement de classement par défaut n'est pas forcément optimal pour tous les besoins commerciaux. Pour résoudre ce problème, vous pouvez modifier le comportement de classement à l'aide du classement personnalisé.

Cette page explique comment utiliser une formule de classement personnalisée dans votre requête de recherche et comment l'ajuster. Cette fonctionnalité est disponible pour les données structurées, non structurées et de site Web.

Présentation

Le classement personnalisé vous permet de fournir une expression mathématique qui s'appuie sur un ensemble de signaux calculés par le modèle, tels que le score de pertinence sémantique et le score de similarité des mots clés, ainsi que sur des signaux basés sur les documents, tels qu'un champ personnalisé comme la distance ou l'âge du document.

Le classement personnalisé vous permet d'effectuer les opérations suivantes :

  • Gagnez en visibilité : identifiez les signaux qui contribuent au classement final de vos résultats de recherche.
  • Ajuster les signaux existants : ajustez la pondération de différents signaux tels que la similarité sémantique, la correspondance des mots clés ou la fraîcheur des documents.
  • Intégrer la logique métier : ajoutez vos propres signaux personnalisés à partir des données de vos documents directement dans la formule de classement.
  • Optimisez systématiquement : utilisez la bibliothèque Python Open Source pour découvrir de manière programmatique la formule de classement optimale.

Nécessité d'un classement personnalisé : un exemple

Prenons l'exemple d'une requête pour la chaîne suivante sur un site Web de réservation d'hôtels :

luxury hotel with a large rooftop pool in Vancouver, pet-friendly and close to airport.

Supposons que les entrées suivantes soient récupérées :

  • Hôtel A : "Hôtel de luxe de premier plan à Vancouver, avec vue sur l'aéroport." Il dispose d'une superbe piscine sur le toit. Les animaux de compagnie ne sont pas autorisés."
  • Hôtel B : "Hôtel moderne et élégant situé dans le centre-ville de Vancouver. Animaux acceptés, chambres spacieuses. Il dispose d'une grande piscine intérieure et d'un centre de remise en forme."
  • Hôtel C : "Un charmant hôtel-boutique acceptant les animaux de compagnie près de l'aquarium (à 10 minutes à pied du centre-ville). Il comprend une jolie cour avec jardin. Pas de piscine."
  • Hôtel D : "Un complexe rustique emblématique. Réputé pour sa cuisine exquise et son service impeccable. Il comporte une piscine intérieure et un spa. Options acceptant les animaux de compagnie disponibles sur demande."

Tous les hôtels du catalogue incluent un champ distance_from_airport en kilomètres (km).

Classement basé sur les embeddings

Le système de recherche convertit la requête en un seul embedding. Il compare ensuite cet embedding de requête aux embeddings de tous les hôtels de son catalogue. Les hôtels dont les embeddings sont numériquement les plus proches de l'embedding de la requête sont mieux classés.

Voici le classement probable d'une recherche de pertinence basée uniquement sur les embeddings :

Classement Hôtel Raison possible de ce classement
1 Hôtel A Correspondance sémantique très forte pour les termes "luxe", "aéroport" et "piscine sur le toit". La réponse "pas d'animaux" n'est pas souhaitable, mais les autres correspondances fortes dominent.
2 Hôtel B Bonne correspondance sémantique pour "animaux acceptés" et "piscine". Cependant, "intérieur" au lieu de "sur le toit", "moderne" et "élégant" au lieu de "luxe", et "centre-ville" au lieu de "aéroport" la rendent moins pertinente que A.
3 Hôtel D Forte correspondance sémantique pour "animaux acceptés" et "grande piscine", mais "intérieure" au lieu de "sur le toit" et "rustique" au lieu de "luxe" la rendent légèrement moins pertinente sémantiquement que A et D.
4 Hôtel C L'attribut "Chiens admis" est un signal fort, mais les attributs "Pas de piscine" et "Boutique" réduisent considérablement la pertinence pour cette requête spécifique.

Ce classement ne fournit pas les résultats les plus pertinents. L'hôtel A est classé en première position, même si de nombreux utilisateurs ne le préfèrent pas en raison de sa politique "Animaux non autorisés". L'hôtel D, qui correspond à de nombreux critères, est classé plus bas, car son statut"rustique" ne correspond pas nécessairement à "luxe", et la piscine "intérieure" est classée plus bas que les correspondances exactes "grande" et "extérieure".

Classement personnalisé

Supposons que vous ayez configuré l'expression de classement suivante pour cet exemple de scénario. Pour en savoir plus sur les composants de cette expression, consultez À propos de l'implémentation du classement personnalisé.

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 est un champ récupérable dans le catalogue et c.distance_from_airport sert de signal.

Dans le classement personnalisé, vous tenez compte de différents signaux qui influencent la pertinence d'un document. Vous créez ensuite une expression mathématique contenant ces signaux à l'aide d'une syntaxe valide. Dans cette expression, vous normalisez les signaux et ajoutez des pondérations à leurs scores dérivés. Le score personnalisé final est calculé et les documents sont classés.

Dans cet exemple, ce processus peut être expliqué comme suit :

  1. Chaque hôtel reçoit un score de similarité sémantique et un score de similarité des mots clés. De plus, la distance depuis l'aéroport est un signal important dérivé du document.

  2. La fonction de transformation du rang réciproque ou rr() est utilisée pour transformer tous les scores sur la même échelle.

  3. Un poids est attribué au score dérivé de chaque signal. La somme de tous les scores individuels devient le score de classement personnalisé pour chaque hôtel.

Les différents signaux pour chaque hôtel sont présentés dans le tableau suivant :

Hôtel semantic_similarity_score keyword_similarity_score c.distance_from_airport Score de classement personnalisé Classement personnalisé Classement basé sur les embeddings
Hôtel A 9 6.2 ("aéroport", "luxe", "piscine sur le toit") 5.0 0.04879 2 1
Hôtel B 7,5 5.6 ("animaux acceptés", "centre-ville", "piscine intérieure", "élégant") 12,5 0.04691 3 2
Hôtel C 5.0 3.4 ("animaux acceptés", "centre-ville") 18 0.04525 4 4
Hôtel D 8,0 4,5 ("piscine intérieure", "animaux acceptés", "rustique") 1 0.04890 1 3

En comparant les deux méthodes de classement, le classement personnalisé offre un classement plus réfléchi qui correspond probablement mieux aux besoins d'un utilisateur qu'un classement basé uniquement sur les embeddings.

À propos de l'implémentation du classement personnalisé

Pour obtenir un classement personnalisé dans vos résultats de recherche, vous devez appeler la méthode search en fournissant les champs suivants :

  • Backend d'expression de classement (rankingExpressionBackend) : ce champ indique le mécanisme de classement à utiliser parmi les suivants.

    • RANK_BY_EMBEDDING : il s'agit de la valeur par défaut lorsque ce champ n'est pas spécifié. Si vous choisissez cette option, les résultats sont classés selon une expression de classement prédéfinie, basée sur l'intégration ou la pertinence.
    • RANK_BY_FORMULA : cela remplace le classement par défaut et vous permet de fournir votre formule personnalisée dans le champ rankingExpression.
  • Expression de classement (rankingExpression) : ce champ contient une formule mathématique qui détermine le classement des documents récupérés.

    • Pour RANK_BY_EMBEDDING, il s'agit d'un score de pertinence (double * relevanceScore) ou d'un score basé sur l'embedding (double * dotProduct(embedding_field_path)).

    • Pour RANK_BY_FORMULA, il s'agit d'une expression sélectionnée qui combine plusieurs signaux pour calculer un nouveau score pour chaque résultat de recherche.

Signaux standards

Vertex AI Search propose différents signaux que vous pouvez utiliser pour formuler un classement personnalisé. Voici les signaux standards disponibles :

Nom du signal Description
default_rank Classement par défaut du document, tel que déterminé par l'algorithme de classement VAIS standard
semantic_similarity_score Score calculé en fonction des embeddings de requête et de contenu pour déterminer la similarité entre une requête de recherche et le contenu d'un document. Cette valeur est calculée à l'aide d'un algorithme Google propriétaire.
relevance_score Score produit par un modèle de pertinence approfondie, qui gère les interactions complexes entre les requêtes et les documents. Le modèle détermine la signification et l'intention d'une requête dans le contexte du contenu. Cette valeur est calculée à l'aide d'un algorithme Google propriétaire.
keyword_similarity_score Score qui met fortement l'accent sur la correspondance des mots clés. Ce signal utilise la fonction de classement Best Match 25 (BM25).
document_age Âge du document en heures. Accepte les valeurs à virgule flottante. Par exemple, une valeur de 0,5 signifie 30 minutes, tandis que 50 signifie 2 jours et 2 heures.
pctr_rank Il s'agit d'un classement indiquant les taux de conversion prévus, calculés à partir des données d'événements utilisateur. Ce signal utilise le taux de clics prédit (pCTR) pour évaluer la pertinence d'un résultat de recherche du point de vue de l'utilisateur.
topicality_rank Il s'agit d'un classement indiquant l'ajustement de la similarité des mots clés calculé à l'aide d'un algorithme Google propriétaire.
boosting_factor Combinaison de tous les boosts personnalisés que vous avez appliqués au document.

En plus de ces champs, vous pouvez utiliser n'importe quel champ personnalisé d'un document marqué comme récupérable. Pour ce faire, ajoutez le préfixe c. à leurs noms de champs. Par exemple, si vous avez un champ personnalisé nommé date_approved, vous pouvez utiliser c.date_approved comme signal personnalisé.

Les noms de signaux sont une combinaison de caractères alphabétiques et de traits de soulignement (_). Voici une liste des noms réservés qui ne peuvent pas être utilisés comme noms de signaux : log, exp, rr, is_nan et fill_nan.

Syntaxe des formules de classement

La formule de classement personnalisé est une expression mathématique qui comporte les composants suivants :

  • Nombres (double) : valeurs à virgule flottante positives ou négatives qui ajoutent une pondération à un signal ou à une expression.

  • Signaux (signal) : noms des signaux listés dans la section Signaux disponibles.

  • Opérateurs arithmétiques : + (addition) et * (multiplication).

  • Fonctions mathématiques :

    • log(expression) : logarithme naturel
    • exp(expression) : exposant naturel

    Chacune de ces expressions accepte un seul argument, qui est une expression écrite en termes de signal.

    Exemples de fonctions valides : exp(c.document_age) et log(keywordSimilarityScore * 0.2 + 1.0).

  • Fonction de transformation du rang réciproque (rr) : cette fonction est exprimée sous la forme rr(expression, k). Il trie d'abord les documents par valeur de expression dans l'ordre décroissant et leur attribue un rang. Il calcule ensuite la valeur finale à l'aide des expressions 1 / (rank_i + k), où rank_i correspond à la position du document dans la liste triée à partir de 0 et k est un nombre à virgule flottante positif que vous fournissez.

    La fonction rr() transforme tous les scores à la même échelle et élimine le besoin de normalisation supplémentaire.

  • Fonctions de gestion des valeurs "Not a number" (NaN) :

    • is_nan(expression) : lorsque l'expression est évaluée comme étant NaN, par exemple lorsqu'un signal est manquant pour un document, 1 est renvoyé. Sinon, 0 est renvoyé.
    • fill_nan(arg_expression, fill_with_expression) : si arg_expression est une valeur NaN, renvoie fill_with_expression. Sinon, renvoie arg_expression. C'est essentiel pour traiter les documents qui peuvent manquer de certains signaux.

Exemples de formules de classement

  1. Combinaison linéaire élémentaire :

    semantic_similarity_score * 0.7 + keyword_similarity_score * 0.3
    
  2. Formule complexe utilisant le classement réciproque et la gestion des valeurs NaN :

    rr(fill_nan(semantic_similarity_score, 0), 40) * 0.5 + topicality_rank * 0.5
    
  3. Formule complexe utilisant le rang réciproque, la fonction exponentielle et la gestion des valeurs NaN :

    rr(fill_nan(semantic_similarity_score, 0), 40) * 0.2 + exp(keyword_similarity_score) * 0.3 + is_nan(keyword_similarity_score) * 0.1
    

Pour personnaliser le classement de vos documents dans les résultats de recherche, rédigez manuellement une formule et ajoutez-la à votre appel d'API search.

  1. Formulez une expression de classement.

  2. obtenir des résultats de recherche ;

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

    Remplacez les éléments suivants :

Ajuster la formule de classement à l'aide de la bibliothèque Python

Pour les cas d'utilisation plus avancés, il peut être difficile de trouver les pondérations optimales pour votre formule. Pour surmonter ce problème, vous pouvez utiliser la bibliothèque Python de réglage du classement de Vertex AI Search, qui est un outil Open Source, et trouver une formule adaptée à votre cas d'utilisation.

Voici le workflow général :

  1. Préparez un ensemble de données de requêtes avec les libellés de référence correspondants. Ces libellés dorés peuvent être des champs d'identification uniques, tels que l'ID du document, qui peuvent vous aider à associer l'objet SearchResult dans la réponse de recherche.
  2. Pour un ensemble de requêtes représentatives, appelez l'API search pour obtenir les signaux de classement disponibles pour tous les documents renvoyés. Vous trouverez cette information dans le champ SearchResult.rankSignals. Stockez ces données avec vos libellés de référence.
  3. Utilisez la bibliothèque Python pour entraîner un modèle de classement sur cet ensemble de données. Pour en savoir plus, consultez la bibliothèque Python Clearbox.

  4. Convertissez la formule des résultats d'entraînement en expression de classement, que vous pourrez ensuite utiliser dans vos appels d'API.