Comment améliorer les performances de votre pipeline RAG
La popularité croissante des applicationsRAG (Retrieval Augmented Generation) s'accompagne d'une préoccupation grandissante pour l'amélioration de leurs performances. Cet article présente toutes les façons possibles d'optimiser les pipelines RAG et fournit des illustrations correspondantes pour vous aider à comprendre rapidement les principales stratégies d'optimisation RAG.
Il est important de noter que nous ne fournirons qu'une exploration de haut niveau de ces stratégies et techniques, en nous concentrant sur la façon dont elles s'intègrent dans un système RAG. Cependant, nous n'entrerons pas dans les détails complexes et ne vous guiderons pas dans la mise en œuvre étape par étape.
Un pipeline RAG standard
Le diagramme ci-dessous illustre le pipeline RAG vanille le plus simple. Tout d'abord, les morceaux de documents sont chargés dans un magasin de vecteurs (comme Milvus ou Zilliz cloud). Ensuite, le magasin de vecteurs récupère les K morceaux les plus pertinents par rapport à la requête. Ces morceaux pertinents sont ensuite injectés dans l'invite contextuelle du LLM, et enfin, le LLM renvoie la réponse finale.
Différents types de techniques d'amélioration des RAG
Nous pouvons classer les différentes approches d'amélioration des RAG en fonction de leur rôle dans les étapes du pipeline des RAG.
- Amélioration des requêtes: Modifier et manipuler le processus d'interrogation de l'entrée RAG pour mieux exprimer ou traiter l'intention de l'interrogation.
- Amélioration de l'indexation: Optimisation de la création d'index de regroupement à l'aide de techniques telles que le regroupement multiple, l'indexation par étapes ou l'indexation multivoie.
- Amélioration de la recherche: Application de techniques et de stratégies d'optimisation au cours du processus de recherche.
- Amélioration du générateur: Ajustement et optimisation des messages-guides lors de l'assemblage des messages-guides pour le LLM afin de fournir de meilleures réponses.
- Amélioration du pipeline RAG: Changement dynamique des processus dans l'ensemble du pipeline RAG, y compris l'utilisation d'agents ou d'outils pour optimiser les étapes clés du pipeline RAG.
Nous présenterons ensuite des méthodes spécifiques pour chacune de ces catégories.
Amélioration des requêtes
Nous allons explorer quatre méthodes efficaces pour améliorer l'expérience de la recherche : Les questions hypothétiques, l'intégration de documents hypothétiques, les sous-requêtes et les invitations à revenir en arrière.
Création de questions hypothétiques
La création de questions hypothétiques implique l'utilisation d'un LLM pour générer plusieurs questions que les utilisateurs pourraient poser sur le contenu de chaque fragment de document. Avant que la requête réelle de l'utilisateur n'atteigne le LLM, le magasin de vecteurs récupère les questions hypothétiques les plus pertinentes liées à la requête réelle, ainsi que les morceaux de documents correspondants, et les transmet au LLM.
Cette méthodologie contourne le problème de l'asymétrie entre domaines dans le processus de recherche vectorielle en s'engageant directement dans des recherches de requête à requête, ce qui allège le fardeau des recherches vectorielles. Cependant, elle introduit une surcharge et une incertitude supplémentaires dans la génération de questions hypothétiques.
HyDE (Hypothetical Document Embeddings)
HyDE est l'acronyme de Hypothetical Document Embeddings. Il s'appuie sur un LLM pour élaborer un "document hypothétique" ou une fausse réponse en réponse à une requête de l'utilisateur dépourvue d'informations contextuelles. Cette réponse fictive est ensuite convertie en vecteurs intégrés et utilisée pour interroger les morceaux de documents les plus pertinents dans une base de données vectorielle. Par la suite, la base de données vectorielle récupère les Top-K morceaux de documents les plus pertinents et les transmet au LLM et à la requête originale de l'utilisateur pour générer la réponse finale.
Cette méthode est similaire à la technique de la question hypothétique pour traiter l'asymétrie entre domaines dans les recherches vectorielles. Cependant, elle présente également des inconvénients, tels que les coûts de calcul supplémentaires et les incertitudes liées à la génération de fausses réponses.
Pour plus d'informations, consultez le document HyDE.
Création de sous-requêtes
Lorsqu'une requête d'utilisateur est trop compliquée, nous pouvons utiliser un LLM pour la décomposer en sous-requêtes plus simples avant de les transmettre à la base de données vectorielle et au LLM. Prenons un exemple.
Imaginons qu'un utilisateur demande :"Quelles sont les différences de fonctionnalités entre Milvus et Zilliz Cloud ?" Cette question est assez complexe et pourrait ne pas avoir de réponse directe dans notre base de connaissances. Pour répondre à cette question, nous pouvons la diviser en deux sous-questions plus simples :
- Sous-requête 1 : "Quelles sont les caractéristiques de Milvus ?"
- Sous-requête 2 : "Quelles sont les caractéristiques de Zilliz Cloud ?"
Une fois que nous disposons de ces sous-requêtes, nous les envoyons toutes à la base de données vectorielles après les avoir converties en encastrements vectoriels. La base de données vectorielle trouve ensuite les morceaux de documents Top-K les plus pertinents pour chaque sous-requête. Enfin, le LLM utilise ces informations pour générer une meilleure réponse.
En décomposant la requête de l'utilisateur en sous-requêtes, nous permettons à notre système de trouver plus facilement des informations pertinentes et de fournir des réponses précises, même à des questions complexes.
Création d'invites de retour en arrière
Un autre moyen de simplifier les requêtes complexes des utilisateurs consiste à créer des invites de retour en arrière. Cette technique consiste à abstraire les requêtes complexes des utilisateurs en "questions de retour en arrière"** à l'aide d'un LLM. Ensuite, une base de données vectorielle utilise ces questions pour extraire les morceaux de documents les plus pertinents. Enfin, le LLM génère une réponse plus précise sur la base de ces morceaux de documents récupérés.
Illustrons cette technique par un exemple. Considérons la requête suivante, qui est assez complexe et à laquelle il n'est pas facile de répondre directement :
Requête originale de l'utilisateur : "J'ai un ensemble de données contenant 10 milliards d'enregistrements et je souhaite le stocker dans Milvus pour l'interroger. Est-ce possible ?"
Pour simplifier cette demande de l'utilisateur, nous pouvons utiliser un LLM pour générer une question de retour en arrière plus simple :
Question de retour en arrière : "Quelle est la taille limite de l'ensemble de données que Milvus peut traiter ?"
Cette méthode peut nous aider à obtenir des réponses meilleures et plus précises à des requêtes complexes. Elle décompose la question initiale en une forme plus simple, ce qui permet à notre système de trouver plus facilement des informations pertinentes et de fournir des réponses précises.
Amélioration de l'indexation
L'amélioration de l'indexation est une autre stratégie pour améliorer les performances de vos applications RAG. Examinons trois techniques d'amélioration de l'indexation.
Fusionner automatiquement des morceaux de documents
Lors de la construction d'un index, nous pouvons utiliser deux niveaux de granularité : les morceaux enfants et les morceaux parents correspondants. Dans un premier temps, nous recherchons les morceaux enfants à un niveau de détail plus fin. Ensuite, nous appliquons une stratégie de fusion : si un nombre spécifique, n, de morceaux enfants des k premiers morceaux enfants appartiennent au même morceau parent, nous fournissons ce morceau parent au LLM en tant qu'information contextuelle.
Cette méthodologie a été mise en œuvre dans LlamaIndex.
Construction d'index hiérarchiques
Lors de la création d'index pour les documents, nous pouvons établir un index à deux niveaux : un pour les résumés de documents et un autre pour les morceaux de documents. Le processus de recherche vectorielle comprend deux étapes : dans un premier temps, nous filtrons les documents pertinents sur la base du résumé et, dans un deuxième temps, nous récupérons les morceaux de documents correspondants exclusivement à l'intérieur de ces documents pertinents.
Cette approche s'avère bénéfique dans les situations impliquant des volumes de données importants ou dans les cas où les données sont hiérarchisées, comme la recherche de contenu dans une collection de bibliothèque.
Recherche hybride et reclassement
La technique de recherche hybride et de reclassement intègre une ou plusieurs méthodes de recherche supplémentaires à la recherche par similarité vectorielle. Ensuite, un reranker classe les résultats récupérés en fonction de leur pertinence par rapport à la requête de l'utilisateur.
Les algorithmes de recherche supplémentaires courants comprennent des méthodes basées sur la fréquence lexicale, comme BM25, ou des modèles de grande taille utilisant des encastrements épars, comme Splade. Les algorithmes de reclassement comprennent la méthode RRF ou des modèles plus sophistiqués tels que Cross-Encoder, qui s'apparente aux architectures de type BERT.
Cette approche s'appuie sur diverses méthodes de recherche pour améliorer la qualité de la recherche et combler les lacunes potentielles dans le rappel des vecteurs.
Amélioration du récupérateur
Le perfectionnement de l'élément de récupération au sein du système RAG peut également améliorer les applications RAG. Examinons quelques méthodes efficaces pour améliorer le récupérateur.
Récupération de la fenêtre de phrase
Dans un système RAG de base, le morceau de document donné au LLM est une fenêtre plus large qui englobe le morceau d'encastrement récupéré. Cela garantit que les informations fournies au LLM comprennent une gamme plus large de détails contextuels, minimisant ainsi la perte d'informations. La technique de récupération par fenêtre de phrase découple le morceau de document utilisé pour la récupération de l'intégration du morceau fourni au LLM.
Cependant, l'extension de la taille de la fenêtre peut introduire des informations parasites supplémentaires. Nous pouvons ajuster la taille de l'expansion de la fenêtre en fonction des besoins spécifiques de l'entreprise.
Filtrage des métadonnées
Pour garantir des réponses plus précises, nous pouvons affiner les documents récupérés en filtrant les métadonnées telles que l'heure et la catégorie avant de les transmettre au LLM. Par exemple, si des rapports financiers couvrant plusieurs années sont récupérés, un filtrage basé sur l'année souhaitée permettra d'affiner les informations pour répondre à des besoins spécifiques. Cette méthode s'avère efficace dans les situations où les données sont nombreuses et les métadonnées détaillées, telles que la recherche de contenu dans les collections de bibliothèques.
Amélioration du générateur
Explorons d'autres techniques d'optimisation des RAG en améliorant le générateur au sein d'un système RAG.
Compression de l'invite LLM
Les informations parasites contenues dans les morceaux de documents récupérés peuvent avoir un impact significatif sur la précision de la réponse finale du RAG. La fenêtre d'invite limitée des LLM constitue également un obstacle à l'obtention de réponses plus précises. Pour relever ce défi, nous pouvons comprimer les détails non pertinents, mettre l'accent sur les paragraphes clés et réduire la longueur du contexte global des morceaux de documents récupérés.
Cette approche est similaire à la méthode hybride d'extraction et de reclassement discutée précédemment, dans laquelle un reclasseur est utilisé pour trier les morceaux de documents non pertinents.
Ajustement de l'ordre des morceaux dans l'invite
Dans l'article "Lost in the middle", les chercheurs ont observé que les LLM négligent souvent les informations au milieu des documents donnés pendant le processus de raisonnement. Au lieu de cela, ils ont tendance à s'appuyer davantage sur les informations présentées au début et à la fin des documents.
Sur la base de cette observation, nous pouvons ajuster l'ordre des morceaux extraits pour améliorer la qualité de la réponse : lors de l'extraction de plusieurs morceaux de connaissance, les morceaux dont la confiance est relativement faible sont placés au milieu, et les morceaux dont la confiance est relativement élevée sont placés aux deux extrémités.
Amélioration du pipeline RAG
Nous pouvons également améliorer les performances de vos applications RAG en améliorant l'ensemble du pipeline RAG.
Auto-réflexion
Cette approche intègre le concept d'autoréflexion dans les agents d'intelligence artificielle. Comment cette technique fonctionne-t-elle ?
Certains morceaux de documents Top-K initialement récupérés sont ambigus et peuvent ne pas répondre directement à la question de l'utilisateur. Dans ce cas, nous pouvons procéder à un second tour de réflexion pour vérifier si ces morceaux peuvent réellement répondre à la requête.
Nous pouvons mener cette réflexion en utilisant des méthodes de réflexion efficaces telles que les modèles d'inférence du langage naturel (NLI) ou des outils supplémentaires tels que les recherches sur Internet pour la vérification.
Ce concept d'autoréflexion a été exploré dans plusieurs articles ou projets, notamment Self-RAG, Corrective RAG, LangGraph, etc.
Routage de requêtes avec un agent
Parfois, il n'est pas nécessaire d'utiliser un système de RAG pour répondre à des questions simples, car cela pourrait entraîner davantage de malentendus et d'inférences à partir d'informations trompeuses. Dans ce cas, nous pouvons utiliser un agent comme routeur au stade de l'interrogation. Cet agent évalue si la requête doit passer par le pipeline RAG. Si c'est le cas, le pipeline RAG suivant est lancé ; dans le cas contraire, le LLM répond directement à la requête.
L'agent peut prendre différentes formes, notamment un LLM, un petit modèle de classification ou même un ensemble de règles.
En acheminant les requêtes en fonction de l'intention de l'utilisateur, vous pouvez rediriger une partie des requêtes, ce qui permet d'améliorer considérablement le temps de réponse et de réduire sensiblement les bruits inutiles.
Nous pouvons étendre la technique d'acheminement des requêtes à d'autres processus au sein du système RAG, par exemple en déterminant quand utiliser des outils tels que les recherches sur le web, en effectuant des sous-requêtes ou en recherchant des images. Cette approche garantit que chaque étape du système RAG est optimisée en fonction des exigences spécifiques de la requête, ce qui permet une recherche d'informations plus efficace et plus précise.
Résumé
Bien qu'un pipeline RAG vanille puisse sembler simple, l'obtention de performances commerciales optimales nécessite souvent des techniques d'optimisation plus sophistiquées.
Cet article résume diverses approches populaires permettant d'améliorer les performances de vos applications RAG. Nous avons également fourni des illustrations claires pour vous aider à comprendre rapidement ces concepts et techniques et à accélérer leur mise en œuvre et leur optimisation.
Vous pouvez obtenir les implémentations simples des principales approches énumérées dans cet article sur ce lien GitHub.