Articles de blog

Recherche à facettes : Utiliser l'IA pour améliorer la portée et les résultats de la recherche

Découvrez comment utiliser la recherche par facettes dans Elasticsearch pour restreindre rapidement les options au sein des catégories.

Dans cet article, nous verrons comment l'intelligence artificielle (IA), et plus particulièrement l'utilisation de modèles linguistiques avancés tels que GPT-4, peut contribuer à créer des facettes plus contextuelles, les rendant encore plus pertinentes et utiles pour les utilisateurs.

La recherche par facettes est un outil puissant dans les plateformes de commerce électronique. Il permet d'organiser et d'affiner les résultats de la recherche en fonction des caractéristiques des éléments affichés. Souvent confondues avec les filtres, les facettes fonctionnent différemment. Les filtres sont des attributs fixes, définis par des informations toujours présentes dans l'index, telles que la catégorie ou le format d'un produit. Les facettes, quant à elles, sont dynamiques et générées à partir des résultats renvoyés par la recherche exécutée.

Imaginez un catalogue de vêtements : des champs tels que "category" (par exemple, t-shirts, pantalons) ou "gender" (par exemple, homme, femme) sont des filtres qui permettent d'affiner les résultats. Les facettes, quant à elles, reflètent des caractéristiques spécifiques des produits apparaissant dans les résultats, telles que les couleurs communes, les tailles disponibles ou les matériaux. Cela permet une expérience de recherche plus adaptable et contextuelle.

Voici une image dans laquelle nous interagissons avec une facette et pouvons voir les résultats de la recherche filtrés par celle-ci.

Exemple de recherche à facettes

Comment l'IA peut améliorer la génération de facettes

L'intelligence artificielle est souvent associée à la recherche sémantique et aux enchâssements, mais qu'en est-il des facettes ? Comment l'IA peut-elle être exploitée pour rendre les facettes plus utiles et plus adaptées au contexte de chaque recherche ?

Une possibilité intéressante consiste à utiliser l'IA pour créer de nouvelles catégorisations qui vont au-delà des classifications traditionnelles de l'index. En analysant les caractéristiques spécifiques du contenu, ces nouvelles catégories peuvent fournir une contextualisation plus riche et plus précise, rendant les facettes plus pertinentes et mieux adaptées aux besoins des utilisateurs. Cela permet d'affiner les résultats de manière plus significative par rapport aux catégories de documents originales.

Comment l'IA peut affiner les classifications de films pour de meilleures recherches

Analysons les films suivants, tous classés actuellement dans le genre dramatique :

  • Requiem for a Dream Résumé : Les utopies induites par la drogue de quatre habitants de Coney Island sont brisées lorsque leurs addictions deviennent profondes.

  • American Beauty CV : Un père de famille de banlieue, sexuellement frustré, traverse une crise de la quarantaine après s'être entiché de la meilleure amie de sa fille.

  • Good Will Hunting CV : Will Hunting, concierge au M.I.T., est doué pour les mathématiques, mais a besoin de l'aide d'un psychologue pour trouver un sens à sa vie.

Cette classification des genres ne rend pas compte des différences subtiles ou des contextes uniques de chaque film. En exploitant l'IA pour analyser les synopsis et les thèmes centraux, nous pouvons créer de nouvelles catégories qui reflètent mieux le véritable contexte de chaque film. Par exemple :

  • Requiem for a Dream - Nouvelle catégorie : "Addiction et dépendance"

  • American Beauty - Nouvelle catégorie : "Crise de la quarantaine"

  • Good Will Hunting - Nouvelle catégorie : "Lutte intellectuelle"

Ces nouvelles catégories rendent les recherches beaucoup plus précises tout en offrant aux utilisateurs des filtres plus significatifs pour affiner leurs résultats. Cette approche est particulièrement efficace lorsque les catégories d'origine sont trop génériques, ce qui permet aux utilisateurs de trouver plus facilement ce qu'ils recherchent.

Créer de nouvelles catégories avec GPT-4 : exemple de recherche à facettes

Dans cet exemple, nous montrerons comment un modèle d'IA peut être utilisé pour créer de nouvelles catégories de films qui sont plus précises et alignées sur le contexte de chaque œuvre. Pour démontrer ce processus, nous utiliserons le pipeline de simulation Elastic avec le service d'inférence OpenAI. Un pipeline comprenant plusieurs processeurs sera créé, dont le processeur de script, qui sera chargé de créer l'invite à exécuter dans le processeur d'inférence, capable de déterminer les nouvelles catégories. Les autres processeurs seront utilisés pour manipuler les données et les champs auxiliaires générés pendant l'exécution du pipeline. Il convient de mentionner que cette logique peut également être appliquée à d'autres outils ou modèles similaires.

