Noter ce que les règles n’atteignent pas
Un modèle juge est un second appel qui note la sortie du premier d’après une grille. C’est utile, car une règle sait vérifier une étiquette, mais pas si une phrase est polie ou utile.
La phrase que le trieur envoie au client en est le cas type : aucune règle ne dit si elle est aimable.
À la fin de cette leçon
Remarque
Je peux demander à un modèle de noter une réponse et garder cette notation vérifiable.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Juge | un appel de modèle qui note une autre réponse | |
| Grille | l’échelle fixe et le sens de chaque note | |
| Format de sortie | la forme exacte où le juge doit répondre | note et raison |
| Valider | contrôler une réponse sur le format, par du code | |
| Note enregistrée | une note gardée avec sa réponse et sa raison |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une grille aux niveaux nommés pour le juge
Ne demandez pas à un juge « est-ce bien ? ». Donnez une grille : une courte échelle où chaque note dit ce qu’elle signifie. Trois niveaux suffisent pour commencer.
Dites ce qu’il faut regarder et ce qu’il faut ignorer. Une échelle floue donne des notes floues.
Exemple travaillé : une grille à trois niveaux
| Note | Sens |
|---|---|
| 3 | Claire, polie, sans promesse d’argent |
| 2 | Acceptable, mais vague ou froide |
| 1 | Inutile, impolie ou promet de l’argent |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Fixer le format et valider chaque note
Dites au juge de répondre sous une seule forme, ici du JSON avec une note et une courte raison. Puis validez par du code : le JSON se lit, la note est un entier de 1 à 3 et la raison est là.
Une note qui échoue au contrôle n’est pas notée. Comptez-la. Ne devinez jamais ce que le juge voulait dire.
Garder la note près de ce qu’elle note
Rangez chaque note enregistrée avec la réponse, la raison et la grille utilisée. Un nombre seul ne se discute plus ensuite.
Si le service accepte une température (le réglage qui rend les réponses plus ou moins variées), choisissez-la basse pour que le juge varie moins. Il varie quand même, et c’est pourquoi la leçon suivante le teste contre des personnes.
Écrire l’aide du modèle, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' 'async function demander(messages, echantillon, max) {' ' try {' ' const res = await fetch(base + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 200 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"statut \" + res.status);' ' return (await res.json()).choices[0].message.content;' > model.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire l’aide du modèle, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' } catch (erreur) {' ' console.log(\"Échantillon enregistré : aucun modèle n’a répondu (\" + erreur.message + \").\");' ' const liste = [].concat(echantillon);' ' const tour = messages.filter(function (m) { return m.role === \"assistant\"; }).length;' ' return liste[Math.min(tour, liste.length - 1)];' ' }' '}' 'module.exports = { demander };' >> model.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le script du juge, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const grille = \"Notez de 1 à 3 la réponse qu’une boutique a envoyée à un client. 3 : claire, polie, sans promesse d’argent. 2 : acceptable mais vague ou froide. 1 : inutile, impolie ou promet de l’argent. Répondez uniquement par du JSON à deux clés : note (1, 2 ou 3) et raison (moins de 15 mots).\";' > juge4.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le script du juge, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function valider(texte) {' ' let donnees = null;' ' try { donnees = JSON.parse(texte); } catch (erreur) { return { ok: false, pourquoi: \"pas du JSON\" }; }' ' if (donnees === null || Array.isArray(donnees) || typeof donnees === \"string\" || typeof donnees === \"number\") return { ok: false, pourquoi: \"pas un objet\" };' ' if (Number.isInteger(donnees.note) === false || donnees.note < 1 || donnees.note > 3) return { ok: false, pourquoi: \"mauvaise note\" };' ' const raison = typeof donnees.raison === \"string\" ? donnees.raison.trim() : \"\";' ' if (raison.length === 0 || raison.length > 100) return { ok: false, pourquoi: \"mauvaise raison\" };' ' return { ok: true, note: donnees.note, raison: raison };' '}' >> juge4.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le script du juge, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function juge(note, raison) {' ' return JSON.stringify({ note: note, raison: raison });' '}' 'const enregistrees = [' ' juge(2, \"Polie mais vague.\"),' ' juge(1, \"Promet de l’argent.\"),' ' \"Je donnerais un 3 à cette réponse\",' ' juge(5, \"Impolie.\"),' ' juge(3, \"Claire et polie, sans promesse.\"),' '];' 'let total = 0;' 'let valides = 0;' 'enregistrees.forEach(function (texte, rang) {' ' const resultat = valider(texte);' ' if (resultat.ok) { total = total + resultat.note; valides = valides + 1; }' ' console.log(\"Enregistrée \" + (rang + 1) + \" : \" + (resultat.ok ? \"note \" + resultat.note + \" (\" + resultat.raison + \")\" : \"invalide, \" + resultat.pourquoi));' '});' 'console.log(\"Valides : \" + valides + \" sur \" + enregistrees.length + \". Note moyenne des valides : \" + (total / valides).toFixed(1).replace(\".\", \",\"));' >> juge4.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le script du juge, partie 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const echantillon = juge(1, \"Promet de l’argent.\");' ' const texte = await demander([{ role: \"user\", content: grille + \"\n\nRéponse à noter : Votre remboursement a été accepté.\" }], echantillon, 80);' ' const resultat = valider(texte);' ' console.log(\"Le juge a dit : \" + texte);' ' console.log(\"Juge : \" + (resultat.ok ? \"note \" + resultat.note : \"invalide, \" + resultat.pourquoi));' '}' 'main();' >> juge4.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Valider cinq notes et une réelle
docker exec -w /home/node/project agent node juge4.jsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une sortie possible
| Ligne | Ce qu’elle montre |
|---|---|
| Enregistrées 1 et 2 | Notes valides 2 et 1, chacune avec une raison |
| Enregistrée 3 | Invalide, pas du JSON |
| Enregistrée 4 | Invalide, mauvaise note : 5 sort de l’échelle |
| Enregistrée 5 | Note valide 3 |
| Ligne Valides | 3 sur 5, note moyenne 2,0 |
| Juge | Une note et une raison, ou invalide. Cela peut changer à chaque lancement |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
À vous
Astuce
Dans juge4.js, remplacez la réponse à noter dans main par Nous regardons cela. Relancez et lisez la note et la raison obtenues.
Une erreur fréquente
Attention
Beaucoup font confiance à un juge parce que ses raisons semblent sûres. Une raison fluide n’est pas une preuve. Le juge est un modèle : il peut se tromper avec aplomb. Contrôlez son format par du code et ses notes contre celles de personnes.