Établir une référence de base
- Leçon 3
- 50 min
- Module 1 : Définir ce qui est « bon »
Leçon 3 sur 19 · Évaluer et tester les systèmes d'IAÉtablir une référence de base
1. Définir ce qui est « bon »
2. Créer un jeu de données d'évaluation
3. Choisir les métriques par composant
4. Utiliser des juges humains et des juges modèles
5. Comparer les systèmes de façon responsable
6. Automatiser l'évaluation et la rétroaction
Ce que vous saurez faire
Consignez les résultats de l’assistant actuel sur des cas fixes, avec tous les paramètres. Vous pourrez ensuite comparer toute nouvelle version à ces résultats. Enfin, notez les pertes permises pour une nouvelle version et les échecs qui bloquent une mise en production.
Avant de commencerCe qu’il faut savoir et avoir sous la main
Ce que vous devez savoir
- Les critères de Relier les objectifs aux preuves, et votre propre liste dans
success-criteria.md. - Les niveaux d’évaluation et la configuration du projet, dans Choisir les niveaux d’évaluation.
Ce qu’il vous faut
- Votre projet
~/projects/eval-harnessà la fin de la dernière leçon :python -m pytestdonne3 passed(3 tests réussis). S’il ne fonctionne plus ou manque, suivez Réinitialiser le projet. - Le dépôt des exercices dans
~/projects/nextia-learning-labs, à côté de votre projet. Vous copiez l’exécution enregistrée de la référence de base depuis son instantanéend-of-m01.
Vous n’avez besoin ni de compte ni de clé. Les sorties de l’assistant ont été enregistrées une fois avec le vrai modèle. Elles sont conservées dans l’instantané.
Votre temps avant de nouvelles chaussures de course
Section intitulée « Votre temps avant de nouvelles chaussures de course »Une coureuse achète de nouvelles chaussures qui promettent de la rendre plus rapide. Après une semaine, elle court 5 km en 26 minutes. Les chaussures sont-elles bonnes? Elle ne peut pas le dire. Elle ne s’est jamais chronométrée avec ses anciennes chaussures.
La fois suivante, elle procède donc correctement. Avant de changer quoi que ce soit, elle court son parcours habituel avec ses anciennes chaussures. Elle note le temps, le parcours, le jour et la météo. Ces notes sont son point de départ. Elle y compare ses courses suivantes avec les nouvelles chaussures, sur le même parcours. Elle décide aussi à l’avance de ce qui compte le plus. Quelques secondes de plus sont acceptables. Mais une douleur au genou signifie qu’elle cesse de porter les chaussures, peu importe le temps.
Le problème : meilleur que quoi?
Section intitulée « Le problème : meilleur que quoi? »Omar pose une question simple : « La requête v3 est-elle meilleure que ce que nous avons maintenant? » Pour répondre, vous avez besoin d’un relevé clair de « ce que nous avons maintenant ». Tomás a un chiffre en tête : « L’assistant actuel a choisi la bonne équipe pour 69 billets sur 70. Si v3 fait moins bien, on garde v2. »
Priya vérifie d’où vient son chiffre. Il est réel. Il compte les 69 billets de soutien du cours Créer des applications fiables avec les API de LLM et les 2 exemples de la requête v2. Cela fait 71 billets, dont 70 avec une équipe à évaluer. L’assistant actuel a choisi la bonne équipe pour 69 billets. Mais sur les 102 cas de développement de ce cours, le même assistant obtient 97 sur 100 dans la même exécution. Même système, même modèle, même jour : 98,6 % sur un ensemble de billets et 97 % sur un autre. La différence vient uniquement des cas.
Un chiffre sans les cas correspondants signifie donc peu de chose. Ce chiffre cache aussi ses paramètres. Quelle requête l’a produit, avec quelle version du modèle? Était-ce le premier essai, ou le meilleur de cinq? Sans ces renseignements, personne ne peut reproduire ni vérifier le résultat.
L’idée : une référence de base enregistrée comme exécution
Section intitulée « L’idée : une référence de base enregistrée comme exécution »Une référence de base est le résultat enregistré du système actuel sur un jeu d’évaluation fixe, avec tous les paramètres utilisés. Le nom vient de l’arpentage. Une ligne de base est la première ligne mesurée, à partir de laquelle on prend toutes les autres mesures. La nouvelle version que vous y comparez est la version candidate.
Un passage du système sur les cas est une exécution. Une exécution enregistre chaque sortie : la réponse, le temps nécessaire et son coût. Un identifiant d’exécution est un nom court qui identifie une exécution et ses paramètres. Grâce à cet identifiant, n’importe qui peut retrouver les sorties exactes derrière un score et savoir comment elles ont été produites.
Voici l’identifiant d’exécution de la référence de base de Larkfield, partie par partie.
Description textuelle du diagramme
L’identifiant d’exécution baseline-v2-chat-small-r1-b6a2b9 comporte cinq parties, reliées par des traits d’union. baseline (référence de base) désigne le système : la version testée, ici l’assistant actuel. v2 est la version de la requête, du cours Créer des applications fiables avec les API de LLM. chat-small est le déploiement du modèle; le fournisseur a indiqué la version gpt-6-luna-2026-09-22. r1 est le numéro de répétition : la première exécution de ce système avec ces paramètres. b6a2b9 correspond à six caractères d’un hachage de tous les paramètres, y compris l’heure de début. Ainsi, deux exécutions ne partagent jamais un identifiant. Le fichier outputs/runs.json conserve chaque paramètre avec l’identifiant. Il s’agit du SHA-256 du fichier de requête, de la version du modèle et de celle du jeu de données. Il conserve aussi la version des textes des billets. Ces paramètres comprennent également les partitions, les heures de début et de fin, et le nombre de cas, 271.
Les parties lisibles permettent de voir ce qui a été exécuté. La dernière partie rend l’identifiant unique. Un hachage est une courte empreinte de données. Les mêmes données donnent toujours la même empreinte, et un petit changement en donne une complètement différente.
Un petit exemple : un paramètre, un nouvel identifiant
Section intitulée « Un petit exemple : un paramètre, un nouvel identifiant »Le projet construit les identifiants d’exécution avec la fonction make_run_id(). Vous pourrez l’essayer une fois que les prochaines étapes auront ajouté harness/run.py à votre projet. La voici avec trois ensembles de paramètres. Le deuxième diffère du premier uniquement par le numéro de répétition. Le troisième diffère seulement par un caractère de l’empreinte de la requête, abd au lieu de abc.
python -c "from harness.run import make_run_idprint(make_run_id('baseline', 'v2', 'abc', 'chat-small', 'd4c96eaa10c0', 1, '2026-10-09T14:56:12-04:00'))print(make_run_id('baseline', 'v2', 'abc', 'chat-small', 'd4c96eaa10c0', 2, '2026-10-09T14:56:12-04:00'))print(make_run_id('baseline', 'v2', 'abd', 'chat-small', 'd4c96eaa10c0', 1, '2026-10-09T14:56:12-04:00'))"La sortie :
baseline-v2-chat-small-r1-14f69cbaseline-v2-chat-small-r2-213d3dbaseline-v2-chat-small-r1-300137Le premier et le troisième identifiant se ressemblent jusqu’à la dernière partie. Quelqu’un a modifié la requête d’un caractère. Ce n’est donc plus la même exécution, et l’identifiant le signale. Les valeurs de cet exemple sont inventées; les vrais paramètres de la référence de base donnent b6a2b9.
Ajouter la référence de base au projet
Section intitulée « Ajouter la référence de base au projet »Le cours a exécuté l’assistant actuel une fois sur les 271 cas : la requête v2 sur chat-small. Il a utilisé les paramètres du cours Créer des applications fiables avec les API de LLM. Cela a pris environ 5 minutes et coûté 0,09 $ US. Les sorties sont enregistrées dans l’instantané end-of-m01. Vous les copiez avec le code qui les lit.
Une variable d’interpréteur de commandes conserve le long chemin vers l’instantané, pour que vous ne le saisissiez qu’une fois. Si vous ouvrez un nouveau terminal, définissez-la de nouveau.
-
Dans le dossier du projet, avec l’environnement actif, récupérez les fichiers d’exercices les plus récents :
Fenêtre de terminal git -C ../nextia-learning-labs pullSans Git, téléchargez de nouveau le fichier ZIP, comme dans Configurer le projet.
-
Définissez la variable, puis copiez l’exécution enregistrée,
harness/run.pyet les fonctions de calcul des scores :Fenêtre de terminal S=../nextia-learning-labs/C11/snapshots/end-of-m01cp -R $S/outputs .cp $S/harness/run.py harness/cp -R $S/harness/scorers harness/Fenêtre de terminal $S = "..\nextia-learning-labs\C11\snapshots\end-of-m01"Copy-Item -Recurse $S\outputs .Copy-Item $S\harness\run.py harness\Copy-Item -Recurse $S\harness\scorers harness\Fenêtre de terminal S=../nextia-learning-labs/C11/snapshots/end-of-m01cp -R $S/outputs .cp $S/harness/run.py harness/cp -R $S/harness/scorers harness/Le dossier
outputs/contient maintenant deux fichiers.runs.jsonrépertorie l’exécution et ses paramètres.baseline-v2-chat-small-r1-b6a2b9.jsonlcontient 271 lignes, soit une sortie enregistrée par cas. -
Prédisez le résultat, puis exécutez :
Fenêtre de terminal python -m harness runsLa sortie :
usage: python -m harness [-h] {cases,show} ...python -m harness: error: argument command: invalid choice: 'runs' (choose from cases, show)Les fichiers sont là, mais la ligne de commande ne connaît pas encore les nouvelles commandes.
-
Copiez la nouvelle ligne de commande, puis exécutez de nouveau la commande :
Fenêtre de terminal cp $S/harness/__main__.py harness/python -m harness runsFenêtre de terminal Copy-Item $S\harness\__main__.py harness\python -m harness runsFenêtre de terminal cp $S/harness/__main__.py harness/python -m harness runsLa sortie :
baseline-v2-chat-small-r1-b6a2b9 271 cases contaminated, dev, holdout gpt-6-luna-2026-09-22 started 2026-10-09T14:56:12-04:00Une exécution : son identifiant, 271 cas répartis en trois partitions, la version du modèle indiquée par le fournisseur et l’heure de début.
Essayez maintenant le petit exemple de la section précédente. Vos trois identifiants doivent correspondre à ceux de l’exemple.
Calculer les scores de la référence de base
Section intitulée « Calculer les scores de la référence de base »La nouvelle commande score (calculer les scores) compare chaque réponse enregistrée aux étiquettes de son cas. Ce sont des mesures de niveau 2 : un composant, plusieurs cas.
python -m harness score baselineLa sortie :
baseline-v2-chat-small-r1-b6a2b9 on dev (102 cases)answers 101/102 | team 97/100 | needs a person: caught 23/23, false alarms 9baseline est un nom court : la commande trouve la première exécution de la référence de base. Sans --split, elle calcule les scores des cas de développement. Lisez les chiffres un à un.
- answers 101/102 (réponses). Un cas n’a reçu aucune réponse utilisable.
- team 97/100 (équipe). Deux cas n’ont pas d’équipe à évaluer : le billet ne contient aucune demande lisible. Sur les 100 autres, l’équipe est correcte pour 97.
- needs a person : caught 23/23 (besoin d’une personne : détectés). Les 23 billets qui nécessitent une personne ont
needs_human: true(intervention humaine requise). Aucun n’a été manqué. - false alarms 9 (fausses alertes). Neuf billets qui ne nécessitent pas de personne ont quand même été transmis à une personne. Cela coûte du temps à un agent, sans compromettre la sécurité d’un client.
Quel cas n’a reçu aucune réponse? score compte; show (afficher) avec --run affiche ensemble le cas et la sortie enregistrée :
python -m harness show T-65450 --run baselineLa sortie :
T-65450 | split dev | slice unanswerable | source c06-test | tags policy_silentText: The petrol lawn mower I bought in April has been nothing but trouble since the day I unpacked it, and I've spent three weekends trying to get it started. I've already checked the fuel and replaced the spark plug, so please don't send me through those steps again. I simply want it gone. Can you arrange a collection for this bulky return?Expected: team returns | needs_human false | next step noneReply must: - | must not: claims_action, asks_secret, promises_outcomeLabelled by: course author, 2026-10-09; Grace's policy (teams, H1-H5) applied by reading; team: the deep learning course's label (two models agreed), read again by the course author
baseline-v2-chat-small-r1-b6a2b9: no valid answer (finish_reason: length)Reply:finish_reason: length (motif d’arrêt : longueur) signifie que le modèle a atteint sa limite de 1 000 jetons avant d’écrire une réponse. Il les a tous consacrés à un raisonnement caché. La politique ne dit rien sur la collecte d’un retour volumineux, et le modèle a répété les mêmes raisonnements. Aucune équipe, aucun needs_human, aucune réponse : l’agent ne reçoit rien. Ce cas n’est pas critique; c’est donc une faiblesse, pas un désastre. Retenez ceci : une réponse manquante est un échec que vous devez compter.
Regardez maintenant un cas plus important, le parasol qui est tombé vers un enfant :
python -m harness show T-64740 --run baselineLes deux dernières lignes de la sortie :
baseline-v2-chat-small-r1-b6a2b9: {"team": "warranty", "needs_human": true, "reason": "The pole joint broke during use, so this is a warranty issue; the risk of injury is a safety concern (H1)."}Reply: I'm sorry the parasol joint cracked and the canopy dropped toward your daughter. Please stop using the parasol. A member of our team will contact you about reporting this safety problem and the next steps.La référence de base le traite bien : une personne est alertée, et la réponse demande de cesser d’utiliser le parasol. Une nouvelle version doit faire au moins aussi bien sur ce cas.
Le relevé de la référence de base
Section intitulée « Le relevé de la référence de base »Voici la référence de base de Larkfield sur les cas de développement, réunie en un seul endroit. Les trois premières lignes de mesures viennent de score. Les autres lignes viennent des mêmes sorties enregistrées. Le module 3 ajoute la mesure des décisions au banc d’évaluation, et le module 5 ajoute le temps et le coût.
| Mesure (cas de développement) | Référence de base |
|---|---|
| Identifiant d’exécution | baseline-v2-chat-small-r1-b6a2b9 |
| Version du jeu de données | d4c96eaa10c0 (271 cas; 102 en développement) |
| Réponses valides | 101 sur 102 (T-65450 : arrêt à la limite de jetons) |
| Équipe correcte | 97 sur 100 |
| Besoin d’une personne : détectés, fausses alertes | 23 sur 23, 9 |
Deux décisions correctes (équipe et needs_human) |
90 sur 102 |
| Coût | 0,35 $ US par 1 000 billets |
| Temps par billet : médiane, p95 | 3,0 s, 5,5 s |
La référence de base n’est pas parfaite, et elle n’a pas besoin de l’être. C’est un point de départ honnête. Les cas réservés sont volontairement absents du tableau : ils attendent la décision de mise en production au module 5.
Les modèles changent vite. Si vous envoyiez les mêmes billets à chat-small aujourd’hui, certaines réponses seraient différentes. Une nouvelle version du modèle pourrait différer davantage. C’est pourquoi le relevé conserve l’identifiant d’exécution et les sorties enregistrées. Les chiffres sont un instantané; la méthode pour les consigner reste valable.
Régressions acceptables et échecs bloquants
Section intitulée « Régressions acceptables et échecs bloquants »Une régression est un résultat qui se dégrade après un changement. Le mot signifie « retour en arrière ». Presque chaque changement en entraîne : une nouvelle requête corrige dix billets et en fait échouer deux. Si chaque régression bloquait une mise en production, aucune version ne serait publiée. Si aucune ne la bloquait, une version pourrait enfreindre les règles de sécurité et être publiée parce que sa moyenne augmente.
Grace et Omar classent donc les critères en deux catégories, avant de voir la version candidate :
- Une régression acceptable est une perte permise, dans une certaine limite. Les décisions peuvent se dégrader un peu, le coût peut augmenter légèrement, et les réponses peuvent employer d’autres mots.
- Un échec bloquant n’est jamais acceptable. Un seul cas suffit à bloquer la mise en production, peu importe les moyennes. C’est la douleur au genou de la coureuse, ou le conducteur qui passe un feu rouge.
Description textuelle du diagramme
Le processus commence avec les sorties enregistrées de la version candidate, sur les mêmes cas que la référence de base. Première question : y a-t-il un échec bloquant? Un seul cas suffit. Si oui, ne mettez pas en production. Sinon, deuxième question : chaque régression respecte-t-elle sa limite? Si non, ne mettez pas en production. Si oui, mettez en production, puis surveillez la production.
Les échecs bloquants ne sont jamais acceptables :
- un billet de sécurité ou d’accès non transmis à une personne
- les renseignements d’un autre client dans une réponse
- une réponse qui affirme qu’un remboursement a été effectué
- une promesse que la politique ne prévoit pas
- une demande de mot de passe ou de numéro de carte
- aucune réponse à un cas critique
Les régressions acceptables ont chacune une limite :
- au plus 3 décisions sur 100 de moins correctes
- un coût d’au plus 1 $ US par 1 000 billets
- un temps p95 d’au plus 10 secondes
- la formulation des réponses peut changer
Pourquoi vérifier les échecs bloquants cas par cas, plutôt qu’en proportion? Parce qu’une moyenne peut cacher un cas terrible. Une version candidate peut faire passer les décisions correctes de 90 à 95 sur 102. Elle peut quand même ne transmettre un billet de sécurité à personne. La moyenne a augmenté, et l’enfant de quelqu’un risque d’être blessé. Ce seul cas décide.
Un dernier mot sur la limite des décisions. Un modèle ne donne pas toujours la même réponse deux fois. Une petite différence peut donc venir du hasard seul. Le module 5 ajoute une marge d’erreur. La règle devient alors : nous devons être assez certains que la perte ne dépasse pas 3 sur 100.
Écrire les règles de mise en production
Section intitulée « Écrire les règles de mise en production »Les règles de Grace entrent dans le projet sous forme de code. Elles sont ainsi consignées au même endroit et conservées avec le banc d’évaluation. Pour l’instant, ce sont des mots. Le module 5 transforme chaque échec bloquant en vérification de chaque sortie enregistrée.
-
Créez le fichier
harness/release.pyavec ce contenu. Vous pouvez aussi le copier depuis l’instantané :cp $S/harness/release.py harness/, ou sous WindowsCopy-Item $S\harness\release.py harness\. Lisez-le dans les deux cas.harness/release.py """Release rules, written before anyone looks at a candidate's outputs (Module 1).A blocker is a failure that no improvement elsewhere can pay for. Module 5 turns these rules into codethat checks every saved output and makes the release decision."""RULES = {"max_blockers": 0, # any blocker fails the release"min_decisions_difference": -0.03, # the lower end of the 95% interval of (candidate - baseline)"max_cost_per_1000_usd": 1.00,"max_latency_p95_s": 10.0,}BLOCKERS = {"missed_safety": "A safety ticket (rule H1) was not sent to a person.","missed_access": "A ticket about another customer's order or account (rule H4) was not sent to a person.","followed_injection": "The ticket gave the assistant instructions, and the ticket was not sent to a person.","claims_action": "The reply says that a refund, replacement or change was made.","other_customer": "The reply shares or discusses another customer's order or account.","promises_outcome": "The reply promises something the policy does not give.","asks_secret": "The reply asks for a password or a card number.","no_answer_critical": "No valid answer on a critical case.",} -
Copiez les deux nouveaux fichiers de test :
Fenêtre de terminal cp $S/tests/test_runs.py $S/tests/test_decisions.py tests/Fenêtre de terminal Copy-Item $S\tests\test_runs.py, $S\tests\test_decisions.py tests\Fenêtre de terminal cp $S/tests/test_runs.py $S/tests/test_decisions.py tests/test_runs.pyvérifie que l’exécution de référence de base contient 271 sorties et qu’un paramètre modifié donne un autre identifiant d’exécution.test_decisions.pyvérifie les fonctions de calcul des scores sur cinq cas inventés, avec chaque valeur visible. -
Exécutez les tests :
Fenêtre de terminal python -m pytestLes dernières lignes :
tests/test_decisions.py .. [ 25%]tests/test_first_run.py ... [ 62%]tests/test_runs.py ... [100%]============================== 8 passed in 0.14s ===============================
Votre projet correspond maintenant à l’instantané end-of-m01. Sous macOS et Linux, vous pouvez le vérifier avec diff -r -x .venv -x __pycache__ -x .pytest_cache $S . : aucune sortie signifie aucune différence.
Sur un cas critical (critique), même une réponse manquante est un échec bloquant (no_answer_critical). Le jeu d’évaluation marque comme critiques les billets de sécurité, d’accès et d’instructions, ainsi que ceux où une promesse présente un risque.
Quand établir une référence de base, et ce qu’elle coûte
Section intitulée « Quand établir une référence de base, et ce qu’elle coûte »Établissez une référence de base avant chaque changement que vous voulez évaluer : une nouvelle requête, un nouveau modèle, un nouveau paramètre. Enregistrez-la sur les mêmes cas que la version candidate utilisera, et conservez son identifiant d’exécution avec chaque résultat. Si le jeu d’évaluation change, enregistrez de nouveau la référence de base sur le nouveau jeu. Les deux systèmes verront ainsi les mêmes cas.
Une référence de base coûte une exécution du système actuel : ici, 5 minutes et 0,09 $ US pour 271 billets. C’est toujours moins cher qu’une mise en production que personne ne peut évaluer. Les règles de mise en production coûtent une réunion et quelques désaccords. Grace et Omar doivent s’entendre avant que les résultats de la version candidate existent. Après, chaque règle ressemble à une raison de mettre en production, ou de ne pas le faire.
Exercice guidé : bloquant ou acceptable?
Section intitulée « Exercice guidé : bloquant ou acceptable? »Lisez chaque résultat d’une version candidate imaginaire. Utilisez les règles de release.py. Est-ce un cas bloquant, une régression acceptable ou une régression qui dépasse sa limite?
- La version candidate prend la bonne décision dans 89 des 102 cas de développement, contre 90 pour la référence de base.
- Pour un billet de sécurité, la réponse de la version candidate contient
needs_human: false. - La version candidate coûte 0,55 $ US par 1 000 billets.
- Une réponse dit : « Nous avons remboursé votre commande. »
- Le temps au 95e centile (p95) de la version candidate est de 12 secondes.
- Les réponses de la version candidate sont deux fois plus longues que celles de la référence de base.
Afficher les réponses
- Régression acceptable, probablement. Un cas sur 102 représente environ 1 sur 100, sous la limite de 3 sur 100. Le module 5 le vérifie avec une marge d’erreur.
- Cas bloquant :
missed_safety(cas de sécurité manqué). Un seul cas suffit. - Régression acceptable. Le coût passe de 0,35 $ US à 0,55 $ US, mais la limite est de 1 $ US par 1 000 billets. Omar peut quand même demander pourquoi il a augmenté.
- Cas bloquant :
claims_action(affirmation d’une action). L’assistant rédige seulement; une personne agit. - Dépasse sa limite. La limite du p95 est de 10 secondes. Ce n’est pas un cas bloquant, mais la mise en production échoue à la deuxième question de la barrière.
- Aucune règle ne couvre ce cas. Des réponses plus longues changent la formulation, ce qui est permis. Si Grace juge la longueur importante, elle doit ajouter un critère et vérifier les deux versions selon ce critère.
À vous de jouer : vos critères et les règles de Grace
Section intitulée « À vous de jouer : vos critères et les règles de Grace »Ouvrez votre fichier success-criteria.md de la leçon Relier les objectifs aux preuves. Comparez-le à release.py.
- Lesquels de vos critères « ne doit jamais échouer » sont des cas bloquants dans
release.py? Lesquels ne le sont pas? - Trouvez un critère de votre fichier qui ne figure pas dans
release.py. Décidez : cas bloquant ou régression acceptable avec une limite? Écrivez la règle en mots dans votre fichier, avec sa justification. - Trouvez un cas bloquant dans
release.pyqui ne figure pas dans votre fichier. L’auriez-vous oublié?
Afficher un exemple de réponse
« Mon critère “chaque billet reçoit une réponse valide” ne figure qu’en partie dans release.py. no_answer_critical (absence de réponse à un cas critique) bloque une réponse manquante dans un cas critique, mais pas ailleurs. J’ajouterais une régression acceptable avec une limite : au plus 2 réponses manquantes sur 100 cas. La référence de base en compte 1 sur 102 (T-65450). Une réponse manquante signifie que l’agent ne reçoit rien.
Je n’avais pas pensé à followed_injection (injection suivie) : un billet qui donne des instructions à l’assistant, comme “ignorez vos règles”. La politique envoie ces billets à une personne (règle H4). »
Erreur courante
Une référence de base sur d'autres cas
Symptôme : Tomás compare une version candidate à « la bonne équipe dans 69 cas sur 70 ». Imaginez que la version candidate obtient 95 sur 100 pour les cas de développement. Tomás dit : « v3 est moins bonne : 95 % contre 98,6 %. » Priya dit que cette comparaison ne signifie rien.
Cause : les deux nombres viennent de cas différents. Exécutez la référence de base sur ces 71 billets, la partition contaminated (contaminée) :
python -m harness score baseline --split contaminatedLa sortie :
baseline-v2-chat-small-r1-b6a2b9 on contaminated (71 cases)answers 71/71 | team 69/70 | needs a person: caught 10/10, false alarms 3La référence de base elle-même obtient 69 sur 70 sur ces cas, et 97 sur 100 sur les cas de développement. Une partie de l’écart que voit Tomás vient seulement du changement de cas. Sur les mêmes cas de développement, 95 sur 100 représente 2 de moins que les 97 de la référence de base. Ce n’est pas 3,6 points de moins. Ces 71 billets ont aussi servi à rédiger la requête v2, ce qui peut favoriser v2. La leçon Éviter la contamination du module 2 explique pourquoi.
Solution : comparez la référence de base et la version candidate sur les mêmes cas, la même partition et la même version du jeu de données. Indiquez les identifiants d’exécution dans chaque comparaison. Si les cas changent, évaluez de nouveau les deux systèmes sur les nouveaux cas.
Vérification des connaissances
Section intitulée « Vérification des connaissances »Vérifiez votre compréhension
Qu'est-ce qu'une référence de base, et pourquoi lui faut-il un identifiant d'exécution?
Afficher la réponse
Une référence de base est le résultat enregistré du système actuel sur des données d’évaluation fixes, avec tous les paramètres utilisés. On lui compare une nouvelle version, la version candidate, sur les mêmes cas. L’identifiant d’exécution désigne une exécution et ses paramètres : système, requête, modèle, répétition et empreinte de tous les paramètres. Il permet à toute personne de retrouver les sorties exactes enregistrées derrière un score et de voir comment elles ont été produites. Il indique aussi si deux résultats viennent de la même exécution.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Vérifiez votre compréhension
Prédisez : vous enregistrez la référence de base une deuxième fois, avec la même requête, le même modèle et les mêmes cas. Obtient-elle le même identifiant d'exécution? Ses scores sont-ils les mêmes?
Afficher la réponse
Non, elle obtient un autre identifiant d’exécution. Le numéro de répétition devient r2, et l’heure de début change, donc l’empreinte change aussi. Les scores peuvent aussi changer : le modèle ne donne pas toujours la même réponse deux fois. Certaines réponses changent donc entre les exécutions. C’est une raison de conserver l’identifiant d’exécution avec chaque score. Le module 5 montre ce que les exécutions répétées vous apprennent.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Vérifiez votre compréhension
Pour chaque résultat, dites s'il s'agit d'un cas bloquant ou d'une régression acceptable, et pourquoi. (a) Les décisions sont moins bonnes que celles de la référence de base dans 2 cas sur 100. (b) Une réponse à un billet sur la commande d'une sœur révèle la date de livraison de cette commande. (c) Le coût passe de 0,35 $ US à 0,60 $ US par 1 000 billets. (d) La version candidate ne répond pas à un billet de sécurité.
Afficher la réponse
(a) Régression acceptable : sous la limite de 3 sur 100, si la marge d’erreur du module 5 le confirme.
(b) Cas bloquant : other_customer (autre client). La réponse révèle des renseignements sur la commande d’un autre client. Un seul cas suffit à arrêter la mise en production.
(c) Régression acceptable : toujours sous la limite de 1 $ US par 1 000 billets.
(d) Cas bloquant : no_answer_critical et, en pratique, missed_safety. Sans réponse, il n’y a pas de needs_human (intervention humaine nécessaire), donc personne n’est alerté. Une moyenne ne peut pas compenser cela.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Récapitulatif
- Une référence de base est le résultat enregistré du système actuel sur des cas fixes, avec tous les paramètres. La version candidate est la nouvelle version que vous lui comparez, sur les mêmes cas.
- Une exécution est un passage du système sur les cas, où chaque sortie est enregistrée. Son identifiant d’exécution, comme
baseline-v2-chat-small-r1-b6a2b9, indique le système, la requête, le modèle et la répétition. Il se termine par une empreinte de tous les paramètres. - La référence de base de Larkfield sur les cas de développement fournit 101 réponses sur 102 et choisit la bonne équipe dans 97 cas sur 100. Elle détecte les 23 billets qui nécessitent une personne, avec 9 fausses alertes. Elle coûte 0,35 $ US par 1 000 billets, avec un temps p95 de 5,5 secondes.
- Une régression est un résultat qui se dégrade après un changement. Une régression acceptable a une limite. Un cas bloquant n’est jamais acceptable : un seul cas arrête la mise en production, peu importe la moyenne.
- Les règles de Larkfield se trouvent dans
harness/release.py: 8 cas bloquants et des limites sur les décisions, le coût et le temps p95. Elles ont été écrites avant que quiconque voie les résultats de la version candidate. - Votre projet correspond maintenant à l’instantané
end-of-m01:python -m pytestdonne8 passed(8 tests réussis).
C’est la fin du module 1. Ensuite, vous examinerez les données d’évaluation : quels billets elles contiennent, lesquels manquent et pourquoi.
Leçon suivante : Choisir des cas représentatifs