Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Vérifier les affirmations d’un exécutant

Après cette leçon: Je peux repérer quand le rapport d’un exécutant n’est pas soutenu par ses sources, et signaler les affirmations qui échouent.

Leçon de 70 min7 commandesLab agent de code IA : utiliser opencode pour expliquer et corriger du code, et vérifier son travail

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

MotCe que ça veut dire
Affirmationun énoncé d’un rapport qui peut être vrai ou faux
Sourcele texte dont une affirmation dit provenir
Soutenuela source dit vraiment ce que dit l’affirmation
Relecteurun second agent qui lit une affirmation et sa source
Contrôle par sondagela lecture à la main de quelques affirmations, choisies selon une règle fixe
Inventionune 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ôleAttrapeLaisse passer
Programme : source et nombresUne source inventée, un chiffre fauxUne affirmation qui inverse le sens
Modèle relecteurBeaucoup de sens inversésSes propres erreurs, et un penchant à approuver
Sondage par une personneCe 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

Commande
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

Commande
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

Commande
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

Commande
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

Commande
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

Commande
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

Commande
docker exec -w /home/node/project agent node 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.

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

LigneCe qu’elle montre
1 passe le contrôle, 2 passe le contrôleNombres et mots concordent
3 SIGNALÉE : nombre absent de la sourceL’affirmation dit 410, la source 310
4 SIGNALÉE : mots absents de la sourceRien dans la source ne parle de prêts
5 SIGNALÉE : aucune sourceElle cite s7, qui n’existe pas
6 passe le contrôleElle passe, bien que le sens soit inversé
Sondage, une affirmation sur 3 : 1, 4Une 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.

À propos de ce labo et de sa source: Lab agent de code IA : utiliser opencode pour expliquer et corriger du code, et vérifier son travail

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.