Exercices Projets guidés Evaluer la qualite des reponses
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Evaluer la qualite des reponses

Ton pipeline RAG fonctionne, mais est-ce qu'il repond bien ? En production, tu ne peux pas te contenter de "ca a l'air de marcher". Il te faut des metriques. C'est ce qu'on appelle l'evaluation, et c'est souvent la partie que les developpeurs negligent.

L'idee est simple : tu crees un jeu de test avec des paires question/reponse attendue. Tu passes chaque question dans ton pipeline et tu compares la reponse obtenue avec la reponse attendue. Ce n'est pas une comparaison exacte (le LLM ne repondra jamais mot pour mot la meme chose), mais une verification que les mots-cles importants sont presents.

Voici un jeu de test typique :

test_set = [
{"question": "Combien de jours de conges ?", "mots_cles_attendus": ["25", "jours"]},
{"question": "Le teletravail est-il autorise ?", "mots_cles_attendus": ["3", "jours", "semaine"]},
]

Ecris une fonction evaluer_reponse(reponse, mots_cles_attendus) qui prend une reponse (string) et une liste de mots-cles attendus. Elle renvoie un dictionnaire avec "score" (proportion de mots-cles trouves dans la reponse, entre 0 et 1), "trouves" (liste des mots-cles trouves) et "manquants" (liste des mots-cles manquants).

Ecris aussi une fonction evaluer_pipeline(test_set, fonction_reponse) qui prend un jeu de test et une fonction qui simule le pipeline (prend une question, renvoie une reponse). Elle renvoie un rapport avec "score_moyen" (moyenne des scores), "nb_tests" (nombre de tests), "details" (liste des resultats par question : question, reponse, score, mots_cles_trouves, mots_cles_manquants) et "taux_reussite" (proportion de tests avec un score >= 0.5).

Exemple :

evaluer_reponse("Les conges sont de 25 jours par an", ["25", "jours", "an"])
renvoie {"score": 1.0, "trouves": ["25", "jours", "an"], "manquants": []}

evaluer_reponse("Le teletravail est possible", ["3", "jours"])
renvoie {"score": 0.0, "trouves": [], "manquants": ["3", "jours"]}

Tests (4/5)

Tous les mots-cles trouves
r = evaluer_reponse("Les conges sont de 25 jours par an", ["25", "jours", "an"])
assert r["score"] == 1.0, f"Tous les mots-cles sont presents, le score doit etre 1.0, pas {r['score']}"
assert r["trouves"] == ["25", "jours", "an"]
assert r["manquants"] == []
Aucun mot-cle trouve
r = evaluer_reponse("Le teletravail est possible", ["25", "conges"])
assert r["score"] == 0.0, f"Aucun mot-cle present, le score doit etre 0.0, pas {r['score']}"
assert len(r["manquants"]) == 2
Score partiel
r = evaluer_reponse("Il y a 25 jours de vacances", ["25", "jours", "conges"])
assert abs(r["score"] - 2/3) < 0.01, f"2 mots-cles sur 3, le score doit etre environ 0.6667, pas {r['score']}"
assert len(r["trouves"]) == 2
assert "conges" in r["manquants"]
Evaluation d'un pipeline complet
test_set = [
    {"question": "Q1", "mots_cles_attendus": ["mot1", "mot2"]},
    {"question": "Q2", "mots_cles_attendus": ["mot3"]},
]

def fake_pipeline(question):
    if question == "Q1":
        return "Voici mot1 et mot2 dans la reponse"
    return "Rien de pertinent ici"

r = evaluer_pipeline(test_set, fake_pipeline)
assert r["nb_tests"] == 2
assert r["score_moyen"] == 0.5  # Q1 = 1.0, Q2 = 0.0, moyenne = 0.5
assert r["taux_reussite"] == 0.5  # Q1 >= 0.5, Q2 < 0.5
assert len(r["details"]) == 2

+ 0 tests cachés

Indices (3 disponibles)

solution.py