Evaluez et améliorez votre système RAG

Dans le chapitre précédent, nous avons construit un système RAG (Retrieval-Augmented Generation) pour aider Josiane à répondre aux questions des administrés en s'appuyant sur la base de connaissances de la mairie. Cependant, créer un système RAG n'est que la première étape.

Comment savoir s'il fonctionne bien ? Est-ce que les réponses générées sont fiables et précises ?

Un risque majeur, comme nous l'avons évoqué, est celui des hallucinations : des réponses incorrectes ou inventées que le modèle peut générer s'il interprète mal le contexte ou si le contexte fourni est de mauvaise qualité.

Pour garantir que l'assistant de Josiane soit véritablement utile et fiable, une évaluation rigoureuse est indispensable. Ce chapitre est entièrement dédié à cette évaluation. Nous allons utiliser Ragas, un framework spécifiquement conçu pour mesurer la performance des différentes composantes d'un système RAG.

Pourquoi évaluer avec Ragas ?

Plutôt que de se fier à une impression subjective ("ça a l'air de bien marcher..."), Ragas nous apporte une approche structurée et basée sur des données :

1. Métriques Ciblées : Ragas décompose la performance globale d'un système RAG en plusieurs métriques quantifiables. Chacune évalue un aspect spécifique du pipeline :

  • La qualité de la récupération de contexte (le "R" de RAG).

  • La qualité de la génération de la réponse (le "G" de RAG), incluant sa fidélité au contexte et sa pertinence par rapport à la question.

2. Diagnostic Précis : En analysant les scores de ces différentes métriques, nous pouvons identifier précisément où se situent les faiblesses de notre système. Par exemple :

  • Notre module de recherche (retriever) récupère-t-il des documents non pertinents (faiblecontext_precision) ?

  • Manque-t-il des informations clés dans les documents récupérés (faiblecontext_recall) ?

  • Le modèle de langage invente-t-il des informations non présentes dans le contexte (faiblefaithfulness) ?

  • La réponse générée répond-elle vraiment à la question posée (faibleanswer_relevancy) ?

