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

Changer de modèle LLM sans risque

Après cette leçon: Je peux décider, à partir de deux exécutions enregistrées, s’il faut passer une fonction à un autre modèle.

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

Un nouveau modèle coûte moins et répond autrement

Changer le modèle derrière une fonction, c’est rejouer les mêmes cas sur les deux versions et déplacer les utilisateurs peu à peu. Cela compte, car une nouvelle version peut être meilleure en moyenne et pire sur certains cas, que vos utilisateurs trouvent en premier.

Aucun labo ici n’entraîne ni ne sert un modèle : cette leçon compare donc deux versions enregistrées. La méthode est celle d’un vrai projet.

À la fin de cette leçon

Remarque

Je peux décider, à partir de deux exécutions enregistrées, s’il faut passer une fonction à un autre modèle.

Mots clés

MotCe que ça veut dire
Régressionun cas réussi avant et raté maintenant
Canariune petite part d’utilisateurs qui passe d’abord
Retour arrièrele chemin pour revenir à l’ancienne version
Seauun nombre fixe où tombe toujours un utilisateur
Hausse de coûtle pourcentage en plus que coûte la nouvelle version

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Rejouer les mêmes cas sur les deux versions

Utilisez les mêmes cas pour les deux versions, et notez pour chaque cas s’il est réussi et ce qu’il coûte. Comparez les totaux de réussites, mais listez aussi les régressions.

Deux versions au même total peuvent différer : l’une peut rater un cas que l’autre réussit. Une régression sur un cas important pèse parfois plus qu’une meilleure moyenne.

Exemple détaillé : ancienne et nouvelle sur six cas

VersionRéussisCoûtRégressions
Ancienne5 sur 6180aucune
Nouvelle5 sur 6144c3 réussi avant, raté maintenant

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Déplacer d’abord une petite part

Ne basculez pas tout le monde d’un coup. Envoyez une petite part des utilisateurs vers la nouvelle version et observez. Choisissez-les par une règle fixe, pour que la même personne reçoive toujours la même version.

Gardez l’ancienne version en marche pour revenir en une étape. Et regardez la facture : une hausse de prix peut effacer le gain, donc fixez la hausse acceptée avant de regarder.

Une erreur courante

Attention

Beaucoup pensent qu’un modèle plus récent est toujours meilleur, donc qu’un test rapide suffit. Un nouveau modèle peut être meilleur en moyenne et pire sur vos cas. Rejouez vos propres cas, déplacez une petite part d’abord, et gardez le retour arrière.

É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 la comparaison, partie 1

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' '' '// Deux versions enregistrées d’une fonction sur les mêmes six cas. Le coût est en micro-euros.' 'const ancien = [1, 1, 1, 0, 1, 1].map(function (ok, i) { return { cas: \"c\" + (i + 1), ok: ok === 1, cout: 30 }; });' 'const nouveau = [1, 1, 0, 1, 1, 1].map(function (ok, i) { return { cas: \"c\" + (i + 1), ok: ok === 1, cout: 24 }; });' 'const MAX_REGRESSIONS = 1;' 'function reussis(essais) { return essais.filter(function (r) { return r.ok; }).length; }' 'function total(essais) { return essais.reduce(function (somme, r) { return somme + r.cout; }, 0); }' > changer.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 la comparaison, partie 2

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function regressions(a, b) {' '  return a.filter(function (r, i) { return r.ok && b[i].ok === false; }).map(function (r) { return r.cas; });' '}' '// Un utilisateur est dans le canari quand les lettres de son nom donnent un seau sous le pourcentage.' 'function dansCanari(utilisateur, pourcent) {' '  let n = 0;' '  for (const lettre of utilisateur) n = n + lettre.charCodeAt(0);' '  return n % 100 < pourcent;' '}' >> changer.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 la comparaison, partie 3

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  console.log(\"ancien : \" + reussis(ancien) + \" sur 6, coût \" + total(ancien));' '  console.log(\"nouveau : \" + reussis(nouveau) + \" sur 6, coût \" + total(nouveau));' '  const mal = regressions(ancien, nouveau);' '  console.log(\"régressions : \" + mal.join(\", \") + (mal.length <= MAX_REGRESSIONS ? \" (permis)\" : \" (trop)\"));' '  const gens = [\"ana\", \"cy\", \"eva\", \"gus\", \"li\", \"zoe\"];' '  console.log(\"canari à 10 pour cent : \" + gens.filter(function (u) { return dansCanari(u, 10); }).join(\", \"));' '  const r = await demander([{ role: \"user\", content: \"Combien font 15 pour cent de 200 euros ? Répondez en une courte phrase.\" }], \"15 pour cent de 200 euros font 30 euros.\", 40);' '  console.log(\"Aujourd’hui en direct (hors enregistrement) : \" + r.texte);' '}' 'main();' >> changer.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 comparaison

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

Une sortie possible

LigneCe qu’elle montre
ancien : 5 sur 6, coût 180L’ancienne version enregistrée
nouveau : 5 sur 6, coût 144La nouvelle version enregistrée, moins chère
régressions : c3 (permis)Une régression, dans la limite d’une
canari à 10 pour cent : anaL’utilisateur que la règle fixe met dans la petite part
Aujourd’hui en direct (hors enregistrement) : ...Votre propre appel. Il change à chaque exécution, ou affiche Échantillon enregistré

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.