Un rapport est une liste d’affirmations
Le rapport d’un exécutant est un ensemble d’affirmations, et chacune dit venir d’une source. Cela compte, car un exécutant qui ne trouve pas de réponse en écrit souvent une qui sonne juste.
L’orchestrateur ne voit pas la différence en lisant. Il doit vérifier chaque affirmation contre la source qu’elle nomme.
À la fin de cette leçon
Remarque
Je peux repérer quand le rapport d’un exécutant n’est pas soutenu par ses sources, et signaler les affirmations qui échouent.
Mots-clés
| Mot | Ce que ça veut dire |
|---|---|
| Affirmation | un énoncé d’un rapport qui peut être vrai ou faux |
| Source | le texte dont une affirmation dit provenir |
| Soutenue | la source dit vraiment ce que dit l’affirmation |
| Relecteur | un second agent qui lit une affirmation et sa source |
| Contrôle par sondage | la lecture à la main de quelques affirmations, choisies selon une règle fixe |
| Invention | une affirmation qu’un exécutant a inventée pour combler un vide |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Trois contrôles, du moins cher au plus cher
Le contrôle le moins cher est un programme. La source citée existe-t-elle, et les nombres de l’affirmation y figurent-ils ? Il attrape les sources inventées et les chiffres faux.
Vient ensuite un relecteur, un modèle qui lit l’affirmation et la source. Le plus cher est une personne, qui lit quelques affirmations choisies selon une règle fixe.
Exemple travaillé : ce que chaque contrôle attrape
| Contrôle | Attrape | Laisse passer |
|---|---|---|
| Programme : source et nombres | Une source inventée, un chiffre faux | Une affirmation qui inverse le sens |
| Modèle relecteur | Beaucoup de sens inversés | Ses propres erreurs, et un penchant à approuver |
| Sondage par une personne | Ce que les deux autres ont raté | Tout ce qui n’est pas tiré |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Pourquoi les exécutants inventent
Un exécutant est récompensé pour une réponse, donc les mains vides ressemblent à un échec. Dites-lui qu’il peut ne pas répondre : une consigne qui demande de répondre « introuvable » quand le matériel ne dit rien.
Comptez ensuite les réponses « introuvable ». Un exécutant qui n’en donne jamais invente probablement.
Une erreur fréquente
Attention
Beaucoup lisent une citation comme une preuve. Une affirmation qui nomme une source peut quand même se tromper à son sujet. Il faut vérifier que la source le dit, pas que l’affirmation en nomme une.
Écrire l’assistant 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\";' '// Les jetons d’une réponse, ou null si elle n’en donne pas.' 'function compter(donnees, nom) {' ' return donnees.usage && typeof donnees.usage[nom] === \"number\" ? donnees.usage[nom] : null;' '}' > 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’assistant du modèle, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '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 || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"statut \" + res.status);' ' const d = await res.json();' ' return { texte: d.choices[0].message.content, entree: compter(d, \"prompt_tokens\"), sortie: compter(d, \"completion_tokens\"), enregistre: false };' ' } catch (erreur) {' ' console.log(\"Échantillon enregistré : aucun modèle n’a répondu (\" + erreur.message + \").\");' ' return { texte: echantillon, entree: null, sortie: null, enregistre: true };' ' }' '}' '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 vérificateur, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const SOURCES = {' ' s1: \"Sondage : 212 visiteurs sur 400 ont demandé l’ouverture le dimanche.\",' ' s2: \"Personnel : six heures à 18 euros de l’heure font 108 euros chaque dimanche.\",' ' s3: \"Visites : le samedi a compté 310 visites le mois dernier, un jour de semaine 120.\",' '};' 'const AFFIRMATIONS = [' ' { texte: \"212 visiteurs sur 400 ont demandé l’ouverture le dimanche.\", source: \"s1\" },' ' { texte: \"Le personnel du dimanche coûte 108 euros.\", source: \"s2\" },' ' { texte: \"Le samedi a compté 410 visites le mois dernier.\", source: \"s3\" },' ' { texte: \"La plupart des lecteurs veulent des prêts plus longs.\", source: \"s1\" },' ' { texte: \"Le personnel juge cette ouverture équitable.\", source: \"s7\" },' ' { texte: \"Les visites en semaine étaient plus nombreuses que le samedi.\", source: \"s3\" },' '];' > controle.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 vérificateur, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function nombres(t) { return t.match(/[0-9]+/g) || []; }' 'function mots(t) {' ' return (t.toLowerCase().match(/\p{L}+/gu) || []).filter(function (w) { return w.length >= 5; });' '}' >> controle.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 vérificateur, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Un contrôle peu coûteux : la source existe, ses nombres concordent, la moitié des mots longs y sont.' 'function pourquoi(a) {' ' const texte = SOURCES[a.source];' ' if (texte === undefined) return \"aucune source\";' ' const connus = nombres(texte);' ' if (nombres(a.texte).some(function (n) { return connus.includes(n) === false; })) return \"nombre absent de la source\";' ' const m = mots(a.texte);' ' const trouves = m.filter(function (x) { return mots(texte).includes(x); });' ' return 2 * trouves.length >= m.length ? \"\" : \"mots absents de la source\";' '}' >> controle.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 vérificateur, partie 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' AFFIRMATIONS.forEach(function (a, i) {' ' console.log((i + 1) + \" \" + (pourquoi(a) === \"\" ? \"passe le contrôle\" : \"SIGNALÉE : \" + pourquoi(a)));' ' });' ' console.log(\"Sondage, une affirmation sur 3 : \" + [1, 4].join(\", \"));' ' const a = AFFIRMATIONS[5];' ' const q = [{ role: \"user\", content: \"Source : \" + SOURCES.s3 + \" Affirmation : \" + a.texte + \" La source soutient-elle l’affirmation ? Répondez par oui ou non.\" }];' ' const r = await demander(q, \"non\", 10);' ' console.log(\"Relecteur sur l’affirmation 6 : \" + r.texte.trim());' '}' 'main();' >> controle.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.
Lancer le vérificateur
docker exec -w /home/node/project agent node controle.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.
Ce que le programme ne voit pas
L’affirmation 6 dit que les visites en semaine étaient plus nombreuses que le samedi. La source dit l’inverse. Le programme la laisse passer, car les mots concordent. Seul un relecteur ou une personne lit le sens.
Le seul appel en direct interroge un relecteur sur cette affirmation. Sa réponse peut changer à chaque exécution, et elle peut être fausse.
Une sortie possible
| Ligne | Ce qu’elle montre |
|---|---|
| 1 passe le contrôle, 2 passe le contrôle | Nombres et mots concordent |
| 3 SIGNALÉE : nombre absent de la source | L’affirmation dit 410, la source 310 |
| 4 SIGNALÉE : mots absents de la source | Rien dans la source ne parle de prêts |
| 5 SIGNALÉE : aucune source | Elle cite s7, qui n’existe pas |
| 6 passe le contrôle | Elle passe, bien que le sens soit inversé |
| Sondage, une affirmation sur 3 : 1, 4 | Une personne lira à la main les affirmations 1 et 4 |
| Relecteur sur l’affirmation 6 : … | Un deuxième avis, jamais une preuve |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.