• Génération IA
  • Posts
  • Comprendre le RAG à travers l'exemple d'un chatbot sur le climat

Comprendre le RAG à travers l'exemple d'un chatbot sur le climat

Le RAG est une technique qui enrichit (Augmented) les capacités de génération de texte (Generation) d'un modèle de langage par une phase de recherche d'informations (Retrieval). Comment ça marche ? Je te révèle les coulisses de cette technique qui va devenir clé en 2024, à travers l'exemple de ClimateQ&A, un site français qui répond à tes questions sur les rapports du GIEC.

Aujourd’hui, on va s’intéresser au “Retrieval Augmented Generation“ (RAG).

Pourquoi s’y intéresser ? Bonne question. Le RAG permet notamment de brancher votre modèle de langage favori (Mixtral, ChatGPT, Claude..) à des données externes : vos notes personnelles, des rapports, des données d’entreprise…

Allez, c’est parti.

Déjà, je ne connais pas le terme français qui va bien (ça commence bien). Oracle suggère “Génération Augmentée de Récupération“. Bof. Pas convaincu, ça sent la traduction automatique. Personnellement, je penche pour “Génération Enrichie par Recherche”.

Faisons simple et gardons l'acronyme RAG.

Pour le moment, oublions les termes techniques compliqués et intéressons-nous à du concret.

Je me suis donc mis à la recherche d’une application concrète de RAG. Une app de recettes cuisine ? Hmm, non. Un support client automatisé ? Hmmm, non plus. Un outil qui permet d’interroger les rapports du GIEC sur le climat 🌍️ ? Voilààà, c’est bien ça.

Certains d’entre vous connaissent peut-être ClimateQ&A, un outil développé par Ekimetrics qui utilise l’IA “pour répondre aux questions sur les problèmes environnementaux en utilisant des sources détaillées et fiables“.

C'est un exemple parfait d'utilisation du RAG.

Le projet étant open source (merci !), j'ai pu examiner le code pour vous donner un aperçu de ce qu’il se passe sous le capot. Prêt(e) ?

Posons une question à ClimateQ&A :

Est-ce énergivore de produire des carburants de synthèse ?

Attendons la réponse (patiemment. Je ne sais pas si c’est toujours aussi lent, mais j’ai bien attendu deux minutes là 🐌) :

Notez les références numérotées (le petit 1 et 2 en rouge) dans la réponse générée. C’est un avantage du RAG, il permet la citation des sources, ce qui est un + en terme de transparence.

ClimateQ&A vous affiche d’ailleurs sur la droite les passages originaux extraits des rapports du GIEC avec le nom du rapport, le numéro de la page et le lien vers le rapport :

Les passages extraits des rapports du GIEC

Pour résumer : une question, une réponse et des sources. Bien. Mais comment arrive t’on à ce résultat ?

Let's think step by step.

Etape 1 : Reformulation de la question

Première étape, via le prompt ci-dessous, ClimateQ&A va reformuler votre question, la traduire en anglais, et identifier la langue dans laquelle vous vous êtes exprimés.

Remarques :

  • pour des raisons de lisibilité, je vais découper le prompt (et les suivants) en plusieurs blocs, mais il s’agit bien du même et unique prompt.

  • les prompts originaux sont en anglais.

  • la question est traduite en anglais car le moteur de recherche de ClimateQ&A fonctionne en anglais.

Reformulez le message utilisateur suivant pour qu'il devienne une question courte et autonome en anglais, dans le contexte d'une discussion éducative sur le changement climatique.
---
query: La technologie nous sauvera-t-elle ?
-> 
'question': 'Can technology help humanity mitigate the effects of climate change?',
'language': 'French',
---
query: what are our reserves in fossil fuel?
-> 
'question': 'What are the current reserves of fossil fuels and how long will they last?',
'language': 'English',
---
query: Quelles sont les principales causes du changement climatique ?
->
'question': 'What are the main causes of climate change over the last century?',
'language': 'French'
---
Le résultat doit être un extrait de code en markdown formaté selon le schéma suivant, incluant les "```json" de début et de fin ::

