Applied AI · IntermĂ©diaire 🟡 · Session 3
📝 Guide du professeur
← Retour au programme 📄 Source .md

Guide enseignant — Session 3 (Niveau intermĂ©diaire)

Sortie structurée, température & évaluations

Programme : Applied AI — Yann Isola DurĂ©e : 2 h 00 PrĂ©requis : Sessions 1–2 (anatomie d’un prompt, contexte, rĂŽles system/user, notions d’API — Application Programming Interface, interface de programmation applicative) Module source : Module 2, partie 2


1. Objectifs pédagogiques

À la fin de la session, chaque participant doit ĂȘtre capable de :

  1. Expliquer pourquoi une sortie JSON (JavaScript Object Notation, format d’échange de donnĂ©es structurĂ©es) « gĂ©nĂ©ralement valide » est inacceptable en production, et citer le mĂ©canisme qui garantit la validitĂ© syntaxique (function calling / sortie structurĂ©e contrainte par schĂ©ma).
  2. Distinguer erreur syntaxique (JSON malformé) et erreur sémantique (JSON valide mais contenu faux), et associer à chacune la bonne parade.
  3. Démystifier la température : température 0 = déterministe, PAS = correct. Elle contrÎle la variabilité, pas la véracité.
  4. DĂ©crire la pile d’évaluation Ă  4 Ă©tages : assertions → golden set → juge LLM (Large Language Model, grand modĂšle de langage) → Ă©valuation humaine.
  5. Construire un prompt d’extraction robuste qui survit aux cas limites (montants en lettres, tentatives d’injection, chaünes vides) — c’est le labo de la session.

ThĂšse centrale de la session (Ă  marteler) : « La suite d’évaluation EST la spĂ©cification. » Un produit IA sans Ă©vals, c’est un produit dont personne ne connaĂźt le comportement rĂ©el. « Ça avait l’air bien dans la dĂ©mo » est la cause de mortalitĂ© n°1 des produits IA.


2. Matériel


3. Déroulé minuté (120 min)

Bloc A — Accroche : le JSON qui casse tout (0:00 → 0:15, 15 min)

Ouverture choc (5 min). Racontez l’histoire type : une Ă©quipe dĂ©ploie un extracteur de factures. En dĂ©mo, le modĂšle renvoie du JSON parfait 50 fois de suite. En production, Ă  la 3 412ᔉ facture, il renvoie :