Tout d'abord, nous devons créer le point de terminaison de l'inférence, où nous définissons le service comme OpenAI, le jeton requis pour accéder au service et le modèle. Dans cet exemple, j'utilise gpt-4o-mini. Pour plus de détails sur le service d'inférence OpenAI, cliquez ici.

PUT _inference/completion/generate_topics_ia
{
    "service": "openai",
    "service_settings": {
        "api_key": "your-token",
        "model_id": "gpt-4o-mini"
    }
}

Le point final étant créé, nous sommes maintenant prêts à l'utiliser pour créer les nouvelles catégories. Vous trouverez ci-dessous un pipeline qui prend en charge l'ensemble du processus de manipulation des données des documents et de génération des messages. Je vais expliquer en détail la fonction de chaque processeur.

Le premier processeur sera chargé de construire l'invite. Il est très important de détailler clairement les instructions afin que l'IA puisse analyser et identifier correctement les sujets. Dans ce questionnaire, je demande 2 sujets basés sur l'analyse du titre, de la description et des genres des films.

{
        "script": {
          "source": """
            ctx.prompt = "You are an expert in semantic analysis and audiovisual content categorization. Your task is to generate only subcategories (max 2 topics) that describe specific aspects of movies based on their genres and descriptions. The output should be like: 'n1, n2, ...n'. Here is a movie info to analyze: Title: " + ctx.title  + "Genres: " + ctx.genres  + "Description: " + ctx.description;
          """
        }

Le pipeline suivant est le pipeline d'inférence, il recevra l'invite et l'enverra à notre point de terminaison generate_topics_ia. La réponse générée par le modèle sera stockée dans le champ résultat.

{
        "inference": {
          "model_id": "generate_topics_ia",
          "input_output": {
            "input_field": "prompt",
            "output_field": "result"
          }
        }
      }

Ensuite, nous avons trois processeurs utilisés pour manipuler la réponse et la placer dans le champ des sujets, en plus de supprimer les champs temporaires que j'ai créés.

En exécutant ce pipeline, nous obtiendrons les résultats ci-dessous :

{
  "docs": [
    {
      "doc": {
        "_index": "index",
        "_version": "-3",
        "_id": "1",
        "_source": {
          "description": "While Frodo and Sam edge closer to Mordor with the help of the shifty Gollum, the divided fellowship makes a stand against Sauron's new ally, Saruman, and his hordes of Isengard.",
          "model_id": "generate_topics_ia",
          "title": "The Lord of the Rings: The Fellowship of the Ring",
          "genres": [
            "Action",
            "Adventure",
            "Drama"
          ],
          "topics": [
            "Fantasy",
            "Quest"
          ]
        },
        "_ingest": {
          "timestamp": "2024-11-22T17:51:51.340010257Z"
        }
      }
    },
    {
      "doc": {
        "_index": "index",
        "_version": "-3",
        "_id": "2",
        "_source": {
          "description": "A team of explorers travel through a wormhole in space in an attempt to ensure humanity's survival.",
          "model_id": "generate_topics_ia",
          "title": "Interstellar",
          "genres": [
            "Adventure",
            "Drama",
            "Sci-Fi"
          ],
          "topics": [
            "space exploration",
            "human survival"
          ]
        },
        "_ingest": {
          "timestamp": "2024-11-22T17:51:51.340413173Z"
        }
      }
    },
    {
      "doc": {
        "_index": "index",
        "_version": "-3",
        "_id": "3",
        "_source": {
          "description": "An astronaut becomes stranded on Mars after his team assume him dead, and must rely on his ingenuity to find a way to signal to Earth that he is alive.",
          "model_id": "generate_topics_ia",
          "title": "The Martian",
          "genres": [
            "Adventure",
            "Drama",
            "Sci-Fi"
          ],
          "topics": [
            "survival",
            "ingenuity"
          ]
        },
        "_ingest": {
          "timestamp": "2024-11-22T17:51:51.340427965Z"
        }
      }
    }
  ]
}

Il est à noter que nous avons de nouvelles catégories qui sont plus en rapport avec le contexte des films, même si certains d'entre eux sont initialement du même genre.

Nous pouvons maintenant utiliser ces nouvelles catégories et les indexer avec le document. Ainsi, lors de la génération des facettes, en plus de la catégorie principale, nous avons des sous-catégories plus spécifiques qui sont alignées sur le contexte des films.

En outre, il est possible de vectoriser ces nouvelles catégories et de les utiliser dans des recherches vectorielles. Cela signifie que les nouvelles catégories ne servent pas seulement de filtres, mais qu'elles peuvent également être utilisées pour calculer les similitudes sémantiques avec les termes de recherche, ce qui augmente encore la pertinence des résultats présentés.

Pipeline complet :

POST /_ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "script": {
          "source": """
            ctx.prompt = "You are an expert in semantic analysis and audiovisual content categorization. Your task is to generate only subcategories (max 2 topics) that describe specific aspects of movies based on their genres and descriptions. The output should be like string: 'n1, n2m ...n'. Here is a movies info to analyze: Title: " + ctx.title  + "Genres: " + ctx.genres  + "Description: " + ctx.description;
          """
        }
      },
      {
        "inference": {
          "model_id": "generate_topics_ia",
          "input_output": {
            "input_field": "prompt",
            "output_field": "result"
          }
        }
      },
      {
        "split": {
          "field": "result",
          "target_field": "topics",
          "separator": ", "
        }
      },
      {
        "remove": {
          "field": "result"
        }
      },
      {
        "remove": {
          "field": "prompt"
        }
      }
    ]
  },
  "docs": [
    {
      "_index": "index",
      "_id": "1",
      "_source": {
        "title": "The Lord of the Rings: The Fellowship of the Ring",
        "description": "While Frodo and Sam edge closer to Mordor with the help of the shifty Gollum, the divided fellowship makes a stand against Sauron's new ally, Saruman, and his hordes of Isengard.",
        "genres": [
          "Action",
          "Adventure",
          "Drama"
        ]
      }
    },
    {
      "_index": "index",
      "_id": "2",
      "_source": {
        "title": "Interstellar",
        "description": "A team of explorers travel through a wormhole in space in an attempt to ensure humanity's survival.",
        "genres": [
          "Adventure", "Drama", "Sci-Fi"
        ]
      }
    },
    {
      "_index": "index",
      "_id": "3",
      "_source": {
        "title": "The Martian",
        "description": "An astronaut becomes stranded on Mars after his team assume him dead, and must rely on his ingenuity to find a way to signal to Earth that he is alive.",
        "genres": [
          "Adventure", "Drama", "Sci-Fi"
        ]
      }
    }
  ]
}

