L’appli qui promettait trop
Une appli de révision annonce : « Posez n’importe quelle question et obtenez la bonne réponse. » Un élève lui fait confiance la veille d’un contrôle. Elle donne une date fausse, et il l’apprend par cœur.
L’appli n’est pas en panne. Elle a promis plus qu’elle ne sait faire. Cette leçon parle des mots et des écrans qui fixent ce qu’une personne attend.
À la fin de cette leçon
Remarque
Je peux dire à une personne ce qu’une fonction sait faire et ne sait pas faire avant qu’elle s’y fie.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Attente | ce qu’une personne pense que la fonction va faire | |
| Promesse | une phrase qui dit ce que la fonction fait | toujours juste |
| Limite | une chose que la fonction ne sait pas faire | |
| Périmètre | les tâches pour lesquelles la fonction est faite | |
| Cas d’échec | un vrai cas où elle se trompe |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Dire à quoi ça sert, ou non
Une personne décide en quelques secondes jusqu’où se fier à une fonction. Donnez-lui trois choses courtes : à quoi elle sert, à quoi elle ne sert pas, et un exemple où elle échoue.
L’exemple d’échec, les équipes l’oublient. C’est pourtant ce que les gens retiennent.
Un bon texte pour un outil de notes
| Partie | Exemple de mots |
|---|---|
| Sert à | Transformer vos notes en un court résumé |
| Ne sert pas à | Vérifier des faits, ou donner un avis de santé ou de droit |
| Échoue quand | Vos notes donnent deux dates pour un même événement |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Certaines promesses ne se tiennent jamais
Une promesse impossible à tenir, c’est une promesse qu’une seule mauvaise réponse prouve fausse. Les mots toujours, jamais faux, garanti et 100 % sont les plus courants. Toute question en est une autre : personne ne peut tester toutes les questions.
Remplacez chacune par un chiffre que vous pouvez compter, comme « juste sur 9 questions de test sur 10 ». Le module 68 montre comment le mesurer.
Une erreur courante
Attention
Beaucoup pensent qu’une petite note « peut être fausse » en bas de page suffit. Personne ne la lit, donc elle ne fixe aucune attente. Dites la limite à côté de la réponse, là où la personne regarde, au moment où elle s’y fierait.
É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 contrôleur de promesses, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const INTERDITS = [\"toujours\", \"jamais faux\", \"garanti\", \"100 %\", \"toute question\"];' 'const TEXTES = [' ' { id: \"a\", texte: \"Posez toute question et obtenez une réponse garantie.\" },' ' { id: \"b\", texte: \"Rédigez une réponse d’après vos notes. Elle peut être fausse, vérifiez-la.\" },' ' { id: \"c\", texte: \"Toujours juste, 100 % du temps.\" },' ' { id: \"d\", texte: \"Résumez une page. Pas pour un avis médical.\" },' '];' > attentes.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 contrôleur de promesses, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function promesses(texte) {' ' const bas = texte.toLowerCase();' ' return INTERDITS.filter(function (p) { return bas.includes(p); });' '}' 'function adesLimite(texte) {' ' const bas = texte.toLowerCase();' ' return bas.includes(\"peut être fausse\") || bas.includes(\"pas pour\");' '}' >> attentes.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 contrôleur de promesses, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' let echecs = 0;' ' for (const t of TEXTES) {' ' const trouvees = promesses(t.texte);' ' let verdict = \"alerte\";' ' if (trouvees.length > 0) verdict = \"echec\";' ' else if (adesLimite(t.texte)) verdict = \"ok\";' ' if (verdict === \"echec\") echecs++;' ' console.log(t.id + \" \" + verdict + \" \" + JSON.stringify(trouvees));' ' }' ' console.log(\"echecs \" + echecs + \" sur \" + TEXTES.length);' ' const q = \"Écrivez une seule ligne courte qui dit ce qu’un outil de résumé de notes ne sait pas faire.\";' ' const reponse = await demander([{ role: \"user\", content: q }], \"Il ne peut pas vérifier des faits qui ne sont pas dans vos notes.\", 30);' ' console.log(\"ligne de limite : \" + reponse.texte);' '}' 'main();' >> attentes.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 contrôleur de promesses
docker exec -w /home/node/project agent node attentes.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 Run affiche
| Ligne | Ce qu’elle montre |
|---|---|
| a echec ["garanti","toute question"] | Deux promesses que personne ne tient |
| b ok [] | Aucune promesse, et le texte dit qu’il peut être faux |
| c echec ["toujours","100 %"] | Deux autres promesses |
| d ok [] | Le texte dit à quoi il ne sert pas |
| echecs 2 sur 4 | La moitié de ces textes est à réécrire |
| ligne de limite : ... | Une phrase. Les mots changent à chaque Run |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.