Voici le JSON demandé :
```json
{"montant": 1250, "devise": "EUR"

Virgule manquante, prĂ©ambule verbeux, bloc de code non fermĂ©. Le parseur crashe, le pipeline s’arrĂȘte Ă  2 h du matin. Question Ă  la salle : « Qui a dĂ©jĂ  vu un LLM ajouter du texte avant le JSON alors qu’on lui a dit “rĂ©ponds UNIQUEMENT en JSON” ? » (Les mains se lĂšvent — c’est universel.)

Message clĂ© (10 min). « GĂ©nĂ©ralement valide » × volume = Ă©chec certain. Si le modĂšle produit du JSON valide 99 % du temps et que vous traitez 10 000 documents/jour, vous avez ~100 crashs par jour ⚠ (chiffre illustratif — le taux rĂ©el varie selon modĂšle et prompt). La solution n’est pas un meilleur prompt, c’est une contrainte structurelle.

Note enseignant : résistez à la tentation de montrer la solution tout de suite. Laissez les participants proposer leurs rustines habituelles (regex, retry aveugle, « je lui redemande gentiment »). Vous les démonterez au bloc B.


Bloc B — Sortie structurĂ©e : function calling & schĂ©mas (0:15 → 0:45, 30 min)

B1. Les rustines et pourquoi elles fuient (5 min).

B2. La vraie solution : tool_use / function calling (15 min).

Expliquez le mĂ©canisme : au lieu de demander du texte « qui ressemble Ă  du JSON », on dĂ©clare un outil (tool) avec un schĂ©ma JSON (JSON Schema : standard de description de la structure attendue — types, champs obligatoires, Ă©numĂ©rations). Le fournisseur du modĂšle contraint le dĂ©codage : les tokens gĂ©nĂ©rĂ©s ne peuvent former qu’un document conforme au schĂ©ma. L’erreur syntaxique devient structurellement impossible.

Exemple Ă  projeter (extraction de note de frais) :

{
  "name": "extraire_note_de_frais",
  "description": "Extrait les champs d'une note de frais",
  "input_schema": {
    "type": "object",
    "properties": {
      "montant": { "type": "number", "description": "Montant TTC en valeur numérique" },
      "devise":  { "type": "string", "enum": ["EUR", "USD", "GBP", "CHF"] },
      "date":    { "type": "string", "description": "Format ISO 8601 : AAAA-MM-JJ" },
      "categorie": { "type": "string", "enum": ["transport", "repas", "hebergement", "autre"] }
    },
    "required": ["montant", "devise", "date", "categorie"]
  }
}

Points d’insistance :

B3. La limite fondamentale (10 min) — transition vers le bloc C.

Écrivez au tableau, en grand :

Le schéma garantit la FORME, jamais le FOND.

Exemple concret : le reçu dit « quarante-deux euros ». Le modĂšle renvoie {"montant": 402, "devise": "EUR", ...} — JSON parfaitement valide, contenu faux. C’est une erreur sĂ©mantique. Le validateur de schĂ©ma ne la verra jamais.

DĂ©mo interactive : ouvrez webpage/index.html, onglet « Validateur de schĂ©ma ». Faites valider un JSON syntaxiquement correct mais sĂ©mantiquement faux — le validateur dit . Effet garanti.


Bloc C — Erreurs sĂ©mantiques : valider, rĂ©essayer, corriger (0:45 → 1:05, 20 min)

C1. Taxonomie (5 min). Tableau Ă  deux colonnes :

Erreur syntaxique Erreur sémantique
Exemple Virgule manquante, champ absent Montant faux, date hallucinée, catégorie plausible mais erronée
Détection Parseur / validateur de schéma RÚgles métier, recoupement, juge LLM, humain
Parade Function calling (élimination structurelle) Validation + retry avec feedback + garde-fous métier

C2. Le pattern « validate → retry with feedback » (10 min).

Pseudo-code Ă  projeter :

resultat = appel_llm(document, schema)
erreurs = valider_metier(resultat)   # ex : montant > 0, date <= aujourd'hui,
                                     #      devise cohérente avec le pays
si erreurs:
    resultat = appel_llm(document, schema,
                         feedback="Ta réponse précédente contenait : " + erreurs
                                 + ". Corrige et renvoie.")
    si toujours en erreur aprĂšs N tentatives:
        escalader_vers_humain(document)

Points clés :

C3. Mini-exercice Ă©clair (5 min). À l’oral : « Pour un extracteur de notes de frais, citez 3 rĂšgles de validation mĂ©tier. » Attendus : montant > 0 ; date pas dans le futur ; date pas antĂ©rieure Ă  N annĂ©es ; devise ∈ liste autorisĂ©e ; TVA ≀ montant TTC ; etc.


PAUSE (1:05 → 1:15, 10 min)


Bloc D — TempĂ©rature : dĂ©terminisme ≠ exactitude (1:15 → 1:30, 15 min)

D1. Ce que fait vraiment la température (7 min).

Le modÚle produit une distribution de probabilité sur le prochain token. La température remodÚle cette distribution :

Le piĂšge Ă  dĂ©truire (Ă  dire mot pour mot) : « TempĂ©rature 0 ne rend pas le modĂšle plus intelligent ni plus factuel. Si le token le plus probable est faux, T = 0 vous donne la mĂȘme erreur, Ă  chaque fois, avec une rĂ©gularitĂ© parfaite. Vous obtenez un mensonge reproductible, pas une vĂ©ritĂ©. »

La tempĂ©rature contrĂŽle la variabilitĂ©, pas l’exactitude.

Note enseignant : prĂ©cisez aussi que mĂȘme Ă  T = 0, le dĂ©terminisme absolu n’est pas garanti chez tous les fournisseurs (parallĂ©lisme GPU — Graphics Processing Unit, processeur graphique —, mises Ă  jour de modĂšles). « Quasi-dĂ©terministe » est le terme honnĂȘte.

D2. Réglages pratiques (3 min).

Cas d’usage TempĂ©rature conseillĂ©e ⚠ (repĂšres usuels, Ă  ajuster)
Extraction, classification, sortie structurĂ©e 0 – 0.2
RĂ©daction assistĂ©e, reformulation 0.5 – 0.8
Brainstorming, crĂ©ativitĂ© 0.9 – 1.2

D3. DĂ©mo (5 min). Ouvrez l’onglet « Comparateur de tempĂ©rature » de la page interactive : mĂȘme prompt simulĂ© Ă  T = 0 (3 sorties identiques, dont une erreur reproduite 3 fois) vs T = 1 (3 sorties diffĂ©rentes). Faites verbaliser : « Que remarquez-vous sur l’erreur Ă  T = 0 ? »


Bloc E — Les Ă©valuations : la suite d’évals EST la spec (1:30 → 1:50, 20 min)

E1. La thĂšse (5 min).

En logiciel classique, la spec dit ce que le code doit faire, et les tests le vĂ©rifient. Avec les LLM, le comportement est non dĂ©terministe et non spĂ©cifiable par le code : la seule dĂ©finition opĂ©rationnelle de « ça marche » est la suite d’évaluation. D’oĂč la thĂšse :

« La suite d’évals EST la spec. » Si un comportement n’est pas couvert par une Ă©val, vous ne savez pas s’il fonctionne. « Ça avait l’air bien dans la dĂ©mo » = vous avez testĂ© 5 cas choisis par la personne qui voulait que ça marche.

E2. La pile d’évaluation Ă  4 Ă©tages (10 min).

  1. Assertions (code, gratuit, instantanĂ©) : le JSON parse-t-il ? Les champs requis sont-ils lĂ  ? Le montant est-il > 0 ? → attrape le grossier, tourne Ă  chaque commit.
  2. Golden set (50 Ă  500 exemples ⚠ ordre de grandeur usuel) : paires entrĂ©e → sortie attendue, validĂ©es par un humain. Inclut dĂ©libĂ©rĂ©ment les cas limites et les cas adverses. On mesure un taux de rĂ©ussite ; toute modification de prompt ou de modĂšle repasse le golden set.
  3. Juge LLM (LLM-as-judge) : un second modĂšle note les sorties selon une grille (fidĂ©litĂ©, complĂ©tude, ton). Scalable, mais le juge a ses propres biais → il faut calibrer le juge contre des jugements humains avant de lui faire confiance.
  4. Évaluation humaine : Ă©chantillonnage rĂ©gulier en production, revue des cas escaladĂ©s. CoĂ»teux, lent, mais c’est la vĂ©ritĂ© terrain qui recalibre tout le reste.

E3. Métriques selon le type de systÚme (5 min).

DĂ©mo : onglet « Dashboard d’évals » de la page interactive. Lancez le prompt v1 (naĂŻf) contre le jeu de test : les cas limites Ă©chouent. Passez au prompt v3 (durci) : le taux monte. Le message : on ne compare pas des impressions, on compare des taux de rĂ©ussite sur le mĂȘme jeu de test.


Bloc F — Labo : l’extracteur de notes de frais indestructible (1:50 → 2:00, 10 min en sĂ©ance + suite en exercices)

Lancez l’exercice 3 (labo). En sĂ©ance : prĂ©sentation du jeu de test piĂ©gĂ© (montants en lettres, injection, chaĂźne vide) et premier tour d’itĂ©ration. La suite se fait en autonomie ou en dĂ©but de session suivante.

ClĂŽture (2 min). Les 3 phrases Ă  retenir :

  1. Le schéma garantit la forme, jamais le fond.
  2. Température 0 = reproductible, pas correct.
  3. Pas d’éval = pas de spec = pas de produit.

Distribuez le quiz (ou lien) + exit tickets.


4. Notes pédagogiques & piÚges fréquents


5. Exit tickets (5 questions, 5 min en fin de séance)

Chaque participant répond par écrit (papier ou formulaire) :

  1. Expliquez en une phrase pourquoi « le modĂšle renvoie du JSON valide 99 % du temps » est un problĂšme en production. Attendu : Ă  volume Ă©levĂ©, 1 % d’échec = pannes quotidiennes ; seule la contrainte par schĂ©ma (function calling) Ă©limine la classe d’erreur.

  2. Le modÚle renvoie {"montant": 402} pour un reçu de « quarante-deux euros ». Syntaxique ou sémantique ? Quelle parade ? Attendu : sémantique ; validation métier / recoupement + retry avec feedback spécifique, escalade humaine si échec répété.

  3. Vrai ou faux : « À tempĂ©rature 0, le modĂšle ne fait plus d’erreurs factuelles. » Justifiez. Attendu : Faux. T = 0 rend l’erreur reproductible, pas absente. La tempĂ©rature contrĂŽle la variabilitĂ©, pas l’exactitude.

  4. Citez les 4 Ă©tages de la pile d’évaluation, dans l’ordre coĂ»t croissant. Attendu : assertions → golden set → juge LLM → Ă©valuation humaine.

  5. Votre assistant RAG répond avec fluidité mais invente des références. Quelle métrique surveiller, et par quel étage de la pile la mesurer en continu ? Attendu : la fidélité (faithfulness) ; juge LLM calibré (avec échantillonnage humain périodique).


6. Liens avec le reste du programme