3. Mesure de Progrès : Lorsque nous apportons des modifications pour améliorer notre système (par exemple, en changeant le modèle d'embedding, en ajustant la taille des chunks, en modifiant le prompt), Ragas nous permet de mesurer objectivement l'impact de ces changements en comparant les scores avant et après modification.

Préparez vos données pour l'évaluation Ragas

La première étape cruciale est de constituer un jeu de données d'évaluation. Ce jeu de données servira de base à Ragas pour calculer ses métriques. Pour chaque "cas test", il doit idéalement contenir les éléments suivants :

  • question: La question posée par l'utilisateur (ex: un administré).

  • answer: La réponse générée par votre système RAG actuel en réponse à cette question.

  • contexts: La liste des segments de texte (chunks) que votre système RAG a récupérés de la base de connaissances pour générer cette réponseanswer.

  • ground_truth(Fortement recommandé) : La réponse idéale ou les informations clés que la réponse aurait dû contenir. C'est la "vérité terrain" qui permet une évaluation plus fiable, notamment pour la métriquecontext_recall.

Comment construire ce jeu de données ?

  • Sélectionnez un ensemble de questions variées et représentatives des requêtes réelles que Josiane pourrait recevoir.

  • Incluez des questions simples, complexes, couvrant différents sujets (état civil, urbanisme, services techniques, etc.).

  • Pensez aussi à inclure des questions "pièges" ou hors-sujet pour voir comment le système réagit (comme la question sur la météo dans notre exemple).

# Exemple de questions test pour la mairie de Trifouillis-sur-Loire
questions_test = [
    "Quel est le nom du Maire ?",
    "Quels ont été les principaux projets en 2023 ?",
    "Quelles sont les horaires d'ouverture de la mairie ?",
    "Résume moi le règlement municipal ",
    "Combien de km de pistes cyclables allons nous disposer ?",
    "Bonjour, quel temps fait-il aujourd'hui ?"
    ]

1. Générer les réponses (answer) et contextes (contexts) avec votre système RAG :

  • Utilisez votre pipeline RAG complet (celui développé au chapitre précédent) pour traiter chaquequestionde votre jeu de test.

  • Stockez soigneusement la réponse (answer) générée par le LLM et la liste exacte descontextsqui ont été fournis au LLM pour générer cette réponse. C'est crucial : Ragas évalue la génération par rapport aux contextes fournis, et le retrieval par rapport à la pertinence de ces contextes.

# EXEMPLE de résultats obtenus APRÈS avoir lancé votre RAG sur les questions_test
# (Ces données correspondent à celles utilisées dans le code d'évaluation final)
answers = [ # Les réponses générées par VOTRE système RAG
"Le nom du Maire est Madame Pétillante Rigolade.",
"Rénovation de la voirie centrale : Refonte et réhabilitation des rues principales du centre-ville (lancé le 2023-09-01, budget de 750 000 €).Modernisation de l'éclairage public : Remplacement des lampadaires défectueux et installation de LED (lancé le 2023-10-15, budget de 300 000 €).Amélioration des espaces verts : Réaménagement des parcs et jardins municipaux (lancé le 2023-11-10, budget de 450 000 €).Rénovation de l'école primaire : Modernisation et extension des locaux de l'école primaire de la commune (lancé le 2023-08-20, budget de 650 000 €). Création du Pôle Sportif Municipal : Construction d'un complexe sportif multifonctionnel (lancé le 2023-07-15, budget de 950 000 €).Réaménagement de la place du Marché : Reconfiguration de l'espace public pour dynamiser le commerce local (lancé le 2023-10-05, budget de 500 000 €).Installation d'un système de surveillance urbaine : Mise en place de caméras pour renforcer la sécurité publique (lancé le 2023-12-01, budget de 400 000 €).Développement de pistes cyclables : Création d'un réseau sécurisé de pistes cyclables dans toute la commune (lancé le 2023-09-15, budget de 350 000 €).Mise en place d'un système de tri sélectif avancé : Optimisation de la gestion des déchets par un système de tri intelligent (lancé le 2023-11-20, budget de 300 000 €).",
"La mairie de Triffouillis-sur-Loire est ouverte du lundi au vendredi de 8h30 à 12h00. Elle est fermée le samedi et le dimanche. ",
"Le règlement vise à garantir l'ordre public, la sécurité, la tranquillité et la salubrité sur l'ensemble du territoire communal. Il s'applique à tous les habitants, visiteurs et usagers de la commune.",
"Le plan d'action 2026 vise à créer environ 2,5 km de nouveaux aménagements cyclables sécurisés.",
"Bonjour ! Je ne peux pas fournir des informations en temps réel sur la météo. Pour connaître le temps qu'il fait aujourd'hui à Triffouillis-sur-Loire, je vous recommande de consulter un site ou une application météo fiable."
]

placeholder_contexts = [ # Les contextes récupérés par VOTRE système RAG pour chaque question
["Extrait du document municipal page 5 : Le Conseil Municipal a élu Madame Pétillante Rigolade comme Maire lors de la séance du 15 juin."],
["Rapport d'activité 2023, section Travaux : Rénovation voirie centrale (750k€), Éclairage public LED (300k€), Réaménagement parcs (450k€).", "Annexe budgétaire 2023 : École primaire (650k€), Pôle Sportif (950k€), Place du Marché (500k€), Caméras surveillance (400k€), Pistes cyclables (350k€), Tri sélectif (300k€)."],
["Page 'Infos Pratiques' du site web : Horaires Mairie : Lundi au Vendredi : 8h30 - 12h00. Samedi, Dimanche : Fermé."],
["Article 1 du Règlement Municipal : Le présent règlement a pour objet d'assurer le bon ordre, la sûreté, la sécurité, la tranquillité et la salubrité publiques sur le territoire de la commune.", "Article 2 : Il s'applique à toute personne se trouvant sur le territoire communal."],
["Plan Mobilité Douce 2022-2026, page 12 : Objectif 2026 : +2.5 km d'aménagements cyclables sécurisés (pistes et bandes)."],
["Documentation interne de l'agent conversationnel : Limites connues : Ne pas fournir d'informations en temps réel comme la météo, la bourse, ou le trafic routier. Suggérer des sources externes."]
]

2. Définir les ground_truth (réponses de référence)

Pour chaque question, écrivez manuellement la réponse concise et correcte attendue, basée sur votre connaissance des documents sources. C'est un travail qui demande de la rigueur mais améliore grandement la qualité de l'évaluation.

ground_truths = [ # Les réponses idéales que vous avez définies manuellement
"Le nom du Maire est Madame Pétillante Rigolade.",
"Les principaux projets en 2023 concernent la voirie, l'éclairage public, les espaces verts, l'école primaire, un pôle sportif, la place du marché, la surveillance urbaine, les pistes cyclables et le tri sélectif.",
"La mairie est ouverte du lundi au vendredi de 8h30 à 12h00.",
"Le règlement municipal vise principalement à garantir l'ordre public, la sécurité, la tranquillité et la salubrité dans la commune pour tous.",
"Le plan d'action 2026 prévoit environ 2,5 km de nouvelles pistes cyclables sécurisées.",
"Le système ne peut pas donner la météo en temps réel et suggère de consulter une source externe." # Même pour une réponse "je ne sais pas", la ground_truth est utile
]

3. Formater les données pour Ragas (avec datasets) :

Ragas s'intègre nativement avec la bibliothèque datasets de Hugging Face. Nous allons créer un objet Dataset à partir de nos listes.

from datasets import Dataset
import pandas as pd 

# Création du dictionnaire pour le Dataset
evaluation_data = {
    "question": questions_test,
    "answer": answers,
    "contexts": placeholder_contexts,
    "ground_truth": ground_truths # Inclusion de la vérité terrain
    }
    
# Créer l'objet Dataset
evaluation_dataset = Dataset.from_dict(evaluation_data)
print("\n--- Aperçu du Dataset formaté pour Ragas ---")

Notre jeu de données evaluation_dataset est maintenant prêt ! Il contient toutes les informations nécessaires pour que Ragas puisse calculer ses différentes métriques et nous donner un aperçu complet de la performance de notre système RAG.

Les métriques clés de Ragas pour évaluer votre RAG

Ragas propose plusieurs métriques. Concentrons-nous sur les plus importantes pour évaluer à la fois la génération et la récupération.

1. Évaluation de la qualité de la génération (Le "G" de RAG)

Ces métriques évaluent la réponse (answer) produite par le LLM, en la comparant à la question (question) et au contexte (contexts) qui lui a été fourni.

faithfulness (Fidélité)

  • Objectif : Mesurer si la réponse générée s'appuie exclusivement sur les informations présentes dans lescontextsfournis. Un score faible (proche de 0) indique que la réponse contient des informations non sourcées ou inventées (hallucinations). Un score élevé (proche de 1) signifie que la réponse est bien ancrée dans le contexte.

  • Calcul (Simplifié) : Ragas identifie les affirmations clés dans laansweret vérifie si chacune peut être directement justifiée par une partie descontexts.

answer_relevancy (Pertinence de la Réponse)

  • Objectif : Mesurer si laanswerest pertinente par rapport à laquestioninitiale. Une réponse peut être parfaitement fidèle au contexte (faithfulnessélevé) mais répondre complètement à côté de la plaque.

  • Calcul (Simplifié) : Ragas évalue la pertinence sémantique (le sens) entre laquestionet laanswer, souvent en utilisant des embeddings ou un LLM pour juger si la réponse aborde le sujet de la question. Un score élevé (proche de 1) est souhaité.

2. Évaluation de la qualité de la récupération (Le "R" de RAG)

Ces métriques évaluent l'efficacité de votre module de recherche (retriever) : a-t-il récupéré les bons contexts pour répondre à la question ?

context_precision (Précision du Contexte)

  • Objectif : Mesurer la proportion d'informations pertinentes parmi lescontextsrécupérés. Est-ce que les documents/chunks remontés sont majoritairement utiles pour répondre à laquestion, ou y a-t-il beaucoup de "bruit" non pertinent ?

  • Calcul (Simplifié) : Ragas évalue, pour chaque segment danscontexts, s'il est réellement pertinent pour laquestion. Un score élevé (proche de 1) signifie peu de bruit.

context_recall (Rappel du Contexte)

  • Objectif : Mesurer si toutes les informations nécessaires pour répondre complètement à laquestionont bien été récupérées dans lescontexts. Est-ce qu'on a manqué des informations cruciales qui se trouvaient pourtant dans la base de connaissances ?

  • Calcul (Simplifié) : C'est là que laground_truthest essentielle. Ragas compare les informations présentes dans laground_truthavec celles trouvées dans lescontextspour voir si tout le nécessaire a été récupéré. Sansground_truth, l'estimation est beaucoup moins fiable. Un score élevé (proche de 1) indique que le retriever a bien retrouvé les éléments essentiels.

context_relevancy (Pertinence du Contexte)

  • Objectif : Similaire àcontext_precision, mais se concentre davantage sur la pertinence globale du contenu descontextspar rapport à laquestion. Mesure à quel point les segments récupérés sont ciblés.

  • Calcul (Simplifié) : Évalue la pertinence sémantique entre laquestionet l'ensemble descontextsrécupérés.

Ensemble, ces métriques nous donnent une vue détaillée des forces et faiblesses de chaque étape de notre pipeline RAG.

Mise en pratique : Calculer les métriques avec Ragas

Maintenant que nous avons notre evaluation_dataset et que nous comprenons les métriques, passons au code pour effectuer l'évaluation. Le code suivant reprend les données définies précédemment et lance une évaluation Ragas complète en utilisant les modèles Mistral (via Langchain) pour le LLM et les embeddings nécessaires aux calculs des métriques.

# Imports
import os
import pandas as pd
from datasets import Dataset
import asyncio
import nest_asyncio
import traceback
from typing import List, Dict # Utile pour les type hints
from langchain_mistralai.chat_models import ChatMistralAI
from langchain_mistralai.embeddings import MistralAIEmbeddings
from ragas import evaluate
from ragas.metrics import (
    faithfulness,
    answer_relevancy,
    context_precision,
    context_recall,
)

nest_asyncio.apply()
evaluation_data = {
    "question": questions_test,
    "answer": answers,
    "contexts": placeholder_contexts,
    "ground_truth": ground_truths
}
evaluation_dataset = Dataset.from_dict(evaluation_data)
print("Dataset d'évaluation prêt.")

# --- Configuration et Exécution de l'Évaluation
MISTRAL_API_KEY = os.getenv("MISTRAL_API_KEY", "VOTRE_CLE_API_MISTRAL_ICI")
if MISTRAL_API_KEY == "VOTRE_CLE_API_MISTRAL_ICI" or not MISTRAL_API_KEY:
     print("⚠️ AVERTISSEMENT : Clé API Mistral non trouvée ou non définie.")

try:
    # 1. Initialisation du LLM et des Embeddings (via Langchain)
    print("Initialisation LLM et Embeddings Mistral...")
    mistral_llm = ChatMistralAI(mistral_api_key=MISTRAL_API_KEY, model="mistral-large-latest", temperature=0.1)
    mistral_embeddings = MistralAIEmbeddings(mistral_api_key=MISTRAL_API_KEY)
    print("LLM et Embeddings initialisés.")

    # 2. Définition des métriques à calculer
    metrics_to_evaluate = [
        faithfulness,       # Génération: fidèle au contexte ?
        answer_relevancy,   # Génération: réponse pertinente à la question ?
        context_precision,  # Récupération: contexte précis (peu de bruit) ?
        context_recall,     # Récupération: infos clés récupérées (nécessite ground_truth) ?
    ]
    print(f"Métriques sélectionnées: {[m.name for m in metrics_to_evaluate]}")

    # 3. Lancement de l'évaluation Ragas
    print("\nLancement de l'évaluation Ragas (peut prendre du temps)...")
    results = evaluate(
        dataset=evaluation_dataset,
        metrics=metrics_to_evaluate,
        llm=mistral_llm,                # LLM pour juger certaines métriques
        embeddings=mistral_embeddings   # Embeddings pour juger d'autres métriques
    )
    print("\n--- Évaluation Ragas terminée ---")

    # 4. Affichage des résultats sous forme de DataFrame
    print("\n--- Résultats de l'évaluation (DataFrame) ---")
    results_df = results.to_pandas()
    pd.set_option('display.max_rows', None)
    pd.set_option('display.max_columns', None)
    pd.set_option('display.width', 1000)
    pd.set_option('display.max_colwidth', 150) # Ajustez si nécessaire
    print(results_df)

    # 5. Calcul et affichage des scores moyens
    print("\n--- Scores Moyens (sur tout le dataset) ---")
    average_scores = results_df.mean(numeric_only=True)
    print(average_scores)
except Exception as e:
    print(f"\n❌ ERREUR lors de l'initialisation ou de l'évaluation Ragas : {e}")
    print("\nTraceback:")
    traceback.print_exc()

Analysez les résultats et identifiez les points faibles

L'exécution du code ci-dessus vous fournira un DataFrame Pandas (results_df) contenant les scores pour chaque métrique et chaque question, ainsi que les scores moyens (average_scores). L'étape suivante, cruciale, est d'interpréter ces chiffres pour comprendre où agir.

1. Regardez les Scores Moyens

Ils donnent une première indication globale de la performance. Des scores moyens élevés (idéalement > 0.8 ou 0.9, selon vos exigences) sont un bon signe. Des scores faibles signalent des problèmes systémiques.

2. Analysez les Scores par Métrique (et investiguez les scores bas) 

faithfulness faible ?

  • Problème probable : Le LLM invente des informations ou ne se base pas correctement sur le contexte fourni. C'est le problème d'hallucination.

  • Pistes d'amélioration :

    • Améliorer la qualité du contexte (voircontext_precisionetcontext_recall). Un contexte plus propre et complet aide le LLM.

    • Renforcer le prompt système : Donner des instructions plus claires et strictes au LLM pour qu'il se base uniquement sur les documents fournis et qu'il indique s'il ne trouve pas la réponse ("D'après les documents fournis...", "Je ne trouve pas cette information dans les documents...").

    • Utiliser un LLM plus performant ou réputé pour sa meilleure fidélité.

    • Réduire latemperaturede génération (souvent déjà bas pour RAG, ex: 0.1 ou 0).

answer_relevancy faible ?

  • Problème probable : La réponse ne correspond pas bien à la question, même si elle est peut-être fidèle au contexte. Le LLM a pu mal interpréter la question, se focaliser sur un détail non pertinent, ou générer une réponse trop vague/générale.

  • Pistes d'amélioration :

    • Améliorer la qualité/pertinence du contexte (context_precision).

    • Reformuler le prompt pour mieux guider le LLM sur le type de réponse attendu (concise, détaillée, etc.).

    • Utiliser un LLM plus apte à suivre les instructions et à comprendre les nuances des questions.

    • Vérifier la clarté de la question elle-même.

context_precision faible ?

  • Problème probable : Le module de recherche (retriever) ramène trop de documents/chunks non pertinents ("bruit") avec les informations utiles. Le contexte fourni au LLM est "pollué".

  • Pistes d'amélioration (liées au Retriever) :

    • Affiner le modèle d'embedding utilisé pour la recherche vectorielle.

    • Optimiser la stratégie de découpage (chunking) : Revoir la taille des chunks, le chevauchement, la méthode de découpage.

    • Ajuster le nombre de documents récupérés (k) : Peut-êtrekest-il trop élevé ? Ou tester deskdifférents.

    • Utiliser des techniques de filtrage (par métadonnées avant la recherche, ou post-filtrage).

    • Implémenter un "re-ranker" : Un modèle supplémentaire qui réordonne leskdocuments récupérés par le retriever initial en fonction de leur pertinence spécifique à la question.

context_recall faible ?

  • Problème probable : Le retriever ne trouve pas toutes les informations nécessaires qui existent pourtant dans la base de connaissances. Des documents/chunks importants sont manqués.

  • Pistes d'amélioration (liées au Retriever) :

    • Améliorer le modèle d'embedding.

    • Vérifier l'indexation : S'assurer que tous les documents pertinents sont bien présents et correctement traités/indexés dans la base vectorielle.

    • Ajuster la stratégie de chunking : Des chunks trop petits peuvent séparer des informations qui devraient rester ensemble. Des chunks plus grands ou avec plus de chevauchement peuvent aider.

    • Augmenter le nombre de documents récupérés (k), si le problème est simplement de ne pas remonter assez de documents potentiellement utiles (à équilibrer aveccontext_precision).

    • Explorer des techniques de recherche hybride (combinant recherche sémantique et recherche par mots-clés).

3. Examinez les Scores Individuels :

  • Ne vous contentez pas des moyennes. Triez le DataFrameresults_dfpar les scores les plus bas pour chaque métrique.

  • Regardez les questions spécifiques qui obtiennent de mauvais scores. Cela révèle souvent des patterns : le système échoue-t-il sur un certain type de question ? Un document source pose-t-il problème ? L'analyse de ces cas spécifiques est extrêmement précieuse.

Le cycle d'itération : évaluer pour mieux améliorer

L'évaluation avec Ragas n'est pas une action ponctuelle, mais le moteur d'un cycle d'amélioration continue :

  1. Évaluer : Utilisez Ragas et votre jeu de données test pour obtenir une photographie des performances actuelles.

  2. Analyser : Interprétez les scores (moyens et individuels) pour identifier les points faibles (ex: faiblecontext_recall).

  3. Hypothétiser & Implémenter : Formulez une hypothèse sur la cause du problème (ex: "les chunks sont trop petits") et mettez en œuvre une modification ciblée (ex: augmenter la taille des chunks et ré-indexer).

  4. Ré-évaluer : Relancez l'évaluation Ragas sur le même jeu de données test pour mesurer objectivement l'impact de votre modification. Le score decontext_recalla-t-il augmenté ? Les autres scores ont-ils été affectés ?

  5. Répéter : Continuez ce cycle en vous attaquant aux faiblesses restantes jusqu'à atteindre un niveau de performance jugé satisfaisant pour l'utilisation par Josiane.

Dans cette vidéo, nous avons vu :

  • Pourquoi l'évaluation est cruciale : Nous avons souligné l'importance d'évaluer objectivement notre système RAG pour garantir sa fiabilité, sa précision et éviter les "hallucinations" dans les réponses fournies à Josiane et aux administrés.

  • Présentation de Ragas : Nous avons introduit Ragas comme un framework puissant et spécialisé pour quantifier la performance des systèmes RAG, allant au-delà d'une simple impression subjective.

  • Préparation des données d'évaluation : Nous avons détaillé comment créer un jeu de données test en générant les réponses (answer) et les contextes récupérés (contexts) par notre propre système RAG pour un ensemble de questions (question), et comment formater ces données pour Ragas en utilisant la bibliothèquedatasets.

  • Les métriques clés de Ragas :

    • Pour la génération :faithfulness(la réponse est-elle fidèle au contexte ?) etanswer_relevancy(la réponse est-elle pertinente pour la question ?).

    • Pour la récupération :context_precision(le contexte récupéré est-il exempt de bruit ?),context_recall(avons-nous récupéré toutes les informations nécessaires ?) etcontext_relevancy(le contexte est-il utile pour la question ?).

  • Calcul et interprétation des scores : Nous avons montré comment calculer ces métriques avec Ragas et comment interpréter les scores obtenus pour diagnostiquer les points forts et les points faibles de notre pipeline RAG (problèmes de récupération vs problèmes de génération).

  • L'évaluation comme processus itératif : Nous avons conclu que l'évaluation avec Ragas n'est pas une fin en soi, mais un outil essentiel pour guider les améliorations futures de notre système.

Maintenant que nous savons comment mesurer la performance de notre RAG, nous pouvons explorer des moyens concrets de l'améliorer.

À vous de jouer

Contexte

L'évaluation avec Ragas (en particulier les métriques comme context_precision et context_relevancy) peut révéler que notre système de recherche (search_similar_documents) retourne parfois des documents qui, bien qu'étant les plus proches dans l'espace vectoriel, ne sont pas suffisamment pertinents pour la question posée. Récupérer trop de documents, ou des documents peu pertinents, peut nuire à la qualité de la réponse finale.

Pour améliorer cela, nous pouvons affiner notre fonction de recherche en ajoutant deux contrôles :

  1. Seuil de Similarité (ou Distance) : Ne retourner que les documents dont la similarité avec la question dépasse un certain seuil (ou dont la distance est inférieure à un seuil). Cela évite d'inclure des documents "moins mauvais" mais objectivement peu pertinents.

  2. Contrôle du Nombre de Documents (k) : Ajuster le nombre maximum de documents retournés (k) peut aider à équilibrer la quantité d'information et la pertinence. Ce paramètre est déjà présent, mais nous allons souligner son importance et comment l'utiliser conjointement avec le seuil.

Consignes

  1. Modifier  search_similar_documents  : Ouvrez le fichier utils/vector_store.py et modifiez la fonction  search_similar_documents  .

  2. Ajouter un Paramètre de Seuil : Ajoutez un nouveau paramètre à la fonction, par exemple  max_distance_threshold  (puisque IndexFlatL2 renvoie des distances L2, où plus petit est mieux). Donnez-lui une valeur par défaut raisonnable (peut-être None pour ne pas filtrer par défaut, ou une valeur numérique si vous avez une idée basée sur vos distances typiques).

  3. Implémenter le Filtrage par Seuil : Après avoir obtenu les distances et indices de  index.search  , filtrez les résultats. Ne conservez que les paires (distance, index) pour lesquelles la distance est inférieure ou égale à  max_distance_threshold  (si un seuil est fourni).

  4. Retourner les Résultats Filtrés : La fonction doit retourner la liste des chunks correspondant uniquement aux indices qui ont passé le filtre de seuil, tout en respectant la limite initiale k.

  5. Rendre Configurable : (Bonus) Assurez-vous que k et  max_distance_threshold  peuvent être facilement ajustés, idéalement en les lisant depuis votre fichier de configuration (config.yaml), pour pouvoir expérimenter différentes valeurs sans modifier le code principal.

En résumé

  • Préparez un jeu de données d'évaluation contenant les questions, les réponses générées et les contextes récupérés.

  • Utilisez les métriques clés de Ragas (  faithfulness, answer_relevancy  ) pour évaluer la qualité de la réponse générée.

  • Utilisez les métriques clés de Ragas (  context_precision  ,  context_recall  ,  context_relevancy  ) pour évaluer l'efficacité de l'étape de récupération d'information.

  • Analysez les scores obtenus pour diagnostiquer les problèmes et guider les améliorations itératives de votre système.

Cette approche méthodique est essentielle pour transformer un prototype RAG en un outil fiable et performant, capable de répondre aux exigences de précision et de fiabilité nécessaires pour l'assistant virtuel de la mairie de Trifouillis-sur-Loire. Maintenant que nous savons comment évaluer et améliorer notre système, nous pouvons aborder la récupération des interactions utilisateur pour le monitoring et l’amélioration du système.

Ever considered an OpenClassrooms diploma?
  • Up to 100% of your training program funded
  • Flexible start date
  • Career-focused projects
  • Individual mentoring
Find the training program and funding option that suits you best