Pourquoi un modèle ne doit pas changer seul
Figer la version d’un modèle, c’est nommer la version exacte qu’une fonction utilise. Un nom qui veut toujours dire « la plus récente » n’est pas une version figée.
C’est important : une fonction qui marchait lundi peut se comporter autrement mardi, sans rien changer chez vous. Passer à un nouveau modèle exprès, en comparant d’abord les deux versions, est déjà une bonne habitude. Ici, on va plus loin : on contrôle aussi le changement que personne n’a choisi.
À la fin de cette leçon
Remarque
Je peux empêcher un modèle de changer sous une fonction.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Figer | nommer une version exacte | |
| Alias | un nom qui pointe vers une version qui peut bouger | assistant-dernier |
| Configuration | le fichier qui dit quel modèle une fonction utilise | |
| Avis de retrait | un avertissement qu’une version va cesser de marcher | |
| Jour de retrait | le jour où une version cesse de répondre |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un alias peut bouger, une version non
Une configuration nomme le modèle qu’une fonction appelle. Si elle dit assistant-dernier, c’est le fournisseur qui décide de ce que cela veut dire. Un jour, le nom pointe vers une nouvelle version.
Si elle dit assistant-v3, elle désigne cette version seule. La fonction ne change que quand vous modifiez la configuration.
Exemple détaillé : cinq noms
| Nom dans la configuration | Figé ? | Pourquoi |
|---|---|---|
| assistant-v3 | Oui | Finit par v et un nombre entier |
| assistant-v10 | Oui | Dix est un nombre entier |
| assistant-dernier | Non | Dernier est un mot, pas un nombre |
| assistant | Non | Aucune version |
| assistant-v2b | Non | 2b n’est pas un nombre entier |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur courante
Attention
Beaucoup pensent qu’une version figée suffit pour toujours. Elle s’arrête pourtant : le fournisseur la retire un jour fixé. La version figée vous donne le temps de passer à la suivante à votre rythme, à condition d’agir avant le jour de retrait.
Un avis vous donne un jour pour agir
Un avis de retrait nomme une version et son jour de retrait. Les jours restants sont ce jour moins aujourd’hui.
Choisissez une fenêtre d’alerte, par exemple 30 jours. Dans cette fenêtre, une fonction est bientôt retirée : préparez le passage maintenant. Au jour dit ou après, elle est retirée et elle échoue déjà.
Exemple détaillé : nous sommes au jour 100
| Version | Jour de retrait | Jours restants | Statut avec une fenêtre de 30 jours |
|---|---|---|---|
| assistant-v1 | 90 | -10 | Retiré |
| assistant-v2 | 125 | 25 | Bientôt retiré |
| assistant-v4 | 300 | 200 | ok |
| assistant-v5 | pas d’avis | aucun | ok |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
É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ôle des versions, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const aujourdhui = 100;' 'const configs = [' ' { fonction: \"resume\", modele: \"assistant-v3\" },' ' { fonction: \"recherche\", modele: \"assistant-dernier\" },' ' { fonction: \"tri\", modele: \"assistant-v2\" },' ' { fonction: \"etiquettes\", modele: \"assistant-v1\" },' ' { fonction: \"brouillon\", modele: \"assistant\" },' '];' 'const avis = { \"assistant-v2\": 125, \"assistant-v1\": 90 };' > fige.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ôle des versions, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function fige(modele) {' ' const fin = modele.split(\"-\").pop();' ' const reste = fin.slice(1);' ' return fin.length > 1 && fin[0] === \"v\" && String(Number(reste)) === reste;' '}' 'function statut(c) {' ' if (fige(c.modele) === false) return \"NON FIGÉ\";' ' const jour = avis[c.modele];' ' if (jour === undefined) return \"ok\";' ' if (jour <= aujourdhui) return \"RETIRÉ\";' ' return jour - aujourdhui <= 30 ? \"RETRAIT dans \" + (jour - aujourdhui) + \" jours\" : \"ok\";' '}' >> fige.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ôle des versions, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' let bon = 0;' ' configs.forEach(function (c) {' ' const s = statut(c);' ' if (s === \"ok\") bon = bon + 1;' ' console.log(c.fonction + \" \" + c.modele + \" : \" + s);' ' });' ' console.log(\"à revoir : \" + (configs.length - bon) + \" sur \" + configs.length);' ' const q = \"En une phrase courte, pourquoi figer un modèle sur une version ?\";' ' const echantillon = \"Une version figée ne peut pas changer sous la fonction : vous choisissez le moment de passer à la suivante.\";' ' const reponse = await demander([{ role: \"user\", content: q }], echantillon, 60);' ' console.log(\"le modèle dit : \" + reponse.texte);' '}' 'main();' >> fige.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ôle des versions
docker exec -w /home/node/project agent node fige.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 contrôle affiche
| Ligne | Ce qu’elle montre |
|---|---|
| resume assistant-v3 : ok | Figé et sans avis |
| recherche assistant-dernier : NON FIGÉ | Un alias, donc il peut bouger |
| tri assistant-v2 : RETRAIT dans 25 jours | Figé, mais la fin approche |
| etiquettes assistant-v1 : RETIRÉ | Le jour de retrait est passé |
| brouillon assistant : NON FIGÉ | Aucune version |
| à revoir : 4 sur 5 | Compté par des règles, pas par un modèle |
| 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.