```json
{
	"language": string  // La langue détectée du message d'entrée
	"question": string  // La question reformulée, toujours en anglais
}
```
Reformulez la question en anglais et détectez la langue du message original
Affichez le résultat sous forme de json avec deux clés "question" et "language"
query: Est-ce énergivore de produit des carburants de synthèse ?“
->
```json

Ainsi, ma question “Est-ce énergivore de produit des carburants de synthèse ?“ est devenue “Is producing synthetic fuels energy-intensive?“. Dans ce cas, le modèle s’est contenté de traduire (il a aussi corrigé la faute de frappe 🤦 : produit au lieu de produire), mais si la question est vague ou peu précise, il va la reformuler pour la rendre plus claire dans le contexte du “changement climatique“.

Le prompt utilisé par ClimateQ&A donne quelques exemples au modèle (ce qui est en général une bonne idée.. si les exemples sont bons) pour le guider dans cette étape de reformulation :

La technologie nous sauvera-t-elle ?
-> 
Can technology help humanity mitigate the effects of climate change?

Mettez-vous à la place d’un moteur de recherche 2 minutes. A quelle question est-il plus simple de répondre précisement ?

Mardown et Prompt. Le Markdown est un langage de balisage simple pour formater du texte, utilisant des symboles comme *, # .. Il est conçu pour être facile à lire et à écrire, et est couramment utilisé sur des sites web ou pour de la documentation.

ChatGPT, Claude, Mixtral.. “parlent” très bien le markdown. Ce format est très présent dans leurs données d’entraînement, notamment toute la documentation des projets de code hébergés chez github est en markdown.

Il est assez courant d'utiliser du markdown dans les prompts. Ici, le prompt demande spécifiquement de formater la réponse en json (un format de données) en markdown afin d’obtenir une réponse structurée facilement exploitable par du code.

Exemple:

{

"language": "French",

"question": "Is producing synthetic fuels energy-intensive?"

}

Etape 2 : La Recherche (Retrieval)

Cette étape est le coeur de l’outil (et du RAG). Elle consiste à récupérer dans les rapports du GIEC les extraits pertinents pour la question posée, ainsi que certaines meta données associées au document/extrait : nom, numéro de page, url, date de publication …

Remarque : Je passe volontairement rapidement sur la mécanique réelle de recherche. J’aborde le sujet + en détail dans la suite de l’article. Pour le moment, pas de complexité inutile.

Pour la recherche “Is producing synthetic fuels energy-intensive?“, le moteur (qui ne fonctionne qu’en anglais) retourne ces deux résultats (je ne vous mets que le début) :

  • Furthermore, since the production of synthetic fuels involves thermodynamic conversion loss, there is a concern that the total energy efficiency…

  • Synthetic fuels. Synthetic fuels can contribute to transport decarbonisation through synthesis from electrolytic hydrogen produced with low-carbon electricity…

Etape 3 : Génération de la réponse

Les résultats sont alors ajoutés directement dans le prompt suivant qui génère la réponse finale pour l'utilisateur. Lisez les directives. Deux choses à noter notamment, elles demandent explicitement au modèle :

  • de référencer les documents utilisés dans la réponse

  • de répondre qu’il ne sait pas si les documents ne permettent pas de répondre. C’est très important comme précision. Car, par défaut, un modèle de langage ne sait pas quand il ne sait pas, et il peut générer une réponse qui semble correcte.. mais qui ne l’est pas (les fameuses hallucinations).

Remarque : Pour des raisons de lisibilité, je vous sépare le prompt en 4 blocs distincts. Les résultats du moteur de recherche sont dans le 3ème bloc.

Vous êtes ClimateQ&A, un assistant IA créé par Ekimetrics. On vous pose une question et on vous fournit des extraits des rapports du GIEC et/ou de l'IPBES. Fournissez une réponse claire et structurée basée sur les passages fournis, le contexte et les directives.
Directives :

- Si les passages contiennent des faits ou des chiffres utiles, utilisez-les dans votre réponse.
- Lorsque vous utilisez des informations d'un passage, mentionnez d'où elles proviennent en utilisant [Doc i] à la fin de la phrase. i représente le numéro du document.
- N'utilisez pas la phrase 'Le Doc i dit ...' pour indiquer la source de l'information.
- Si la même chose est dite dans plus d'un document, vous pouvez les mentionner tous ainsi : [Doc i, Doc j, Doc k]
- Ne vous contentez pas de résumer chaque passage un par un. Regroupez vos résumés pour mettre en évidence les parties clés de l'explication.
- Si cela a du sens, utilisez des points et des listes pour rendre vos réponses plus faciles à comprendre.
- Vous n'avez pas besoin d'utiliser tous les passages. Utilisez seulement ceux qui aident à répondre à la question.
- Si les documents ne contiennent pas les informations nécessaires pour répondre à la question, dites simplement que vous n'avez pas assez d'informations.
-----------------------
Passages:
Doc 1: Furthermore, since the production of synthetic fuels involves thermodynamic conversion loss, there is a concern that the total energy efficiency…
Doc 2: Synthetic fuels. Synthetic fuels can contribute to transport decarbonisation through synthesis from electrolytic hydrogen produced with low-carbon electricity…
-----------------------
Question: Est-ce énergivore de produire des carburants de synthèse ?
Répondez en français avec les citations des passages :

Etape 4 : Affichage de la réponse

ChatGPT ou Mixtral est maintenant prêt à répondre en français avec les informations dont il a besoin. Dernier petit effort, ClimateQ&A va examiner la réponse générée pour identifier les références aux documents, la reformater légèrement afin d’y placer les liens vers les extraits originaux du GIEC (ainsi que le nom du rapport, et le numéro de page de l’extrait) :

La production de carburants synthétiques est énergivore en raison de la perte de conversion thermodynamique [1]. Cependant, les carburants synthétiques peuvent contribuer à la décarbonisation des transports en étant synthétisés à partir d'hydrogène électrolytique produit avec de l'électricité à faible teneur en carbone ou d'hydrogène produit avec CCS, et de CO2 capturé à l'aide du procédé Fischer-Tropsch [2]…

Voilà. Si vous êtes allé au bout de cet exemple, vous devriez avoir une petite idée (enfin j’espère) de ce qu’est le RAG.

Formalisons un peu les choses.

Le RAG, c’est quoi ?

Le Retrieval Augmented Generation (RAG) est donc une technique qui enrichit (Augmented) les capacités de génération de texte (Generation) d'un modèle de langage par une phase de recherche d'informations (Retrieval).

Le RAG en schéma. Admirez l’artiste

Concrètement, cela permet de produire des réponses plus précises en s'appuyant sur des données externes. Lorsqu'une question est posée, le système recherche d'abord dans une base de connaissances (des livres, des fichiers pdfs, une base de données…) pour trouver des informations pertinentes.

Ensuite, ces informations sont intégrées dynamiquement dans le prompt (l’instruction envoyée au modèle) responsable de générer la réponse finale:

Exemple simplifié d’un prompt RAG

Cela permet de créer des réponses non seulement basées sur les connaissances internes du modèle, mais aussi enrichies par ces données externes.

Le RAG, pourquoi ?

Le RAG vient corriger certains des défauts fondamentaux des modèles de langage (Mixtral 🇫🇷 , Claude…). C’est une “extension“ qui pallie les limitations inhérentes à ces technologies :

  • Actualisation des informations : Le RAG peut accéder à des données à jour, palliant la limite des modèles de langage traditionnels qui se basent sur des données obsolètes. Par exemple, Grok, le ChatGPT de Twitter qui parle comme Elon Musk, est branché sur un système RAG lorsque vous l’interrogez sur l’actualité.

  • Réduction des hallucinations : En intégrant des données externes vérifiables, le RAG peut améliorer la précision et la fiabilité des réponses, réduisant ainsi les erreurs ou les affirmations non fondées.

  • Amélioration de la transparence : Le RAG renforce la confiance en fournissant les références vers les sources.

  • Intégration de données spécifiques : Le RAG permet l'intégration de données propres à une entreprise, à un utilisateur, ou à un domaine en particulier (comme notre exemple ClimateQ&A).

  • Efficacité Coût-Performance : Le RAG peut s'avèrer plus économique et plus facile à mettre en place comparé à d'autres méthodes comme le fine-tuning ou la création d’un modèle.

Ça réduit les hallucinations, vraiment ?

Alors, oui, mais deux-trois choses à garder en tête tout de même.

Si vous posez une question, et que la réponse à cette question ne figure pas dans les documents utilisés pour la recherche … alors potentiellement, le modèle dira n’importe quoi. C’est pour ça qu’il est très important de préciser au modèle de dire qu’il ne sait pas si la réponse n’est pas renvoyée par les résultats de la recherche.

La qualité de la recherche dépend comme toujours de la qualité de la question. Soyez précis dans vos questions, évitez les questions vagues.

Enfin, ça tombe sous le sens, mais hé, si dans la base de connaissances sur laquelle s’appuye votre RAG, il y a des erreurs, alors le modèle ressortira ces erreurs.

RAG et fine-tuning, c’est la même chose ?

Nooooon. Rien à voir.

Avec le RAG, vous n’entraînez pas le modèle sur vos données. Vous lui demandez de générer une réponse à partir des résultats d’une recherche faîte sur vos données.

Le fine-tuning, lui, personnalise le modèle avec vos propres jeux de données (On en parlera probablement dans un prochain article).

Il est important de comprendre la distinction.

Voilà. Vous devriez maintenant avoir une bonne compréhension de ce qu’est le RAG. Si cela vous suffit, c'est parfait, vous pouvez en rester là. Ceux qui ont envie de creuser davantage, on continue …

La recherche vectorielle

La “Recherche“ dans ClimateQ&A est plus complexe que ce que j’en ai dit jusqu’à présent. Déjà, il n’y pas une mais deux recherches :

  • une qui va interroger exclusivement les “Résumés destinés aux décideurs politiques“ (Summary for Policy Makers) : des rapports du GIEC plus synthétiques et plus simples

  • une qui va interroger les rapports complets

La recherche sélectionne jusqu'à dix extraits de documents : trois issus des résumés destinés aux décideurs politiques et les autres dans les rapports complets du GIEC. Je vous parle de cette double recherche pour vous montrer que derrière une recherche peut se cacher bien des manières différentes de faire.

Important : chaque extrait retourné doit correspondre étroitement à la question posée par l'utilisateur. Seuls ceux qui atteignent ou dépassent un seuil prédéfini de similarité sont retenus. Et c’est là qu’on dit …

Bonjour “embeddings”, Bonjour “recherche vectorielle”

Je vous conseille de lire mon précédent article sur les embeddings si vous n’avez pas les idées claires à leur sujet. Sinon, en voici une définition en une phrase : “Les embeddings sont des vecteurs numériques de haute dimension représentant la sémantique et le sens des mots/phrases.”. Dans cet espace vectoriel, les phrases ayant le même sens sont proches les unes des autres.

Lorsque vous posez une question à ClimateQ&A, ce dernier va transformer votre question en embedding. Précisément, il utilise le modèle d’embedding bge-base-en-v1.5 développé par BAAI (Beijing Academy of Artificial Intelligence) réputé comme étant un des meilleurs modèles open source pour les tâches de question/réponse. Et ce modèle ne parle que l’anglais (développer un modèle performant pour une seule langue est plus simple). Vous savez maintenant pourquoi ClimateQ&A traduit votre question en anglais.

Préalablement, tous les rapports du GIEC ont été passés à la moulinette : ils ont été découpés en paragraphes/passages/pages et eux-mêmes transformés en embeddings. ClimateQ&A utilise la base de données vectorielles pinecone pour stoquer ces documents/embeddings.

Maintenant que la question est sous forme d’embeddings, que tous les passages du GIEC ont été indexés sous forme d’embeddings, la recherche devient un calcul de similarité entre vecteurs.

Retour au lycée (pour ceux qui ont fait spé maths au moins. bande de veinards). Il y a 3 méthodes principales pour mesurer la similarité entre les vecteurs :

  • la distance euclidienne : mesure la "distance" directe entre les vecteurs

  • la similarité cosinus : mesure l’angle que forme les vecteurs entre eux. Plus l’angle est proche de 0, plus les vecteurs sont similaires

  • la similarité du produit scalaire : un peu plus technique, mais l'idée de base est de mesurer dans quelle mesure deux vecteurs sont alignés

Je vous rassure, j’ai pas prévu de vous faire un cours de maths, et je laisse les motivés cliquer sur les liens.

Toutefois, je ne serai pas surpris si les nombreux outils RAG existants ou à venir (Parlez avec mon PDF, Custom GPT, Assistants Persos… ) vous proposent de configurer ce genre de choses. Il n’est donc pas inutile d’en avoir entendu parler. Eventuellement, ils pourront vous demander aussi le nombre de documents à retourner, le seuil de similarité…

Pour conclure, je vous ai dessiné un beau schéma qui représente une application RAG type :

Quelques commentaires finaux

J’ai voulu vous montrer le RAG à travers une application “dans la vraie vie“ : ClimateQ&A. Et au passage, vous montrer les prompts réels, l’enchaînement des étapes… ça s’est révélé un peu plus compliqué que prévu notamment avec l’utilisation du json et du markdown dans les prompts. J’espère ne pas avoir perdu trop de monde à ce moment là.

Je vous ai présenté la recherche vectorielle (embeddings) qui est souvent assimilée au RAG. C’est la méthode cool du moment. Il y a pléthore de bases de données vectorielles qui ont d’ailleurs poussé ces derniers temps.

Mais, ce n’est pas indispensable. Vous n’avez pas besoin d’un moteur de recherche vectorielle. Vous avez besoin d’un moteur de recherche tout court, quel qu’il soit. Nuances.

Donc, n’oubliez pas les bonnes vieilles techniques de recherche par mots-clés ou utiliser des techniques hybrides : moitié mots-clés, moitié vectorielle. Ou encore utiliser une base de données classique (SQL). Tout dépend du contexte.

Ceci-dit, si vous voulez être tendance, alors pas le choix, il vous faut utiliser les embeddings, les bases de données vectorielles.. Oui, je sais, le choix est cornélien.

Ce qui est sûr, c’est que la phase de recherche est critique. De sa qualité dépend la qualité de la réponse finale.

Et cette phase de recherche peut être bien plus complexe que ce que présente cet article. Certaines libraires utilisées par les développeurs comme llamaindex se concentrent exclusivement sur cette phase de recherche, pour donner au modèle de langage les meilleures informations possibles.

Mais vous êtes d’accord, on a déjà vu assez de choses pour aujourd’hui.