# Apprivoiser la bete : evaluer, diagnostiquer, iterer

N'importe qui peut lancer un script d'entrainement. La difference entre un dragon dresse et un dragon chanceux, c'est l'**evaluation** — mesurer, diagnostiquer et iterer comme un ingenieur. C'est la lecon qui transforme ta v1 mediocre en une v3 en laquelle tu as vraiment confiance, et c'est la discipline que la plupart des amateurs sautent.

## Les trois niveaux d'evaluation

**Niveau 1 — Les courbes de loss (gratuit, automatique).** Tu les as deja grace a l'entrainement. Elles te parlent du *processus* : le modele a-t-il appris, a-t-il surappris ? Elles ne disent rien sur la qualite reelle des reponses.

**Niveau 2 — Ton jeu de test (le vrai examen).** Tu te souviens de `test.jsonl` — la tranche que le modele n'a jamais vue ? Passe chaque prompt de test dans le modele entraine et note les sorties par rapport a ta fiche d'objectif de la lecon 2. C'est ta verite terrain.

**Niveau 3 — Le modele-juge (le niveau 2 a l'echelle).** Fais noter chaque reponse par un modele puissant (Claude, ou ton plus gros modele local) selon une grille. Parfait pour re-noter 30+ reponses a chaque iteration sans y perdre une soiree.

<div class="concept-box">
<h4>Concept</h4>
Note par rapport a ta <strong>fiche d'objectif</strong>, pas au feeling. La fiche d'Ember dit : structure (reponse → explication → prochaine etape), voix, zero fait invente. La grille, c'est donc trois questions oui/non par reponse. Le score = des comptes, pas des impressions. "Ca a l'air mieux" n'est pas une mesure.
</div>

## Lire les courbes : trois formes classiques

<svg viewBox="0 0 720 280" width="100%" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Trois formes de courbes de loss : saine, surapprentissage, sous-entraine">
    <!-- panel 1: healthy -->
  <path d="M30 230 L30 60 M30 230 L220 230" stroke="#3a4356" stroke-width="1" fill="none"/>
  <path d="M35 80 C 70 140, 110 180, 215 195" stroke="#4fffb0" stroke-width="2" fill="none"/>
  <path d="M35 75 C 70 130, 110 170, 215 180" stroke="#7b8cff" stroke-width="2" fill="none" stroke-dasharray="5 4"/>
  <text x="125" y="256" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="13px">Saine</text>
  <text x="125" y="272" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="11px">les deux baissent, petit ecart</text>
  <!-- panel 2: overfitting -->
  <path d="M280 230 L280 60 M280 230 L470 230" stroke="#3a4356" stroke-width="1" fill="none"/>
  <path d="M285 80 C 320 140, 360 190, 465 205" stroke="#4fffb0" stroke-width="2" fill="none"/>
  <path d="M285 75 C 330 130, 380 150, 400 145 C 430 140, 450 110, 465 90" stroke="#7b8cff" stroke-width="2" fill="none" stroke-dasharray="5 4"/>
  <text x="375" y="256" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="13px">Surapprentissage</text>
  <text x="375" y="272" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="11px">la val loss remonte</text>
  <!-- panel 3: undertrained -->
  <path d="M530 230 L530 60 M530 230 L720 230" stroke="#3a4356" stroke-width="1" fill="none"/>
  <path d="M535 80 C 570 100, 620 115, 715 125" stroke="#4fffb0" stroke-width="2" fill="none"/>
  <path d="M535 75 C 570 95, 620 108, 715 115" stroke="#7b8cff" stroke-width="2" fill="none" stroke-dasharray="5 4"/>
  <text x="625" y="256" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="13px">Sous-entraine</text>
  <text x="625" y="272" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="11px">baisse encore a la fin</text>
  <text x="60" y="52" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="11px">— train &nbsp; ---- validation</text>
</svg>

**Saine :** les deux courbes descendent, la validation legerement au-dessus du train, les deux s'aplatissent. Envoie au jeu de test.

**Surapprentissage :** la val loss touche le fond puis grimpe pendant que la train continue de baisser. Le dragon memorise. Corrections, par ordre de puissance : **plus/de meilleures donnees**, moins d'epochs (arrete-toi la ou la val loss etait au plus bas), rank plus bas, LoRA dropout plus eleve.

**Sous-entraine :** les deux baissent encore quand l'entrainement s'arrete. La correction la plus facile du manuel : entraine plus longtemps, ou monte le learning rate d'un cran.

## Le tableau de diagnostic

Les chiffres pointent vers le probleme ; lire les vraies sorties l'identifie. Apres chaque run, lis 10 sorties de test et associe les symptomes :

| Symptome dans les sorties | Cause probable | Correction |
|---|---|---|
| Ignore parfois ton format | Exemples incoherents, ou trop peu | Nettoie les donnees ; ajoute des exemples axes format |
| Recite mot pour mot les reponses d'entrainement | Surapprentissage | Moins d'epochs ; plus de variete de donnees |
| Format superbe, fond faible | Rank trop bas, ou base trop petite | r=16→32 ; envisage une base 8B |
| Invente des faits avec assurance | Pas d'exemples de refus dans les donnees | Ajoute 20–30 demonstrations de refus explicites |
| Pire que la base en discussion generale | Surentraine / oubli catastrophique | Moins d'etapes ; melange 10–20% d'exemples de chat general |
| Change de langue au hasard | Donnees multilingues sans pattern | Rends l'appariement de langue explicite par exemple |

<div class="honest-note">
<h4>Note honnete</h4>
L'oubli catastrophique est reel : martele un modele avec 2 000 tickets de support et il peut devenir <em>pire</em> partout ailleurs. La base gelee de LoRA limite les degats (supprime les adaptateurs et la base est intacte), mais les adaptateurs peuvent quand meme dominer le comportement. Le vaccin standard : garde une petite part de donnees de conversation generale dans le melange.
</div>

## La boucle d'iteration

Ton workflow a partir d'ici est une boucle, et chaque passe prend une soiree, pas une semaine :

1. **Evalue** v_N sur le jeu de test → des scores sur la grille de ta fiche d'objectif
2. **Lis** les 10 pires sorties → choisis *le* plus gros probleme
3. **Corrige les donnees d'abord** (c'est la cause ~80% du temps), les hyperparametres ensuite
4. **Re-entraine** → v_N+1, **re-evalue sur le meme jeu de test** → compare les chiffres
5. Arrete-toi quand tu atteins le test de succes de ta fiche d'objectif — celui d'Ember etait ≥25/30 structures, 0 fait invente

<div class="pro-tip">
<h4>Astuce Pro</h4>
Change <strong>une seule chose par iteration</strong>. Si tu ajoutes des donnees, baisses le learning rate et montes le rank en meme temps, le score bouge et tu n'apprends rien sur le pourquoi. Lentement c'est fluide, fluide c'est rapide — cette boucle converge en 3-4 passes disciplinees.
</div>

<div class="try-it">
<h4>Essaie</h4>
Passe ton jeu de test complet dans la v1 et note-la avec ta grille — le chiffre de reference honnete. Puis fais exactement une iteration de la boucle (probablement : ajouter des exemples de refus et re-nettoyer le formatage) et affiche le score de la v2 a cote de celui de la v1. Cette seule comparaison t'apprendra plus sur le fine-tuning que n'importe quel article de blog.
</div>

<div class="checkpoint">
<h4>Checkpoint</h4>
Tu sais lire les trois formes de courbes de loss, diagnostiquer les six symptomes classiques dans les sorties, et tu fais tourner une boucle d'iteration a un-changement-par-passe avec de vrais scores. Ton dragon est apprivoise. Prochaine etape : l'entrainement avance — preference tuning, modeles plus gros, et retrecir Ember pour le deploiement.
</div>
