Le plus grand n’est pas toujours le meilleur
Choisir un modèle de langage, c’est faire correspondre un modèle et une tâche. Les critères sont le coût, la vitesse, la taille, la quantité de texte qu’il peut lire et le lieu où il tourne.
Ce choix compte, car il se répète à chaque appel. Un modèle dix fois plus cher que nécessaire, appelé un million de fois, donne une grosse facture sans aucun gain.
À la fin de cette leçon
Remarque
Je peux choisir un modèle pour une tâche et dire pourquoi.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Fenêtre de contexte | le plus grand texte qu’un modèle lit en un appel |
| Latence | le temps qu’on attend avant la réponse |
| Prix par jeton | ce que coûte chaque jeton, souvent compté par million |
| Hébergé | exécuté par un fournisseur, joint par internet |
| Local | exécuté sur votre propre machine |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Cinq choses à peser
Partez de la tâche. Une tâche a une taille, par exemple la quantité de texte qui entre et celle qui sort. Elle a un délai qu’une personne accepte et un budget.
Posez ensuite cinq questions à chaque modèle, comme le montre le tableau. Un modèle qui échoue à l’une d’elles est écarté, même s’il est excellent pour les autres.
Les cinq questions
| Critère | La question à poser |
|---|---|
| Coût | Que coûtent les jetons de cette tâche ? |
| Vitesse | La réponse est-elle assez rapide pour une personne ? |
| Taille | Lit-il tout le texte de la tâche ? |
| Qualité | Est-il assez bon sur mes propres exemples ? |
| Lieu | Le texte peut-il quitter ma machine ? |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Chronométrer le modèle du labo sur deux tâches
docker exec -w /home/node/project agent node -e 'const labo = require("./labo.js"); const demandes = [ { nom: "courte", max: 10, texte: "Citez un fruit.", exemple: "Une pomme." }, { nom: "longue", max: 100, texte: "Décrivez une journée de pluie en trois phrases.", exemple: "La pluie tape sur la vitre. La rue est grise." }, ]; (async () => { for (const une of demandes) { const debut = Date.now(); const obtenu = await labo.demander({ max_tokens: une.max, messages: [{ role: "user", content: une.texte }] }, une.exemple); const ms = Date.now() - debut; if (obtenu.etiquette === "Exemple enregistré") { console.log(une.nom + " : Exemple enregistré, pas de durée mesurée."); continue; } const utilise = obtenu.donnees.usage ? obtenu.donnees.usage.completion_tokens + " jetons écrits" : "pas de nombre de jetons dans la réponse"; console.log(une.nom + " : Réponse du modèle, " + ms + " ms, " + obtenu.texte.length + " caractères, " + utilise + "."); } })();'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.
Calculez le coût avant d’appeler
Un prix est donné pour chaque million de jetons : un prix pour les jetons d’entrée, plus élevé pour ceux de sortie. Le coût d’un appel s’obtient en deux produits. Les jetons d’entrée fois le prix d’entrée, plus les jetons de sortie fois le prix de sortie.
Comptez les jetons d’une tâche typique, calculez un appel, puis multipliez par les appels attendus. La liste de prix utilisée ici est inventée : seule la méthode est réelle.
Chiffrer une tâche sur trois modèles inventés
docker exec -w /home/node/project agent node -e '/* Prix inventés, en unités pour chaque million de jetons. */ const modeles = [ { nom: "Petit", entree: 20, sortie: 80, delai: 600, contexte: 8000 }, { nom: "Moyen", entree: 100, sortie: 400, delai: 1500, contexte: 32000 }, { nom: "Grand", entree: 500, sortie: 2000, delai: 4000, contexte: 128000 }, ]; const tache = { entree: 3000, sortie: 300, delaiMax: 2000, budget: 0.5 }; console.log("La tâche : " + tache.entree + " jetons en entrée, " + tache.sortie + " en sortie, réponse en moins de " + tache.delaiMax + " ms."); for (const m of modeles) { const cout = (tache.entree * m.entree + tache.sortie * m.sortie) / 1000000; const ok = tache.entree + tache.sortie <= m.contexte && m.delai <= tache.delaiMax && cout <= tache.budget; console.log(m.nom.padEnd(7) + "coût " + cout.toFixed(3).replace(".", ",") + " unités, délai " + m.delai + " ms, " + (ok ? "convient" : "ne convient pas")); }'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.
Exemple travaillé : une tâche, trois modèles
| Modèle | Coût par appel | Délai | Convient ? |
|---|---|---|---|
| Petit | 0,084 unité | 600 ms | Oui |
| Moyen | 0,420 unité | 1500 ms | Oui |
| Grand | 2,100 unités | 4000 ms | Non, trop lent et trop cher |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup pensent que le plus grand modèle est toujours le meilleur. Il est le plus souvent le plus lent et le plus cher, et un petit modèle suffit parfois pour une tâche simple. Testez chaque modèle sur vos propres exemples, puis prenez le moins cher qui réussit.
Le lieu d’exécution change les règles
Un modèle hébergé est exécuté par un fournisseur. Vous envoyez du texte par internet et vous payez au jeton. Un modèle local tourne sur votre machine : le texte reste chez vous, mais il faut le matériel et il peut être plus lent.
Une tâche au texte privé peut devoir rester locale. La règle devient alors : le moins cher, parmi ceux qui sont permis.
Pour aller plus loin : chiffrer votre tâche
Changez la tâche du script des coûts en une que vous construiriez. Dites combien de jetons entrent et sortent, et combien de temps une personne attend. Lancez-le.
Écrivez quel modèle vous choisiriez et quel critère a décidé. Dites ce que vous testeriez ensuite avant de croire ce choix.