Meilleur sur un point, pire sur un autre
Un modèle ajusté a obtenu un meilleur score sur la tâche pour laquelle vous l’avez entraîné. Est-il meilleur pour autant ? Pas encore. Il a peut-être empiré ailleurs, ou coûte deux fois plus cher à faire tourner.
Juger un modèle ajusté, c’est le comparer à la référence sur les mêmes cas, dans chaque domaine qui compte.
À la fin de cette leçon
Remarque
Je peux dire si un modèle ajusté est meilleur que la référence.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Gain | les résultats ajustés moins ceux de la référence |
| Marge | le plus petit gain qui compte pour vrai |
| Régression | un cas que la version ajustée rate maintenant |
| Domaine | un genre de cas, comme le ton ou le calcul |
| Enregistré | sauvegardé, pas produit en direct |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Comparer sur les mêmes cas
Lancez les deux versions sur une série fixe de cas qu’aucune n’a vus à l’entraînement. Comptez ce que chacune réussit. La différence est le gain.
Un gain d’un cas sur huit est trop petit pour qu’on s’y fie. Fixez la marge voulue avant de regarder, pour que le résultat ne vous embobine pas.
Exemple : huit cas, trois domaines
| Domaine | Réussis en base | Réussis ajustés | Changement |
|---|---|---|---|
| messages | 2 sur 4 | 3 sur 4 | +1 |
| ton | 1 sur 2 | 2 sur 2 | +1 |
| calcul | 2 sur 2 | 1 sur 2 | -1 |
| total | 5 sur 8 | 6 sur 8 | +1 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une meilleure réponse peut coûter plus
Un modèle ajusté peut répondre avec plus de mots, ou demander une offre plus grosse pour tourner. Calculez la hausse de coût en pourcentage du coût de référence.
Fixez d’abord le maximum que vous acceptez. Un petit gain qui double la facture ne vaut en général pas la mise en service.
Une erreur courante
Attention
Beaucoup pensent qu’un meilleur score sur la tâche entraînée prouve que le modèle est meilleur. Il prouve seulement qu’il est meilleur là. Vérifiez les autres domaines, comptez les cas qui ont empiré et regardez le coût avant de décider.
É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 la comparaison, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' '// Enregistré : 1 veut dire juste. Les mêmes huit cas pour les deux versions.' 'const cas = [' ' { id: \"c1\", domaine: \"messages\", base: 0, ajuste: 1 }, { id: \"c2\", domaine: \"messages\", base: 0, ajuste: 1 },' ' { id: \"c3\", domaine: \"messages\", base: 1, ajuste: 1 }, { id: \"c4\", domaine: \"messages\", base: 1, ajuste: 0 },' ' { id: \"c5\", domaine: \"ton\", base: 0, ajuste: 1 }, { id: \"c6\", domaine: \"ton\", base: 1, ajuste: 1 },' ' { id: \"c7\", domaine: \"calcul\", base: 1, ajuste: 1 }, { id: \"c8\", domaine: \"calcul\", base: 1, ajuste: 0 },' '];' > adapt5.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
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function total(version) {' ' let n = 0;' ' for (const c of cas) n = n + c[version];' ' return n;' '}' 'const pires = cas.filter(function (c) { return c.base === 1 && c.ajuste === 0; });' 'const changement = {};' 'for (const c of cas) changement[c.domaine] = (changement[c.domaine] || 0) + c.ajuste - c.base;' >> adapt5.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
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"base \" + total(\"base\") + \" sur 8, ajusté \" + total(\"ajuste\") + \" sur 8\");' ' console.log(\"ont empiré : \" + pires.map(function (c) { return c.id; }).join(\", \"));' ' console.log(\"changement par domaine : \" + JSON.stringify(changement));' ' const q = \"En une phrase, pourquoi vérifier des domaines que l’ajustement ne visait pas ?\";' ' const echantillon = \"Ajuster pour une tâche peut empirer discrètement les autres, et seul un contrôle sur celles-ci le montre.\";' ' const reponse = await demander([{ role: \"user\", content: q }], echantillon, 60);' ' console.log(\"le modèle dit : \" + reponse.texte);' '}' 'main();' >> adapt5.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
docker exec -w /home/node/project agent node adapt5.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 la comparaison a affiché
Les deux séries de résultats sont enregistrées et écrites dans le script. Le Run compte chaque version, liste les cas qui ont empiré et montre le changement dans chaque domaine.
La dernière ligne est un court appel au modèle, ou un Échantillon enregistré.