Aller au contenu principal

Améliorer la qualité de la chaîne RAG

Diagramme des composants de la chaîne RAG qui contribuent à la qualité.

Cet article explique comment vous pouvez améliorer la qualité de l'application RAG en utilisant les composants de la chaîne RAG.

La chaîne RAG prend une query utilisateur en entrée, récupère les information pertinentes pour cette query et génère une réponse appropriée basée sur les données récupérées. Bien que les étapes exactes au sein d'une chaîne RAG puissent varier considérablement en fonction du cas d'utilisation et des exigences, voici les composants clés à prendre en compte lors de la construction de votre chaîne RAG :

  1. Compréhension des requêtes : Analyser et transformer les requêtes des utilisateurs pour mieux représenter l'intention et extraire des informations pertinentes, telles que des filtres ou des mots-clés, afin d'améliorer le processus de récupération.
  2. Récupération : Trouver les morceaux d'information les plus pertinents étant donné une query de récupération. Dans le cas des données non structurées, cela implique généralement une ou une combinaison de recherche sémantique ou par mots-clés.
  3. **Augmentation du Prompt** : Combinaison d'une query utilisateur avec des information récupérées et des instructions pour guider le LLM vers la génération de réponses de haute qualité.
  4. LLM : Sélectionner le modèle le plus approprié (et les parameters du modèle) pour votre application afin d’optimiser/équilibrer les performances, la latence et les coûts.
  5. Post-traitement et garde-fous : application d'étapes de traitement supplémentaires et de mesures de sécurité pour garantir que les réponses générées par le LLM sont pertinentes, factuellement cohérentes et respectent des directives ou des contraintes spécifiques.

En savoir plus sur l'évaluation et l'amélioration itératives de votre application dans 3. Itérer sur la qualité des agents.

Compréhension des requêtes

