Comment le RAG agentique réduit les hallucinations et améliore la récupération

Découvrez comment Agentic RAG peut réduire les hallucinations et améliorer la récupération en reformulant les requêtes, en affinant les résultats et en exploitant des modèles de langue plus importants. Déverrouillez des réponses plus complètes et pertinentes pour vos applications RAG.

24 février 2025

party-gif

Débloquez la puissance de la génération augmentée par la récupération (RAG) avec les agents. Découvrez comment améliorer votre pipeline RAG et réduire les hallucinations en introduisant des agents intelligents capables d'analyser les requêtes, d'affiner les recherches et de générer des réponses plus précises et complètes. Cet article de blog fournit un guide pratique pour mettre en œuvre la RAG agentic, vous équipant des outils pour élever vos applications de traitement du langage naturel.

Comment les agents peuvent corriger les hallucinations dans RAG

L'étape de récupération d'informations dans la génération augmentée par la récupération (RAG) dépend fortement de la façon dont l'utilisateur pose les questions. Si la requête n'est pas bien formulée, la récupération d'informations peut être difficile, même si les informations que l'utilisateur recherche sont présentes dans la base de connaissances. Dans le RAG traditionnel, nous obtenons une seule récupération courte, mais nous pouvons résoudre ce problème avec le RAG agentique.

Pour comprendre comment le RAG agentique peut aider, examinons la configuration traditionnelle du RAG pour la récupération. La requête de l'utilisateur est exécutée à travers une recherche de similarité basée sur la sémantique qui recherche les fragments les plus pertinents dans la base d'informations. Mais que se passe-t-il si la question elle-même n'est pas posée de la bonne manière ? Dans ce cas, votre pipeline RAG hallucinerait probablement, c'est-à-dire qu'il commencerait à inventer des réponses, ou le modèle de langage dirait à l'utilisateur qu'il n'a pas pu trouver les informations, même si ces informations sont en fait présentes dans la base de connaissances.

Nous pouvons résoudre ce problème en introduisant des agents dans le pipeline RAG et en leur donnant la capacité non seulement d'analyser la requête initiale, mais aussi d'analyser les réponses générées par le pipeline RAG. Voici à quoi cela ressemble généralement :

  1. La requête initiale est transmise à un agent.
  2. L'agent reformulera la requête initiale.
  3. La requête affinée est transmise à la base de connaissances, et une recherche de similarité basée sur la sémantique est effectuée pour récupérer les documents les plus pertinents.
  4. Avant de transmettre les documents pertinents au modèle de langage, l'agent analyse à nouveau ces documents ou fragments et affine la requête s'il pense que les documents récupérés ne peuvent pas répondre à la question.
  5. Sur la base de la requête affinée, le processus est répété jusqu'à ce que l'agent soit satisfait à la fois des documents récupérés et de la requête reformulée.
  6. Le contexte final est alors transmis au modèle de langage pour générer la réponse.

Dans ce cas, l'agent peut planifier, analyser et exécuter pour mettre en œuvre la boucle agentique dans votre pipeline RAG. Vous avez plusieurs options, comme les frameworks Crew AI, AutoGPT ou LangGraph de LangChain, que vous pouvez utiliser pour construire des agents. Dans cette vidéo, nous utiliserons les agents Transformers, une fonctionnalité peu connue du package Transformers qui vous permet de créer vos propres agents.

Construire un pipeline RAG agentique

L'étape de récupération d'informations dans la génération augmentée par la récupération, ou RAG, dépend fortement de la façon dont l'utilisateur pose les questions. Si la requête n'est pas bien formulée, la récupération d'informations peut être difficile, même si les informations que l'utilisateur recherche sont présentes dans la base de connaissances. Dans le RAG traditionnel, nous obtenons une seule récupération courte, mais nous pouvons résoudre ce problème avec le RAG agentique.

Pour comprendre comment le RAG agentique peut aider, examinons la configuration traditionnelle du RAG pour la récupération. La requête de l'utilisateur est exécutée à travers une recherche de similarité basée sur la sémantique qui recherche les fragments les plus pertinents dans la base d'informations. Mais que se passe-t-il si la question elle-même n'est pas posée de la bonne manière ? Dans ce cas, votre pipeline RAG hallucinerait probablement, c'est-à-dire qu'il commencerait à inventer des réponses, ou le modèle de langage dirait à l'utilisateur qu'il n'a pas pu trouver les informations, même si ces informations sont en fait présentes dans la base de connaissances.

