Aller au contenu
English

Mesurer la récupération

  • Leçon 13
  • 50 min
  • Module 5 : Évaluer et déboguer le pipeline

Ce que vous saurez faire

Mesurez avec plusieurs nombres à quel point la recherche trouve les preuves. Le rappel à k indique quelle part des preuves atteint le modèle. La précision à k indique quelle part du contexte est du bruit. La moyenne des rangs réciproques indique à quel point les preuves sont près du début.

Avant de commencerCe qu’il faut savoir et avoir sous la mainEnviron 50 minutes

Ce que vous devez savoir

Ce qu’il vous faut sur votre ordinateur

  • ~/projects/policy-assistant à la fin du module 4, avec .venv actif : python -m pytest affiche 74 passed, 1 deselected (74 tests réussis, 1 exclu). Si votre projet ne fonctionne plus, copiez l’instantané end-of-m04 du dépôt des exercices, comme l’explique son README.
  • L’index index.sqlite produit par python -m policy_assistant ingest.

Aucun compte ni clé. Testé avec Python 3.12.13 sur macOS (Apple silicon). Les commandes Windows ne sont pas testées. Les nombres de cette leçon sont un instantané de cette date. Les modèles et les outils changent vite; la façon de les mesurer reste valable.

Vous écrivez un texte sur les abeilles. Vous demandez des livres à une bibliothécaire, qui vous en apporte une pile de cinq. Cette pile est-elle bonne? Une seule question ne suffit pas pour le dire.

  • Y a-t-il au moins un livre utile dans la pile?
  • Vous aviez besoin de trois livres : un sur la biologie des abeilles, un sur le miel, un sur les pesticides. Combien des trois sont dans la pile?
  • Combien des cinq livres sont utiles, et combien ajoutent seulement du poids?
  • Un livre utile est-il sur le dessus, ou devez-vous chercher jusqu’au fond?

Une pile peut satisfaire la première question et échouer aux autres. Elle contient le livre sur le miel, donc elle n’est « pas vide ». Mais les deux autres livres nécessaires manquent, et vous devez ouvrir quatre livres pour trouver celui qui est utile.

Le problème : hit@5 indique « trouvé » quand des preuves manquent

Section intitulée « Le problème : hit@5 indique « trouvé » quand des preuves manquent »

Depuis le module 1, le projet a une seule mesure de récupération : hit@5. Elle pose seulement la première question. Regardez Q46 : « La FAQ du centre d’aide dit que les remboursements prennent 3 jours ouvrables. Est-ce exact? »

Pour bien répondre, le modèle a besoin de trois passages. La FAQ indique 3 jours ouvrables. La politique de remboursement et de paiement indique 5 à 10 jours ouvrables. La règle de gouvernance dit qu’une politique a priorité sur un article d’aide. La recherche avec reclassement place la FAQ au rang 1, donc hit@5 compte Q46 comme une réussite. Mais les deux autres passages ne sont pas parmi les 5 premiers. La réponse enregistrée pouvait seulement dire que la FAQ n’était pas confirmée.

hit@5 ignore aussi l’ordre. Trois méthodes de récupération de Larkfield ont exactement le même hit@5, soit 0,898. Sont-elles aussi bonnes? Cette leçon répond avec des mesures qui permettent de les distinguer. Découper de façon réfléchie a montré un autre angle mort : un segment peut compter comme un résultat pertinent sans contenir la réponse. Ces mesures ne corrigent pas ce problème. La dernière leçon de ce module montre comment le repérer.

L’idée : des étiquettes de pertinence et trois mesures

Section intitulée « L’idée : des étiquettes de pertinence et trois mesures »

Chaque mesure doit savoir quels passages sont les bons. Une étiquette de pertinence indique, pour une question, quels passages contiennent les preuves. Grace les a rédigées pour les 67 questions en lisant les documents. Pour chaque question, elle a noté le document, sa version et sa section. Un script a ensuite vérifié chaque étiquette : le passage existe, est en vigueur à la date de la question et est public si la question est publique. Aucun modèle n’a rédigé ni étiqueté de question. C’est la lecture d’une seule personne, et vous pouvez vérifier chaque étiquette dans questions/questions.jsonl.