L'utilisation directe de la query utilisateur comme query de récupération peut fonctionner pour certaines queries. Cependant, il est généralement bénéfique de reformuler la query avant l'étape de récupération. La compréhension des requêtes comprend une étape (ou une série d'étapes) au début d'une chaîne pour analyser et transformer les requêtes utilisateur afin de mieux représenter l'intention, d'extraire les informations pertinentes et finalement d'aider le processus de récupération subséquent. Les approches pour transformer une requête utilisateur afin d'améliorer la récupération incluent :

  1. Réécriture de query : La réécriture de query implique la traduction d'une query utilisateur en une ou plusieurs queries qui représentent mieux l'intention originale. L'objectif est de reformuler la query de manière à augmenter la probabilité que l'étape de récupération trouve les documents les plus pertinents. Cela peut être particulièrement utile lorsque vous traitez des requêtes complexes ou ambiguës qui pourraient ne pas correspondre directement à la terminologie utilisée dans les documents de récupération.

    Exemples :

    • Reformulation de l'historique des conversations dans un chat multi-tours.
    • Correction des fautes d'orthographe dans la query de l'utilisateur
    • Remplacer des mots ou des expressions dans la query utilisateur par des synonymes afin de capturer un éventail plus large de documents pertinents
important

La réécriture de query doit être effectuée conjointement avec les modifications apportées au composant de récupération

  1. Extraction de filtres : Dans certains cas, les query des utilisateurs peuvent contenir des filtres ou des critères spécifiques qui peuvent être utilisés pour affiner les résultats de la recherche. L'extraction de filtres consiste à identifier et à extraire ces filtres de la query et à les transmettre à l'étape de récupération en tant que parameters supplémentaires. Cela peut aider à améliorer la pertinence des documents récupérés en se concentrant sur des sous-ensembles spécifiques des données disponibles.

    Exemples :

    • Extraction de périodes spécifiques mentionnées dans la query, telles que « articles des 6 derniers mois » ou « rapports de 2023 ».
    • Identification des mentions de produits, services ou catégories spécifiques dans la query, tels que « Databricks Professional Services » ou « ordinateurs portables ».
    • Extraction d'entités géographiques de la query, telles que les noms de ville ou les codes de pays.
remarque

L'extraction de filtres doit être effectuée conjointement avec des modifications aux composants d'pipeline de données d'extraction de métadonnées et de chaîne de récupération. L’étape d’extraction des métadonnées doit garantir que les champs de métadonnées pertinents sont disponibles pour chaque document/segment, et l’étape de récupération doit être implémentée pour accepter et appliquer les filtres extraits.

En plus de la réécriture de query et de l'extraction de filtres, une autre considération importante dans la compréhension de la query est de savoir s'il faut utiliser un seul appel LLM ou plusieurs appels. Bien qu'utiliser un seul appel avec un prompt soigneusement élaboré puisse être efficace, il existe des cas où la décomposition du processus de compréhension de la query en plusieurs appels LLM peut conduire à de meilleurs résultats. Ceci, soit dit en passant, est une règle générale applicable lorsque vous essayez d'implémenter un certain nombre d'étapes logiques complexes dans un seul prompt.

Par exemple, vous pourriez utiliser un appel LLM pour classer l'intention de la query, un autre pour extraire les entités pertinentes et un troisième pour réécrire la query basée sur les informations extraites. Bien que cette approche puisse ajouter une certaine latence au processus global, elle permet un contrôle plus précis et peut potentiellement améliorer la qualité des documents récupérés.

Compréhension de query multi-étapes pour un bot de support

Voici à quoi pourrait ressembler un composant de compréhension de query multi-étapes pour un bot de support client :

  1. Classification de l’intention : utilisez un LLM pour classer la query de l’utilisateur dans des catégories prédéfinies, telles que « information sur les produits », « résolution des problèmes » ou « gestion de compte ».
  2. Extraction d'entités : En fonction de l'intention identifiée, utilisez un autre appel LLM pour extraire les entités pertinentes de la query, tels que les noms de produits, les erreurs signalées ou les numéros de compte.
  3. Réécriture de Query : utilisez l'intention et les entités extraites pour réécrire la query originale dans un format plus spécifique et ciblé, par exemple : « Ma chaîne RAG ne parvient pas à se déployer sur Model Serving, je vois l'erreur suivante… ».

Récupération

Le composant de récupération de la chaîne RAG est responsable de la recherche des morceaux d'information les plus pertinents pour une query de récupération donnée. Dans le contexte de données non structurées, la récupération implique généralement une ou une combinaison de recherche sémantique, de recherche par mots-clés et de filtrage des métadonnées. Le choix de la stratégie de récupération dépend des exigences spécifiques de votre application, de la nature des données et des types de requêtes que vous prévoyez de traiter. Comparons ces options :

  1. Recherche sémantique : la recherche sémantique utilise un modèle d'intégration pour convertir chaque segment de texte en une représentation vectorielle qui capture son sens sémantique. En comparant la représentation vectorielle de la query de récupération avec les représentations vectorielles des segments, la recherche sémantique peut récupérer des documents conceptuellement similaires, même s'ils ne contiennent pas les mots-clés exacts de la query.
  2. Recherche par mots-clés : La recherche par mots-clés détermine la pertinence des documents en analysant la fréquence et la distribution des mots partagés entre la query de récupération et les documents indexés. Plus les mêmes mots apparaissent souvent dans la query et un document, plus le score de pertinence attribué à ce document est élevé.
  3. Recherche hybride : la recherche hybride combine les atouts de la recherche sémantique et de la recherche par mots-clés en employant un processus de récupération en deux étapes. Tout d'abord, elle effectue une recherche sémantique pour récupérer un ensemble de documents conceptuellement pertinents. Ensuite, elle applique une recherche basée sur les mots-clés sur cet ensemble réduit pour affiner davantage les résultats en fonction des correspondances exactes de mots-clés. Enfin, il combine les scores des deux étapes pour classer les documents.

Comparer les stratégies de récupération

Le tableau suivant met en contraste chacune de ces stratégies de récupération les unes par rapport aux autres :

Recherche sémantique

Recherche par mot-clé

Recherche hybride

Explication simple

Si les mêmes concepts apparaissent dans la query et un document potentiel, ils sont pertinents.

Si les mêmes mots apparaissent dans la query et un document potentiel, ils sont pertinents. Plus il y a de mots de la query dans le document, plus ce document est pertinent.

Exécute À LA FOIS une recherche sémantique et une recherche par mot-clé, puis combine les résultats.

Exemple de cas d'usage

Support client où les requêtes des utilisateurs sont différentes des mots des manuels des produits. Exemple : « comment allumer mon téléphone ? » et la section du manuel s'intitule « activer/désactiver l'alimentation ».

Support client où les requêtes contiennent des termes techniques spécifiques et non descriptifs. Exemple : « que fait le modèle HD7-8D ? »

Requêtes de support client qui combinaient des termes sémantiques et techniques. Exemple : « Comment puis-je allumer mon HD7-8D ? »

Approches techniques

Utilise des plongements pour représenter le texte dans un espace vectoriel continu, permettant la recherche sémantique.

Repose sur des méthodes discrètes basées sur des jetons telles que bag-of-words, TF-IDF, BM25 pour la correspondance de mots-clés.

Utilisez une approche de reclassement pour combiner les résultats, telle que la fusion de rang réciproque ou un modèle de reclassement.

Points forts

Récupération d'informations contextuellement similaires à une query, même si les mots exacts ne sont pas utilisés.

Scénarios exigeant des correspondances de mots clés précises, idéales pour les queries axées sur des termes spécifiques, tels que les noms de produits.

Combine le meilleur des deux approches.

Recherche sémantique

Recherche par mot-clé

Recherche hybride

Explication simple

Si les mêmes concepts apparaissent dans la query et un document potentiel, ils sont pertinents.

Si les mêmes mots apparaissent dans la query et un document potentiel, ils sont pertinents. Plus il y a de mots de la query dans le document, plus ce document est pertinent.

Exécute À LA FOIS une recherche sémantique et une recherche par mot-clé, puis combine les résultats.

Exemple de cas d'usage

Support client où les requêtes des utilisateurs sont différentes des mots des manuels des produits. Exemple : « comment allumer mon téléphone ? » et la section du manuel s'intitule « activer/désactiver l'alimentation ».

Support client où les requêtes contiennent des termes techniques spécifiques et non descriptifs. Exemple : « que fait le modèle HD7-8D ? »

Requêtes de support client qui combinaient des termes sémantiques et techniques. Exemple : « Comment puis-je allumer mon HD7-8D ? »

Approches techniques

Utilise des plongements pour représenter le texte dans un espace vectoriel continu, permettant la recherche sémantique.

Repose sur des méthodes discrètes basées sur des jetons telles que bag-of-words, TF-IDF, BM25 pour la correspondance de mots-clés.

Utilisez une approche de reclassement pour combiner les résultats, telle que la fusion de rang réciproque ou un modèle de reclassement.

Points forts

Récupération d'informations contextuellement similaires à une query, même si les mots exacts ne sont pas utilisés.

Scénarios exigeant des correspondances de mots clés précises, idéales pour les queries axées sur des termes spécifiques, tels que les noms de produits.

Combine le meilleur des deux approches.

Moyens d'améliorer le processus de récupération

En plus de ces stratégies de récupération principales, il existe plusieurs techniques que vous pouvez appliquer pour améliorer davantage le processus de récupération :

  • Extension de query : l'extension de query peut aider à capturer une plus large gamme de documents pertinents en utilisant plusieurs variations de la query de récupération. Cela peut être réalisé en effectuant des recherches individuelles pour chaque query étendue, ou en utilisant une concaténation de toutes les queries de recherche étendues dans une seule query de récupération.
remarque

L'expansion des query doit être effectuée conjointement avec des modifications du composant de compréhension des query (chaîne RAG). Les multiples variations d'une query de récupération sont généralement générées à cette étape.

  • Réorganisation : Après avoir récupéré un ensemble initial de segments, appliquez des critères de classement supplémentaires (par exemple, tri par heure) ou un modèle de réorganisation pour réordonner les résultats. La réorganisation peut aider à prioriser les segments les plus pertinents étant donné une requête de récupération spécifique. La réorganisation avec des modèles cross-encoder tels que mxbai-rerank et ColBERTv2 peut améliorer les performances de récupération.
  • Filtrage des métadonnées : utilisez les filtres de métadonnées extraits de l'étape de compréhension de la query pour affiner l'espace de recherche en fonction de critères spécifiques. Les filtres de métadonnées peuvent inclure des attributs tels que le type de document, la date de création, l'auteur ou les tags spécifiques au domaine. En combinant les filtres de métadonnées avec une recherche sémantique ou par mots-clés, vous pouvez créer une récupération plus ciblée et plus efficace.
remarque

Le filtrage des métadonnées doit être effectué conjointement avec les modifications apportées à la compréhension des query (chaîne RAG) et aux composants d'extraction des métadonnées (pipeline de données).

Enrichissement du prompt

L'augmentation de prompt est l'étape où la query utilisateur est combinée aux informations récupérées et aux instructions dans un template de prompt pour guider le modèle linguistique vers la génération de réponses de haute qualité. L'itération sur ce template pour optimiser le prompt fourni au LLM (AKA ingénierie de prompt ) est requise pour s'assurer que le modèle est guidé pour produire des réponses précises, fondées et cohérentes.

Il existe de nombreux guides sur l'ingénierie de prompt, mais voici quelques considérations à garder à l'esprit lorsque vous itérez sur le prompt template :

  1. Fournir des exemples

    • Incluez des exemples de queries bien formulées et leurs réponses idéales correspondantes dans le Template d'invite lui-même (« few-shot learning »). Cela aide le modèle à comprendre le format, le style et le contenu souhaités des réponses.
    • Une façon utile de trouver de bons exemples est d'identifier les types de requêtes avec lesquels votre chaîne rencontre des difficultés. Créez des réponses gold-standard pour ces queries et incluez-les comme exemples dans l'invite.
    • Assurez-vous que les exemples que vous fournissez sont représentatifs des user queries que vous anticipez au moment de l’inférence. Visez à couvrir un large éventail de queries attendues pour aider le modèle à mieux généraliser.
  2. Paramétrer votre Template de prompt

    • Concevez votre prompt Template de manière flexible en le paramétrant pour incorporer des informations supplémentaires au-delà des données récupérées et de la query de l'utilisateur. Il peut s'agir de variables telles que la date actuelle, le contexte utilisateur ou d'autres métadonnées pertinentes.
    • L'injection de ces variables dans l'invite au moment de l'inférence peut permettre des réponses plus personnalisées ou contextuelles.
  3. Envisagez la chaîne de pensée.

    • Pour les queries complexes où les réponses directes ne sont pas immédiatement évidentes, envisagez le prompting par chaîne de pensée (CoT). Cette stratégie d'ingénierie des prompts décompose les questions compliquées en étapes plus simples et séquentielles, guidant le LLM à travers un processus de raisonnement logique.
    • En incitant le modèle à « réfléchir au problème étape par étape », vous l'encouragez à fournir des réponses plus détaillées et mieux argumentées, ce qui peut être particulièrement efficace pour gérer des query multi-étapes ou ouvertes.
  4. Les prompts peuvent ne pas être transférables entre les modèles

    • Reconnaissez que les invites ne se transfèrent souvent pas de manière transparente entre les différents modèles de langage. Chaque modèle possède ses propres caractéristiques, de sorte qu'une invite efficace pour un modèle peut ne pas l'être autant pour un autre.
    • Expérimentez avec différents formats et longueurs de prompts, consultez les guides en ligne (tels que l'OpenAI Cookbook ou l'Anthropic cookbook), et soyez prêt à adapter et affiner vos prompts lors du passage d'un modèle à l'autre.

LLM

Le composant de génération de la chaîne RAG prend le Template de prompt augmenté de l'étape précédente et le transmet à un LLM. Lors de la sélection et de l'optimisation d'un LLM pour le composant de génération d'une chaîne RAG, tenez compte des facteurs suivants, qui sont également applicables à toutes les autres étapes impliquant des appels de LLM :

  1. Expérimentez avec différents modèles prêts à l'emploi.

    • Chaque modèle possède ses propres propriétés uniques, forces et faiblesses. Certains modèles peuvent avoir une meilleure compréhension de certains domaines ou fonctionner mieux sur des tâches spécifiques.
    • Comme mentionné précédemment, gardez à l'esprit que le choix du modèle peut également influencer le processus d'ingénierie de prompt, car différents modèles peuvent répondre différemment aux mêmes prompts.
    • S'il y a plusieurs étapes dans votre chaîne qui nécessitent un LLM, telles que des appels pour la compréhension de la query en plus de l'étape de génération, envisagez d'utiliser des modèles différents pour les différentes étapes. Des modèles plus coûteux et à usage général peuvent être excessifs pour des tâches telles que la détermination de l’intention d’une query utilisateur.
  2. start modestement et monter en charge au besoin.

    • Bien qu'il puisse être tentant de se tourner immédiatement vers les modèles les plus puissants et les plus performants disponibles (dont GPT-4, Claude), il est souvent plus efficace de start par des modèles plus petits et plus légers.
    • Dans de nombreux cas, des alternatives open source plus petites comme Llama 3 peuvent fournir des résultats satisfaisants à moindre coût et avec des temps d'inférence plus rapides. Ces modèles peuvent être particulièrement efficaces pour les tâches qui ne nécessitent pas un raisonnement très complexe ou une connaissance approfondie du monde.
    • Au fur et à mesure que vous développez et affinez votre chaîne RAG, évaluez continuellement les performances et les limites du modèle choisi. Si vous constatez que le modèle a des difficultés avec certains types de queries ou ne parvient pas à fournir des réponses suffisamment détaillées ou précises, envisagez de monter en charge vers un modèle plus performant.
    • Surveillez l'impact des changements de modèles sur les indicateurs clés tels que la qualité des réponses, la latence et le coût pour vous assurer que vous trouvez le juste équilibre pour les exigences de votre cas d'utilisation spécifique.
  3. Optimiser les paramètres du modèle

    • Expérimentez avec différents paramètres pour trouver l'équilibre optimal entre la qualité de la réponse, la diversité et la cohérence. Par exemple, ajuster la température peut contrôler le caractère aléatoire du texte généré, tandis que max_tokens peut limiter la longueur de la réponse.
    • Sachez que les paramètres optimaux peuvent varier en fonction de la tâche spécifique, du prompt et du style de sortie souhaité. Testez et affinez de manière itérative ces paramètres en fonction de l'évaluation des réponses générées.
  4. Affinement spécifique à la tâche

    • À mesure que vous affinez les performances, envisagez d'affiner des modèles plus petits pour des sous-tâches spécifiques au sein de votre chaîne RAG, telles que la compréhension des queries.
    • En entraînant des modèles spécialisés pour des tâches individuelles avec la chaîne RAG, vous pouvez potentiellement améliorer les performances globales, réduire la latence et diminuer les coûts d'inférence par rapport à l'utilisation d'un seul grand modèle pour toutes les tâches.
  5. Pré-formation continue

    • Si votre application RAG traite un domaine spécialisé ou nécessite des connaissances qui ne sont pas bien représentées dans le LLM pré-entraîné, envisagez d'effectuer un pré-entraînement continu (CPT) sur des données spécifiques au domaine.
    • Le pré-entraînement continu peut améliorer la compréhension d'un modèle de la terminologie ou des concepts spécifiques propres à votre domaine. À son tour, cela peut réduire le besoin d'une ingénierie de prompt étendue ou d'exemples few-shot.

Post-traitement et garde-fous

Une fois que le LLM a généré une réponse, il est souvent nécessaire d'appliquer des techniques de post-traitement ou des garde-fous pour s'assurer que la sortie répond aux exigences de format, de style et de contenu souhaitées. Cette dernière étape (ou ces multiples étapes) de la chaîne peut aider à maintenir la cohérence et la qualité des réponses générées. Si vous implémentez un post-traitement et des garde-fous, veuillez considérer les points suivants :

  1. Application du format de sortie

    • Selon votre cas d'utilisation, vous pourriez avoir besoin que les réponses générées adhèrent à un format spécifique, tel qu'un Template structuré ou un type de fichier particulier (tel que JSON, HTML, Markdown, etc.).
    • Si une sortie structurée est requise, des bibliothèques telles que Instructor ou Outlines constituent de bons points de départ pour implémenter ce type d'étape de validation.
    • Lors du développement, prenez le temps de vous assurer que l'étape de post-traitement est suffisamment flexible pour gérer les variations des réponses générées tout en conservant le format requis.
  2. Maintien de la cohérence du style

    • Si votre application RAG a des consignes de style spécifiques ou des exigences de ton (par exemple, formel ou décontracté, concis ou détaillé), une étape de post-traitement peut à la fois vérifier et appliquer ces attributs de style à travers les réponses générées.
  3. Filtres de contenu et garde-fous de sécurité

  4. Gestion des hallucinations

    • Se défendre contre les hallucinations peut également être mis en œuvre comme une étape de post-traitement. Cela peut impliquer le recoupement de la sortie générée avec des documents récupérés, ou l'utilisation de LLM supplémentaires pour valider l'exactitude factuelle de la réponse.
    • Développez des mécanismes de fallback pour gérer les cas où la réponse générée ne répond pas aux exigences d'exactitude factuelle, tels que la génération de réponses alternatives ou la fourniture d'avis de non-responsabilité à l'utilisateur.
  5. Gestion des erreurs

    • Avec toutes les étapes de post-traitement, mettez en œuvre des mécanismes pour gérer avec élégance les cas où l'étape rencontre un problème ou ne parvient pas à générer une réponse satisfaisante. Cela pourrait impliquer la génération d'une réponse par default, ou la transmission du problème à un opérateur humain pour un examen manuel.