Nous pouvons résoudre ce problème en introduisant des agents dans le pipeline RAG et en leur donnant la capacité non seulement d'analyser la requête initiale, mais aussi d'analyser les réponses générées par le pipeline RAG. Voici à quoi cela ressemble généralement :

  1. La requête initiale est transmise à un agent.
  2. L'agent reformulera la requête initiale.
  3. La requête affinée est transmise à la base de connaissances, et une recherche de similarité basée sur la sémantique est effectuée pour récupérer les documents les plus pertinents.
  4. Avant de transmettre les documents pertinents au modèle de langage, l'agent analyse à nouveau ces documents ou fragments et affine la requête s'il pense que les documents récupérés ne peuvent pas répondre à la question.
  5. Sur la base de la requête affinée, le processus est répété jusqu'à ce que l'agent soit satisfait à la fois des documents récupérés et de la requête reformulée.
  6. Le contexte final est alors transmis au modèle de langage pour générer la réponse.

Pour mettre en œuvre la boucle agentique dans votre pipeline RAG, vous avez plusieurs options, comme les frameworks Crew AI, Auto ou LangGraph de LangChain. Dans ce cas, nous utiliserons les agents Transformers, une fonctionnalité peu connue du package Transformers qui vous permet de créer vos propres agents.

Tout d'abord, nous devons installer les packages requis, notamment pandas, LangChain, le package communautaire LangChain, le package Sentence Transformer et le package Transformers. Ensuite, nous importerons les modules nécessaires et configurerons les données, notamment en divisant les documents en fragments et en créant des embeddings.

Ensuite, nous créerons un outil de récupération que l'agent pourra utiliser pour récupérer les documents pertinents de la base de connaissances. Nous configurerons également le modèle de langage, dans ce cas en utilisant le moteur OpenAI.

Enfin, nous créerons l'agent lui-même, qui aura accès à l'outil de récupération et au modèle de langage, ainsi qu'à une invite système qui guidera le comportement de l'agent. Nous ferons alors fonctionner l'agent à travers la boucle agentique pour générer des réponses à des questions d'exemple, en comparant les résultats à un pipeline RAG standard.

L'approche RAG agentique permet d'obtenir des réponses plus robustes et complètes en permettant à l'agent d'affiner la requête et de récupérer les informations les plus pertinentes, ce qui conduit à des réponses de meilleure qualité de la part du modèle de langage.

Créer un outil de récupération

Pour créer un outil de récupération pour le pipeline RAG agentique, nous définissons une classe RetrievalTool avec la structure suivante :

class RetrievalTool:
    """Using semantic similarity, retrieves some documents from the knowledge base that have the closest embeddings to the input."""

    def __init__(self, vector_db):
        self.vector_db = vector_db

    def __call__(self, query: str) -> List[str]:
        """
        Retrieve up to 7 most similar chunks from the vector DB for the given query.
        
        Args:
            query (str): A query to perform retrieval on. This should be semantically close to the target documents.
        
        Returns:
            List[str]: A list of up to 7 most similar chunks from the vector DB.
        """
        results = self.vector_db.similarity_search(query, k=7)
        return [chunk.page_content for chunk in results]

La classe RetrievalTool prend un objet vector_db en entrée, qui est le magasin de vecteurs (par exemple, Faiss, Chroma, Pinecone) utilisé pour stocker les embeddings des documents.

La méthode __call__ de la classe prend une chaîne de caractères query en entrée et renvoie une liste d'un maximum de 7 fragments les plus similaires du vecteur DB. Elle utilise la méthode similarity_search de l'objet vector_db pour trouver les fragments les plus similaires en fonction de la similarité cosinus.

Cet outil de récupération peut ensuite être utilisé dans le cadre du pipeline RAG agentique, où l'agent peut analyser la requête initiale, la raffiner et la transmettre à l'outil de récupération pour obtenir les fragments les plus pertinents de la base de connaissances.

Intégrer le modèle de langage

Pour intégrer le modèle de langage dans le pipeline RAG agentique, nous devons configurer le modèle de langage qui sera utilisé à la fois par l'agent et pour générer la réponse finale. Nous avons deux options :

  1. Utiliser le moteur Hugging Face : cela nous permet d'appeler directement les points de terminaison de l'API des différents modèles de langage disponibles via l'architecture sans serveur de Hugging Face. Nous pouvons utiliser des modèles comme Llama 38B ou 70B, mais ceux-ci nécessitent généralement un abonnement Hugging Face Pro.

  2. Utiliser OpenAI : pour cet exemple, nous utiliserons le moteur OpenAI. Le processus peut être adapté pour configurer n'importe quel autre modèle de langage.

Pour configurer le moteur OpenAI, nous créons une classe appelée OpenAIEngine qui utilise les fonctions message_rle et gpt_generate_message_list du moteur LLM des agents Transformers. Cette classe gère le nettoyage des messages d'entrée et l'utilisation du point de terminaison de complétion de chat OpenAI pour générer des réponses.