Avec ces étiquettes, le projet mesure trois choses pour chaque question, puis calcule la moyenne sur les questions.

  • Rappel à k (recall@k) : la proportion des passages pertinents pour la question que couvrent les k premiers résultats. Q46 en exige trois, et les 5 premiers en couvrent un : recall@5 = 1 ÷ 3 = 0,33. Il répond à « quelle part des preuves atteint le modèle? »
  • Précision à k (precision@k) : la proportion des k premiers segments qui sont pertinents. Elle répond à « quelle part du contexte est une preuve, et quelle part est du bruit? »
  • Rang réciproque : 1 ÷ le rang du premier segment pertinent. Le rang 1 donne 1, le rang 3 donne 1/3, et aucun segment pertinent parmi les k premiers donne 0. Sa moyenne sur les questions est la moyenne des rangs réciproques (MRR). Elle répond à « à quel point les preuves sont-elles près du début? »

Ce sont les mesures precision@k et recall@k du cours d’apprentissage automatique, calculées pour chaque question, puis moyennées. hit@k reste la forme la plus simple du rappel : « au moins un ». Les questions sans réponse possible n’ont aucun passage pertinent. Elles sont donc exclues des quatre mesures.

Les moteurs de recherche utilisent aussi le nDCG (gain cumulé actualisé normalisé). Il accorde un crédit partiel aux passages partiellement pertinents, et moins de crédit aux passages plus bas dans la liste. Les étiquettes de Grace indiquent seulement « pertinent » ou « non pertinent », donc ce cours n’en a pas besoin.

Prenez cinq questions inventées, de A à E, et les 3 premiers résultats de chacune (k = 3). Ces cinq questions forment le test dans tests/test_evaluate.py, donc vous pouvez vérifier chaque valeur.

Cinq lignes, une par question, avec les 3 premiers résultats et les valeurs de chacune. A exige 1 passage; le résultat 1 est pertinent : hit 1, rappel 1 sur 1, précision 1 sur 3, rang réciproque 1. B exige 1 passage; le résultat 3 est pertinent : hit 1, rappel 1, précision 1 sur 3, rang réciproque 1/3. C exige 2 passages; le résultat 1 est l'un d'eux : hit 1, rappel 1 sur 2 = 0,5, précision 1 sur 3, rang réciproque 1. D exige 1 passage; aucun résultat n'est pertinent : toutes les valeurs sont 0. E n'a aucun passage pertinent et est exclue. Moyennes de A à D : hit@3 0,75, recall@3 0,625, precision@3 0,25, MRR 0,583.
L'exemple détaillé de tests/test_evaluate.py : cinq questions, chacune avec 3 résultats. Une case bleue indique un résultat pertinent. E n'a aucun passage pertinent, donc elle est exclue de chaque moyenne.
Description textuelle du diagramme

Un tableau de cinq lignes. A : résultat 1 pertinent, résultats 2 et 3 non pertinents; hit 1, rappel 1 sur 1 = 1, précision 1 sur 3, rang réciproque 1. B : seul le résultat 3 est pertinent; hit 1, rappel 1, précision 1 sur 3, rang réciproque 1/3. C exige deux passages, et le résultat 1 est l’un d’eux. C : hit 1, rappel 1 sur 2 = 0,5, précision 1 sur 3, rang réciproque 1. D n’a aucun résultat pertinent, donc chaque valeur est 0. E n’a aucun passage pertinent, donc elle est exclue. Sous les lignes figurent les moyennes de A à D : hit@3 0,75, recall@3 0,625, precision@3 0,25, MRR 0,583.

Calculez maintenant les moyennes sur les quatre questions qui ont des passages pertinents :

Mesure A B C D Moyenne de A à D
hit@3 1 1 1 0 3 ÷ 4 = 0,75
recall@3 1 1 0,5 0 2,5 ÷ 4 = 0,625
precision@3 1/3 1/3 1/3 0 1 ÷ 4 = 0,25
rang réciproque 1 1/3 1 0 2,333 ÷ 4 = 0,583

