Le plus gros n’est pas toujours le meilleur
Choisir la taille d’un modèle, c’est trouver le plus petit modèle qui fait assez bien la tâche. Un petit modèle sur une tâche étroite peut valoir un gros pour une fraction du prix.
C’est important, car le prix de chaque appel s’additionne, et l’attente aussi. On trouve la bonne taille en testant, jamais en devinant.
À la fin de cette leçon
Remarque
Je peux choisir la taille d’un modèle pour une tâche d’après un test et un prix.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Tâche étroite | un travail petit et clair |
| Jeu de tests | des cas fixes qui servent à noter un modèle |
| Taux de réussite | la part des cas qu’un modèle réussit |
| Prix par appel | ce que coûte chaque demande |
| Assez bien | un taux de réussite que la tâche accepte |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Testez chaque taille sur les mêmes cas
Écrivez un jeu de tests : une liste fixe de vrais cas pour votre tâche, comme dix tickets d’assistance à classer. Lancez chaque taille de modèle sur les mêmes cas et notez réussi ou raté pour chacun.
Le taux de réussite est la part qu’il réussit. Le module 68 en dit plus sur les jeux de tests. Cette leçon utilise des résultats enregistrés : rien ne tourne maintenant.
Résultats enregistrés sur six tickets
| Taille | Justes sur 6 | Taux de réussite | Prix pour 1000 appels (€) |
|---|---|---|---|
| petit | 4 | 66,7 % | 3 |
| moyen | 5 | 83,3 % | 10 |
| grand | 6 | 100 % | 45 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Regardez les cas que rate un petit modèle
Un taux de réussite cache les cas ratés. Le petit modèle ci-dessus rate les tickets 4 et 6. Lisez-les. S’ils sont rares dans la vraie vie, le petit peut suffire.
Calculez ensuite le prix par bonne réponse : le prix divisé par la part de réussis. Un modèle bon marché souvent faux peut coûter plus par bonne réponse qu’un modèle plus cher.
Une erreur courante
Attention
Beaucoup pensent que le plus gros modèle est le choix sûr. C’est le plus cher, et il est plus lent. Si une taille plus petite réussit votre propre jeu de tests, elle suffit. Prenez la taille la moins chère qui réussit, et retestez quand la tâche change.
É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 sélecteur de taille, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const enregistre = {' ' petit: { cout: 3, reussis: [1, 1, 1, 0, 1, 0] },' ' moyen: { cout: 10, reussis: [1, 1, 1, 1, 1, 0] },' ' grand: { cout: 45, reussis: [1, 1, 1, 1, 1, 1] },' '};' 'function gagnes(m) {' ' return m.reussis.reduce(function (a, b) { return a + b; }, 0);' '}' 'function taux(m) {' ' return gagnes(m) * 100 / m.reussis.length;' '}' > choisir.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 sélecteur de taille, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function parBonne(m) {' ' return m.cout * m.reussis.length / gagnes(m);' '}' 'function choisir(besoin) {' ' let meilleur = \"aucun\";' ' let meilleurCout = Infinity;' ' for (const nom of Object.keys(enregistre)) {' ' const m = enregistre[nom];' ' if (taux(m) >= besoin && m.cout < meilleurCout) { meilleur = nom; meilleurCout = m.cout; }' ' }' ' return meilleur;' '}' >> choisir.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 sélecteur de taille, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"Résultats enregistrés sur 6 tickets (pas lancés maintenant) :\");' ' for (const nom of Object.keys(enregistre)) {' ' const m = enregistre[nom];' ' console.log(nom + \" : \" + taux(m).toFixed(1) + \" % juste, prix \" + m.cout + \", prix par bonne réponse \" + parBonne(m).toFixed(2));' ' }' ' console.log(\"besoin 60 % : \" + choisir(60) + \" | besoin 80 % : \" + choisir(80) + \" | besoin 100 % : \" + choisir(100));' ' const q = \"En une phrase courte, pourquoi tester un petit modèle sur ses propres cas avant de le choisir ?\";' ' const echantillon = \"Un petit modèle peut bien faire une tâche étroite, et seuls vos propres cas montrent où il échoue.\";' ' const reponse = await demander([{ role: \"user\", content: q }], echantillon, 60);' ' console.log(\"le modèle dit : \" + reponse.texte);' '}' 'main();' >> choisir.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 sélecteur de taille
docker exec -w /home/node/project agent node choisir.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 |
|---|---|
| petit : 66.7 % juste, prix 3, prix par bonne réponse 4.50 | Bon marché, et moins avantageux qu’il n’y paraît |
| grand : 100.0 % juste, prix 45, ... 45.00 | Toujours juste, le plus cher |
| besoin 60 % : petit | besoin 80 % : moyen | besoin 100 % : grand | Le besoin décide de la taille |
| le modèle dit : ... | Une phrase. Les mots changent à chaque Run |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.