Comment revoir un plan de changement
Un plan de changement est un court document qui dit ce qui va changer, pourquoi c’est sûr et comment l’annuler. Une revue de changement contrôle le plan avant toute mise en ligne.
Revoir une fonction entière est un autre travail. Cette leçon revoit un seul changement, avec une liste de contrôle qui donne une réponse claire : autoriser, à compléter ou arrêter.
À la fin de cette leçon
Remarque
Je peux revoir un plan de changement avant sa mise en ligne.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Plan de changement | un court document qui dit ce qui change et comment l’annuler |
| Preuves | des résultats qui montrent que le changement n’est pas pire |
| Déploiement | la façon dont le changement atteint les utilisateurs, par étapes |
| Retour arrière | les étapes qui annulent le changement |
| Approbateur | la personne qui dit oui |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un plan a besoin de cinq parties
Les cinq parties sont le changement, les preuves, le déploiement, le retour arrière et l’approbateur. Un plan auquel il manque une partie n’est pas prêt, et le relecteur dit laquelle.
Cherchez d’abord les parties absentes. Inutile de contrôler les nombres d’une partie qui n’existe pas. Un plan sans retour arrière est arrêté tout de suite ; un plan auquel manque une autre partie est à compléter.
Chaque partie a une limite écrite
Écrivez les limites avant de lire un plan. Les preuves demandent au moins 100 cas et aucune baisse du taux de réussite. Le déploiement commence à 10 pour cent ou moins, avec un minimum de 50 requêtes.
Le retour arrière est testé et dure 15 minutes ou moins. L’approbateur n’est pas l’auteur.
Exemple détaillé : deux plans face aux limites
| Règle | Consigne v7 | Changement de modèle |
|---|---|---|
| Au moins 100 cas | 240, passe | 60, échoue |
| Aucune baisse du taux de réussite | 71 à 74, passe | 80 à 76, échoue |
| Départ à 10 pour cent ou moins | 5, passe | 50, échoue |
| Minimum de 50 requêtes | 50, passe | 0, échoue |
| Retour arrière testé, 15 minutes ou moins | Oui, 10 | Non, 30. Échoue deux fois |
| L’approbateur n’est pas l’auteur | Hugo, passe | Léa l’a écrit, échoue |
| Décision | Autoriser | Arrêter |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur courante
Attention
Beaucoup pensent qu’un plan aux bons nombres est prêt. Les nombres ne montrent pas que le retour arrière marche. Un retour arrière jamais essayé peut échouer au moment où l’on en a besoin. La revue demande donc s’il a été testé et combien de temps il a pris.
É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 script de revue, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const plans = {' ' \"consigne v7\": { changement: \"nouvelle consigne de remboursement\", preuves: { cas: 240, avant: 71, apres: 74 },' ' deploiement: { depart: 5, minimum: 50 }, retour_arriere: { minutes: 10, teste: true }, approbateur: \"Hugo\", auteur: \"Léa\" },' ' \"changement de modèle\": { changement: \"nouveau modèle\", preuves: { cas: 60, avant: 80, apres: 76 },' ' deploiement: { depart: 50, minimum: 0 }, retour_arriere: { minutes: 30, teste: false }, approbateur: \"Léa\", auteur: \"Léa\" },' ' \"ton plus amical\": { changement: \"ton plus amical\", preuves: { cas: 150, avant: 70, apres: 70 },' ' deploiement: { depart: 10, minimum: 50 }, approbateur: \"Hugo\", auteur: \"Léa\" },' '};' > revue.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 de revue, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function problemes(p) {' ' const sortie = [\"changement\", \"preuves\", \"deploiement\", \"retour_arriere\", \"approbateur\"].filter(function (k) { return p[k] === undefined; })' ' .map(function (k) { return \"absent : \" + k; });' ' if (p.preuves && p.preuves.cas < 100) sortie.push(\"preuves trop petites\");' ' if (p.preuves && p.preuves.apres < p.preuves.avant) sortie.push(\"preuves montrent une régression\");' >> revue.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 de revue, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' if (p.deploiement && p.deploiement.depart > 10) sortie.push(\"déploiement trop grand au départ\");' ' if (p.deploiement && p.deploiement.minimum < 50) sortie.push(\"déploiement sans minimum\");' ' if (p.retour_arriere && p.retour_arriere.teste === false) sortie.push(\"retour_arriere non testé\");' ' if (p.retour_arriere && p.retour_arriere.minutes > 15) sortie.push(\"retour_arriere trop lent\");' ' if (p.approbateur === p.auteur) sortie.push(\"approbateur est l’auteur\");' ' return sortie;' '}' >> revue.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 de revue, partie 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const ARRET = [\"preuves montrent une régression\", \"absent : retour_arriere\", \"retour_arriere non testé\", \"retour_arriere trop lent\", \"approbateur est l’auteur\"];' 'function decider(p) {' ' const trouves = problemes(p);' ' if (trouves.length === 0) return \"autoriser\";' ' return trouves.some(function (t) { return ARRET.indexOf(t) >= 0; }) ? \"arrêter\" : \"à compléter\";' '}' >> revue.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 de revue, partie 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' Object.keys(plans).forEach(function (nom) {' ' console.log(nom + \" : \" + decider(plans[nom]) + \" \" + JSON.stringify(problemes(plans[nom])));' ' });' ' const q = \"En une phrase courte, pourquoi la personne qui approuve un changement ne doit-elle pas en être l’auteur ?\";' ' const echantillon = \"Un second regard repère ce que l’auteur ne voit pas dans son propre travail.\";' ' const reponse = await demander([{ role: \"user\", content: q }], echantillon, 60);' ' console.log(\"le modèle dit : \" + reponse.texte);' '}' 'main();' >> revue.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 la revue de changement
docker exec -w /home/node/project agent node revue.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 |
|---|---|
| consigne v7 : autoriser [] | Aucun problème |
| changement de modèle : arrêter [...] | Sept problèmes, dont des règles de sûreté |
| ton plus amical : arrêter ["absent : retour_arriere"] | Aucun retour arrière |
| le modèle dit : ... | Une phrase du labo. Un échantillon enregistré si aucun modèle ne répond |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.