Lisez les colonnes. A et B ont les mêmes valeurs de hit, de rappel et de précision. Seul le rang réciproque montre que B vous a fait lire deux résultats inutiles avant le bon. C et A ont le même hit, mais le rappel montre qu’il manque la moitié des preuves de C. hit@3 donne un seul nombre pour tout cela; les trois autres mesures indiquent où sont les problèmes.

Mise en pratique : les mesures complètes dans le projet

Section intitulée « Mise en pratique : les mesures complètes dans le projet »

Le nouveau evaluate.py du projet calcule recall@k, precision@k et MRR. Le nouveau __main__.py les affiche dans eval (évaluation). evaluate.py contient aussi les vérifications des réponses de la prochaine leçon. Copiez les trois fichiers de l’instantané end-of-m05.

  1. Copiez evaluate.py, __main__.py et le nouveau test. Sur macOS et Linux :

    Fenêtre de terminal
    cp ../nextia-learning-labs/C09/snapshots/end-of-m05/policy_assistant/evaluate.py policy_assistant/
    cp ../nextia-learning-labs/C09/snapshots/end-of-m05/policy_assistant/__main__.py policy_assistant/
    cp ../nextia-learning-labs/C09/snapshots/end-of-m05/tests/test_evaluate.py tests/

    Sur Windows, dans PowerShell :

    Fenêtre de terminal
    Copy-Item ..\nextia-learning-labs\C09\snapshots\end-of-m05\policy_assistant\evaluate.py policy_assistant\
    Copy-Item ..\nextia-learning-labs\C09\snapshots\end-of-m05\policy_assistant\__main__.py policy_assistant\
    Copy-Item ..\nextia-learning-labs\C09\snapshots\end-of-m05\tests\test_evaluate.py tests\
  2. Ouvrez policy_assistant/evaluate.py. Trouvez retrieval_scores, puis les quatre lignes qui calculent hit, recall, precision et rr pour une question.

  3. Exécutez les tests. Vous voyez 77 passed, 1 deselected (77 tests réussis, 1 exclu) :

    Fenêtre de terminal
    python -m pytest

    Le nouveau test test_five_questions_by_hand est l’exemple détaillé ci-dessus.

  4. Mesurez la méthode par défaut du cours, la recherche avec reclassement, avec les 5 premiers résultats :

    Fenêtre de terminal
    python -m policy_assistant eval

    La commande charge d’abord les deux modèles locaux, ce qui prend environ 30 secondes. La sortie :

    rerank, top 5, audience staff: 59 questions with relevant passages
    hit@5 0.898 | recall@5 0.856 | precision@5 0.231 | MRR 0.831 | staff passages shown to a public audience: 0 | wrong versions: 0
    kind n hit recall MRR
    answerable 18 0.889 0.833 0.889
    contradiction 4 1.000 0.625 1.000
    exact-code 11 1.000 1.000 1.000
    injection-bait 3 0.333 0.333 0.333
    staff-only 7 1.000 1.000 1.000
    table 8 0.875 0.875 0.729
    version 8 0.875 0.875 0.525

Lisez d’abord la ligne sous le titre. hit@5 vaut 0,898, comme au module 3. recall@5 est plus faible, à 0,856, car certaines questions exigent deux ou trois passages et n’en reçoivent qu’une partie. Les deux dernières valeurs vérifient les filtres du module 3. Aucune mauvaise version n’atteint les 5 premiers résultats. Le nombre de fuites reste toujours à 0 pour le personnel; il compte seulement avec --audience public, utilisé au module 6.

Lisez ensuite le tableau par type. Les questions de contradiction ont un hit de 1,000 et un rappel de 0,625. Les 5 premiers résultats contiennent toujours un côté du conflit, mais souvent pas l’autre côté ou la règle. Les questions de version ont un rappel de 0,875 et une MRR de 0,525 : la recherche trouve la bonne version, mais souvent pas au rang 1. hit@5 seul ne permettait de voir aucun des deux problèmes.

