Expérimentation des LLM en mode RAG sur des fiches séismes produites par l'IRSN
L'objectif de ce projet était de créer un système de Question/Réponse en utilisant un LLM sur les fiches séismes de l'IRSN et de tester la capacité d'un LLM à extraire des données d'une fiche pour en faire de la données structurées (format Json).
Dans le cadre de cette expérimentation, nous avons donc mis en place un système de RAG (Retrieval Augmented Generation) en utilisant le framework llamaindex proposé par Meta ainsi que le LLM OpenSource Mistral-7B-Instruct-v0.1 proposé par l'entreprise Mistral et disponible sur la plateforme communautaire Huggingface.
Toutes les étapes de l'expérimentation sont disponibles dans le notebook Experimentation_LLM.ipynb. Afin de pouvoir l'utiliser il suffit de le télécharger et de suivre les installations nécessaires.
Il est conseillé de faire tourner ce Notebook sur des GPU pour être capable de faire fonctionner le modèle Mistral-7B-Instruct-v0.1.
Notre expérimentation consiste en :
- La sélection d'un Large Language Model open source
- Le paramétrage du RAG
- Sélection d'un Framework LLamaindex
- Création d'embeddings
- Paramétrage d'un retriever
- Paramétrage d'un prompt adéquat pour notre modèle
- Évaluatution de notre RAG à travers 2 tâches distinctes
- La capacité du modèle à répondre à une question simple et une question complexe sur l'intégralité du corpus de document
- La capacité du modèle à créer de la donnée structurée (du JSON) en ne lui donnant qu'un seul docuement
L'étape du RAG qui a demandé le plus de customization est le retreiver. Vous trouverez dans ce repository et dans le notebook les étpes que nous avons du créer afin d'êtr capable de fournir la bonne source de document à notre LLM en fonction de la question posée. Ainsi nous avons joué sur l'extraction automatique de métadonnée incluse dans notre framework et sur l'extraction de metadonnées précises et ciblées (titre/sous-titre de document). Ces extractions ont permis de grandement améliorer nos résultats jusqu'à atteindre un niveau de précisiond e document jsu'à attreidnre un niveau de 95% pour des questions simples et 75% pour des questions complexes.
Pour plus de détails sur l'expérimentation et les résultats, vous pouvez regarder cette présentation faite le 27/02/2024.
https://myirsn.proton.intra.irsn.fr/IRSN/plirsni_197226/presentation-llm-27-02?details=true
Le repository est composé de l'arborescence de documents suivante :
- data
- input
- embedding: représentation vecorielle des fiches séismes pour le LLM
- fiches_seismes: fiche sésimes en format pdf
- output
- JSON: output de la génération de données structurées à partir des fiches séismes (expérimentation n°2)
- json: génération de ficher json fructueuse
- txt: génération infructueuse de fichier json = contenu généré par le LLM sans format json
- QR: output de l'expérimentation n°1
- JSON: output de la génération de données structurées à partir des fiches séismes (expérimentation n°2)
- input
Pour utiliser les bibliothèques suivantes :
- llama-index
- torch
- sentence_transformers
- faiss-cpu
- pdfminer.six
- bs4
- transformers
- langchain
pip install llama-index torch sentence_transformers faiss-cpu pdfminer.six bs4 transformers langchain
Le Notebook Experimentation_LLM permet de tester les fonctionnalités que nous avons implémentées. Il se divise en 6 grandes parties.
-
Imports et Installations: Cette partie regroupe les différents imports de bibliothèques nécessaires à l'utilisation du notebook, avec une cellule dédiée aux installations.
-
Paramétrage du RAG: Permet de paramétrer un premier RAG (Retrieval Augmented Generation) avec notamment l'importation d'un modèle, ici Mistral-7B-Instruct.
-
Sauvegarde des Réponses: Concentrée sur la méthode de sauvegarde des réponses dans des fichiers CSV après l'appel d'un script pour automatiser l'utilisation du RAG.
-
Extraction de Métadonnées (llamaindex): Explicite la méthode d'extraction de métadonnées proposées par le framework llamaindex pour améliorer la partie retrival de notre RAG.
-
Extraction de Métadonnées (personnalisée): Similaire à la précédente mais permet d'extraire des métadonnées que nous avons extraites nous-mêmes pour obtenir de meilleurs résultats.
-
Extraction de Données Structurées: Code permettant de réaliser la partie extraction de données structurées à partir d'un LLM de notre expérimentation.
Tous les résultats de l'expérimentation sont présents dans la partie output. Vous y retrouverez :
-
Les outputs Json: L'expérimentation n'a pas permis d'extraire des fichiers Json dans 100% des cas. On retrouve ainsi 2 types d'outputs :
- Des outputs sous format json en cas d'extraction fructueuse.
- Des outputs sous format txt en cas d'extraction infructueuse ne respectant pas la structure du fichier json.
-
Les outputs QR: Notre expérimentation nous permet de générer des fichiers CSV répertoriant toutes les réponses aux questions que nous posons aux LLM sur les fiches séismes. (Voir la partie sauvegarde CSV du notebook.) Vous retrouverez ainsi les réponses dans le sous-dossier Q/R du dossier output.
Cécilia DAMON & Yohan MIARA
Cécilia DAMON Yohan MIARA Yann Richet
En cas de question sur l'utilisation ou les résultats, contacter Cécilia DAMON cecilia.damon@irsn.fr