Conclusion

L'utilisation de l'IA pour améliorer les facettes peut transformer l'expérience de recherche en rendant les résultats plus spécifiques et contextuels. Contrairement aux catégories fixes, qui sont souvent larges, les catégories générées par l'IA peuvent mieux refléter le contexte. Par exemple, lors de la reclassification des films, nous pouvons saisir le contexte qui échappe aux catégories primaires, ce qui permet d'obtenir des regroupements beaucoup plus pertinents.

Ces nouvelles catégories peuvent être ajoutées à l'index non seulement pour améliorer les facettes, mais aussi pour permettre des recherches vectorielles. Il en résulte une expérience de recherche plus efficace, avec des filtres mieux adaptés au contexte.

Références

https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-openai.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/simulate-pipeline-api.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/script-processor.html

Questions fréquentes

Qu'est-ce que la recherche à facettes ?

La recherche à facettes est un outil des plateformes de commerce électronique. Il permet d'organiser et d'affiner les résultats de la recherche en fonction des caractéristiques des éléments affichés.

Comment l'IA peut-elle améliorer la recherche à facettes ?

L'IA peut améliorer la génération de facettes dans la recherche en créant de nouvelles catégorisations qui vont au-delà des classifications traditionnelles dans l'index, rendant les résultats plus spécifiques et contextuels.

Pour aller plus loin

Techniques avancées de RAG, partie 2 : Requêtes et tests

Han Xiang Choong

Résolution d'entités avec Elasticsearch, partie 4 : le défi ultime

Jessica Moszkowicz

Automatisation de l'analyse des logs dans Streams avec le ML

Nastia Havriushenko

Construire un agent d'IA pour les RH avec Elastic Agent Builder et GPT-OSS

Tomás Murúa

Techniques avancées de RAG partie 1 : Traitement des données

Han Xiang Choong

Prêt à créer des expériences de recherche d'exception ?

Une recherche suffisamment avancée ne se fait pas avec les efforts d'une seule personne. Elasticsearch est alimenté par des data scientists, des ML ops, des ingénieurs et bien d'autres qui sont tout aussi passionnés par la recherche que vous. Mettons-nous en relation et travaillons ensemble pour construire l'expérience de recherche magique qui vous permettra d'obtenir les résultats que vous souhaitez.

Jugez-en par vous-même