Pourquoi precision@5 est-elle si faible, à 0,231? La plupart des questions ont une seule section pertinente, contenue dans un seul segment. Alors, au plus 1 des 5 segments peut être pertinent, et precision@5 ne peut pas dépasser 0,2. Une faible precision@5 est normale ici. Elle montre le coût : la plupart des passages que le modèle lit ne sont pas des preuves.

Amira a exécuté chaque méthode du module 3 avec k = 1, 3, 5 et 10, et Priya a tracé recall@k. Une liste plus longue ne peut qu’ajouter des preuves, donc chaque courbe monte. La question est de savoir à quelle vitesse.

  • Reclassement
  • Dense (e5)
  • Hybride (RRF)
  • BM25
recall@k avec k = 1, 3, 5 et 10 sur les 59 questions de Grace ayant des passages pertinents (segments par structure, filtres de date et d'accès activés, public cible : personnel). Le reclassement fait relire les 20 premiers résultats de la recherche hybride par l'encodeur croisé. Le reclassement arrive en tête avec k = 1, 3 et 10; la recherche dense mène avec k = 5 par moins d'une question; BM25 est le plus faible pour chaque k.
Description textuelle du graphique

Un graphique à quatre courbes. L’axe horizontal est k : 1, 3, 5 et 10. L’axe vertical est recall@k, de 0,4 à 1. Reclassement : 0.641, 0.825, 0.856, 0.921. Dense avec e5 : 0.531, 0.785, 0.862, 0.895. Hybride avec fusion des rangs réciproques : 0.54, 0.743, 0.811, 0.904. BM25 : 0.421, 0.689, 0.771, 0.828. Le reclassement est le plus élevé avec k = 1, 3 et 10; la recherche dense est la plus élevée avec k = 5. BM25 est le plus faible pour chaque k.

Trois points ressortent. Avec k = 1, le reclassement trouve 0.641 des preuves et BM25 0.421 : le travail de l’encodeur croisé paraît au début de la liste. Avec k = 5, la recherche dense a le rappel le plus élevé, 0.862, juste au-dessus du reclassement à 0.856. Avec k = 10, le reclassement atteint 0.921. La meilleure méthode dépend donc du nombre de passages que vous donnez au modèle.

Le tableau avec k = 5, incluant aussi le modèle de plongement hébergé et la reformulation des requêtes :

Méthode hit@5 recall@5 precision@5 MRR
BM25 0.831 0.771 0.207 0.655
Dense (e5, local) 0.915 0.862 0.234 0.769
Dense (embed-small, hébergé) 0.881 0.836 0.231 0.827
Hybride (e5, RRF) 0.864 0.811 0.220 0.745
Hybride (embed-small, RRF) 0.898 0.845 0.227 0.787
Reclassement (par défaut dans le cours) 0.898 0.856 0.231 0.831
BM25 + reformulation 0.898 0.825 0.227 0.745
Reclassement + reformulation 0.932 0.864 0.234 0.882

Revenons à la question du début de la leçon. Trois méthodes ont un hit@5 de 0.898 : BM25 avec reformulation, hybride avec embed-small et reclassement. Leur MRR diffère.

Trois méthodes avec exactement le même hit@5 (0,898) : BM25 avec reformulation des requêtes, recherche hybride avec le modèle hébergé embed-small et reclassement. Elles placent le premier passage pertinent à des rangs différents; le reclassement le place le plus haut.
Description textuelle du graphique

Un graphique à trois colonnes, toutes pour des méthodes ayant un hit@5 de 0,898. BM25 avec reformulation des requêtes : MRR 0.745. Recherche hybride avec le modèle hébergé embed-small : 0.787. Reclassement : 0.831.

Chacune des trois trouve des preuves pour 53 des 59 questions. Le reclassement les place plus haut. Une MRR de 0,831 signifie que le premier passage pertinent est généralement au rang 1. Une MRR de 0,745 signifie qu’il est souvent au rang 2 ou 3. L’ordre compte-t-il si le modèle lit les cinq passages? Il compte quand le budget de contexte coupe la liste, quand un agent lit les passages et quand un modèle fait surtout confiance au premier passage.

Priya ajoute un avertissement. Avec 59 questions, une question représente 1 ÷ 59 = 0,017 de hit@5. La recherche dense (0,915) et le reclassement (0,898) diffèrent d’une question. Cela ne prouve pas qu’une méthode est meilleure. Regardez quelles questions ont changé avant de croire à une différence.

  • recall@k est la principale mesure pour la RAG. Le modèle peut utiliser seulement les preuves qui l’atteignent, donc recall@k limite le nombre de bonnes réponses possibles. Mesurez-le au k que vous envoyez réellement au modèle.
  • MRR compte quand l’ordre compte : un petit budget, une personne qui lit les premiers résultats ou un modèle de reclassement à évaluer.
  • precision@k mesure le bruit et le coût. Chaque passage qui n’est pas une preuve coûte des jetons (tokens) et peut induire le modèle en erreur. Ne cherchez pas seulement à l’améliorer : k = 1 donne la meilleure précision, mais perd des preuves.
  • hit@k reste utile comme première vérification rapide.

Les quatre mesures exigent des étiquettes de pertinence, et ces étiquettes sont la partie coûteuse. Une personne qui connaît les documents doit les rédiger à la main et les mettre à jour quand un document change. Elles reflètent aussi la lecture d’une seule personne. Une deuxième personne peut trouver un passage pertinent que Grace n’a pas listé. Une méthode qui le trouve ne reçoit aucun crédit.

Erreur courante

Le jeu de questions a changé entre deux comparaisons

Symptôme : supposons que Tomás compare les méthodes deux fois, à une semaine d’intervalle. La première fois, le modèle hébergé embed-small offre le meilleur classement : MRR 0.832 contre 0.819 pour le reclassement. La deuxième fois, le reclassement est le meilleur : 0.831 contre 0.827. Personne n’a changé le code de recherche. « Lequel est vrai? »

Cause : le jeu de questions a changé. Les premières exécutions utilisaient 55 questions avec des passages pertinents. Elles ont montré que les codes de produit dans des phrases complètes ne distinguaient pas les recherches par mots-clés et vectorielle. Grace a donc ajouté quatre questions portant seulement sur un identifiant, comme Q64 « Qu’est-ce que LB-1? ». Voici les mêmes résultats enregistrés, mesurés sur les deux jeux :

Méthode MRR sur les 55 premières MRR sur les 59 hit@5 sur 55 hit@5 sur 59
BM25 0.630 0.655 0.818 0.831
Dense (e5) 0.809 0.769 0.927 0.915
Dense (embed-small) 0.832 0.827 0.891 0.881
Reclassement 0.819 0.831 0.891 0.898

La recherche par mots-clés classe les identifiants en premier, et la recherche dense e5 les manque. Les quatre nouvelles questions font donc monter BM25 et baisser la recherche dense. L’ordre des deux meilleures méthodes s’inverse. Les deux classements se jouent à une ou deux questions près, donc aucune comparaison ne prouve grand-chose.

Correction : figez le jeu de questions, ses étiquettes et ses clés avant une comparaison finale, et donnez-lui une version. Mesurez chaque méthode sur la même version. Ajouter des questions pendant le développement est une bonne chose : Grace les a ajoutées parce que les premières exécutions montraient une lacune. Mais un nombre mesuré sur 55 questions ne peut pas être comparé à un nombre mesuré sur 59.

Pour un vrai assistant : notez la version du jeu de questions à côté de chaque nombre dans un rapport. Quand le jeu change, mesurez toutes les méthodes de nouveau.

Faites une prédiction avant l’exécution : quand k passe de 5 à 1, le rappel monte-t-il ou baisse-t-il? Et la précision? Exécutez ensuite :

Fenêtre de terminal
python -m policy_assistant eval --k 1
python -m policy_assistant eval --k 10
Afficher la réponse

La deuxième ligne de chaque sortie :

hit@1 0.797 | recall@1 0.641 | precision@1 0.797 | MRR 0.797 | staff passages shown to a public audience: 0 | wrong versions: 0
hit@10 0.966 | recall@10 0.921 | precision@10 0.125 | MRR 0.840 | staff passages shown to a public audience: 0 | wrong versions: 0

De k = 1 à k = 10, le rappel monte de 0,641 à 0,921 et la précision baisse de 0,797 à 0,125. C’est le compromis du cours d’apprentissage automatique. Avec k = 1, la précision, hit et MRR ont la même valeur, car un résultat est pertinent ou non. MRR monte seulement un peu avec k = 10, de 0,831 à 0,840. Un passage pertinent au rang 6 à 10 ajoute au plus 1/6. Dans le tableau par type, les questions de version et de tableau atteignent 1,000 avec k = 10. Leurs preuves étaient là, juste sous le rang 5. La dernière leçon de ce module vérifie si 10 passages donnent de meilleures réponses.

Vérifiez votre compréhension

Dans vos mots : que mesure recall@5 que hit@5 ne mesure pas? Utilisez Q46 comme exemple.

Afficher la réponse

hit@5 vérifie si au moins un passage pertinent figure parmi les 5 premiers. recall@5 mesure la proportion de tous les passages pertinents qui s’y trouvent. Q46 nécessite trois passages : la FAQ, la politique de remboursement et la règle de gouvernance. Les 5 premiers résultats contiennent seulement la FAQ. Donc, hit@5 vaut 1, et recall@5 vaut 1 ÷ 3 = 0,33. Le modèle reçoit un seul côté du conflit et aucune règle.

Vérifiez votre compréhension

Prédisez : une question a un seul passage pertinent, trouvé au rang 4. Que valent hit@5, recall@5, precision@5 et le rang réciproque?

Afficher la réponse

hit@5 = 1, car le passage figure parmi les 5 premiers. recall@5 = 1 ÷ 1 = 1, car le seul passage pertinent est trouvé. precision@5 = 1 ÷ 5 = 0,2. Le rang réciproque = 1 ÷ 4 = 0,25. Le même passage au rang 1 changerait seulement le rang réciproque, qui passerait à 1.

Vérifiez votre compréhension

La recherche dense obtient un recall@5 de 0,862, contre 0,856 pour le reclassement. Mais le reclassement a un MRR supérieur (0,831 contre 0,769). Omar demande lequel utiliser. Que lui dites-vous, et que vérifieriez-vous d'abord?

Afficher la réponse

L’écart de rappel représente moins d’une question sur 59. Il ne prouve donc rien. L’écart de MRR est plus grand : le reclassement place les preuves plus près du début. Gardez le reclassement si l’ordre compte (un petit budget, des agents qui lisent les passages). Il faut aussi que 0,3 seconde de plus par question soit acceptable. D’abord, vérifiez pour quelles questions chaque méthode trouve ou manque les preuves. Deux méthodes ayant la même moyenne peuvent échouer sur des questions différentes.

Récapitulatif

  • Une étiquette de pertinence indique les passages qui contiennent les preuves pour une question. Grace les a rédigées à la main, et un script les a vérifiées. Toutes les mesures de récupération en dépendent.
  • recall@k : la proportion des passages pertinents qui figurent parmi les k premiers. precision@k : la proportion des k premiers passages qui sont pertinents. MRR : la moyenne de 1 ÷ le rang du premier passage pertinent. hit@k est la forme la plus simple du rappel.
  • Par défaut, le cours utilise le reclassement avec les 5 premiers résultats : hit@5 0,898, recall@5 0,856, precision@5 0,231, MRR 0,831. Le rappel révèle les preuves manquantes pour les questions sur les contradictions. Le MRR révèle les rangs éloignés du début pour les questions sur les versions.
  • Des méthodes ayant le même hit@5 peuvent classer les passages très différemment, et la meilleure méthode dépend de k. Une ou deux questions sur 59 ne constituent pas une preuve.
  • Figez et versionnez le jeu de questions avant une comparaison finale : quatre questions ajoutées ont inversé l’ordre des deux meilleures méthodes.

Ensuite, appliquez le même soin aux réponses : exactitude, appui sur les sources, citations et utilité.

Leçon suivante : Mesurer les réponses