Ensuite, nous créons l'agent lui-même. L'agent a accès à l'outil de récupération que nous avons créé précédemment, au modèle de langage que nous voulons utiliser (l'OpenAIEngine dans ce cas) et au nombre maximum d'itérations que nous voulons que l'agent effectue avant d'arrêter la boucle agentique.

Nous fournissons également une invite système à l'agent, qui lui donne des instructions sur la façon d'utiliser les informations de la base de connaissances pour fournir une réponse complète à la question de l'utilisateur. L'invite encourage l'agent à réessayer le processus de récupération avec des requêtes différentes s'il ne peut pas trouver les informations nécessaires.

Avec l'agent et le modèle de langage configurés, nous pouvons maintenant exécuter la boucle agentique pour répondre aux questions des utilisateurs. L'agent raffinera itérativement la requête, récupérera les informations pertinentes de la base de connaissances et générera une réponse finale à l'aide du modèle de langage. Cette approche conduit à des réponses plus détaillées et pertinentes par rapport à un pipeline RAG standard.

Mettre en œuvre l'agent agentique

Pour mettre en œuvre l'agent agentique, nous utiliserons la fonctionnalité Transformers Agents du package Transformers. Cela fournit une approche modulaire et claire pour créer des agents personnalisés.

Tout d'abord, nous devons installer les packages requis, notamment pandas, Langchain, le package communautaire Langchain, Sentence Transformers et les agents Transformers.

Ensuite, nous importons les modules et packages nécessaires. Nous utiliserons l'agent ReactJsonAgent, construirons des outils personnalisés pour l'agent et nous appuierons sur le moteur Hugging Face pour le modèle de langage.

Pour construire le pipeline RAG, nous partons d'un jeu de données contenant la documentation Hugging Face. Nous divisons les documents en fragments et créons des embeddings à l'aide du modèle GTE-small. Nous supprimons ensuite les fragments en double et stockons les fragments uniques dans un magasin de vecteurs basé sur F.

Maintenant, nous introduisons l'agent dans la mix. Nous créons un RetrievalTool qui utilise la similarité sémantique pour récupérer les fragments les plus pertinents de la base de connaissances en fonction de la requête de l'utilisateur.

Nous configurons également le modèle de langage, dans ce cas en utilisant le moteur OpenAI avec le modèle GPT-4.

L'agent est alors créé, avec accès à l'outil de récupération et au modèle de langage. Nous spécifions également le nombre maximum d'itérations que l'agent peut effectuer pour raffiner la requête et le contexte récupéré.

L'agent se voit attribuer une invite système qui le guide pour utiliser la base de connaissances afin de fournir une réponse complète à la question de l'utilisateur. L'agent passe alors par un processus itératif, reformulant la requête et récupérant des informations plus pertinentes jusqu'à ce qu'il soit satisfait de la réponse.

Le pipeline RAG agentique est alors comparé à un pipeline RAG standard, démontrant comment l'approche basée sur l'agent peut fournir des réponses plus détaillées et pertinentes, surtout lorsque la requête initiale de l'utilisateur n'est pas bien formulée.

Comparer le RAG standard et le RAG agentique

Les principales différences entre le RAG standard et le RAG agentique sont :

  1. Reformulation de la requête : dans le RAG standard, la requête de l'utilisateur est directement transmise à la recherche de similarité basée sur la sémantique pour récupérer les fragments pertinents de la base de connaissances. Dans le RAG agentique, un agent analyse la requête initiale et peut la reformuler pour améliorer le processus de récupération.

  2. Raffinement itératif : le RAG agentique permet à l'agent de raffiner itérativement la requête et le contexte récupéré. Si l'agent n'est pas satisfait de la récupération initiale, il peut répéter le processus avec une requête affinée pour obtenir de meilleurs résultats.

  3. Réponses concises et pertinentes : l'approche agentique tend à générer des réponses plus concises et pertinentes par rapport au RAG standard. La capacité de l'agent à analyser la requête et le contexte récupéré l'aide à fournir une réponse plus complète.

  4. Gestion des requêtes mal formulées : le RAG agentique est mieux équipé pour gérer les cas où la requête de l'utilisateur n'est pas bien formulée. L'agent peut reconnaître les limites de la requête initiale et travailler à la reformuler, ce qui conduit à une meilleure récupération et à des réponses plus informatives.

  5. Flexibilité et personnalisation : le RAG agentique permet une plus grande flexibilité et personnalisation, car l'agent peut être équipé de divers outils et capac

FAQ