Une fonction photo qui coûte trop cher
Une équipe ajoute « interroge votre photo » à une appli. En une semaine, la facture est élevée, une personne aveugle ne peut pas s’en servir, et quelqu’un demande pourquoi un visage est gardé trois mois.
Les images, les pages et le son coûtent plus que le texte, peuvent laisser des gens de côté et peuvent contenir des données personnelles. Prévoyez les trois.
À la fin de cette leçon
Remarque
Je peux chiffrer une journée d’entrées image, page et son et signaler celles qui demandent du soin.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Texte alternatif | des mots qui remplacent une image pour qui ne peut pas la voir |
| Transcription | les mots d’un son, écrits |
| Donnée personnelle | un fait qui peut identifier une personne, comme un visage ou une voix |
| Conservation | la durée pendant laquelle on garde des données |
| Budget | le maximum qu’on prévoit de dépenser |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le prix suit la taille de l’entrée
Le texte se paie en jetons (voir le module sur le coût et le traçage). Une image se paie en tuiles, une page en pages et un son en secondes.
Dans cette leçon, chaque requête coûte 1. Une image ajoute 20 et 10 par tuile, une page ajoute 5 chacune, et le son ajoute 2 par tranche de 10 secondes. Ce sont des unités inventées. Lisez toujours une vraie grille de prix.
Le prix de quatre entrées
| Entrée | Taille | Calcul | Coût |
|---|---|---|---|
| Image | 6 tuiles | 1 + 20 + 60 | 81 |
| Page | 4 pages | 1 + 20 | 21 |
| Audio | 25 secondes | 1 + 2 x 3 | 7 |
| Audio | 10 secondes | 1 + 2 x 1 | 3 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Accès : qui la fonction laisse-t-elle de côté ?
Une personne qui ne peut pas voir une image a besoin d’un texte alternatif. Une personne qui ne peut pas entendre un son a besoin d’une transcription. Si une fonction ne donne ni l’un ni l’autre, elle laisse ces personnes de côté.
Un modèle sait souvent écrire les deux. Mais une personne doit les vérifier, comme l’a montré la leçon précédente. Prévoyez que les mots existent avant de garder une image ou un son.
Une erreur courante
Attention
Beaucoup pensent qu’un visage ou une voix n’est une donnée personnelle que si la personne est nommée. Un visage ou une voix peut identifier quelqu’un même sans nom à côté. Traitez les deux comme des données personnelles et ne les gardez pas plus longtemps que nécessaire.
É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 script de prix, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const elements = [' ' { id: 1, genre: \"image\", tuiles: 6, alt: true, visage: false, voix: false, jours: 7 },' ' { id: 2, genre: \"image\", tuiles: 16, alt: false, visage: true, voix: false, jours: 90 },' ' { id: 3, genre: \"page\", pages: 4, alt: true, visage: false, voix: false, jours: 30 },' ' { id: 4, genre: \"audio\", secondes: 25, alt: false, visage: false, voix: true, jours: 31 },' '];' > cout6.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 script de prix, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function prix(e) {' ' if (e.genre === \"image\") return 1 + 20 + 10 * e.tuiles;' ' if (e.genre === \"page\") return 1 + 5 * e.pages;' ' if (e.genre === \"audio\") return 1 + 2 * Math.ceil(e.secondes / 10);' ' return 1;' '}' >> cout6.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 script de prix, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function alertes(e) {' ' const sortie = [];' ' if (e.visage) sortie.push(\"visage\");' ' if (e.voix) sortie.push(\"voix\");' ' if (e.alt === false && e.genre === \"image\") sortie.push(\"sans texte alternatif\");' ' if (e.alt === false && e.genre === \"audio\") sortie.push(\"sans transcription\");' ' if (e.jours > 30) sortie.push(\"gardé trop longtemps\");' ' return sortie;' '}' >> cout6.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 script de prix, partie 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' let total = 0;' ' for (const e of elements) {' ' total += prix(e);' ' console.log(e.id + \" \" + e.genre + \" : coût \" + prix(e) + \", alertes \" + JSON.stringify(alertes(e)));' ' }' ' console.log(\"total \" + total);' ' const q = \"Écrivez un avis court qui prévient les utilisateurs que leurs messages vocaux sont supprimés après 30 jours.\";' ' const reponse = await demander([{ role: \"user\", content: q }], \"Vos messages vocaux sont supprimés après 30 jours.\", 40);' ' console.log(\"réponse : \" + reponse.texte);' '}' 'main();' >> cout6.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.
Chiffrer une journée et signaler
docker exec -w /home/node/project agent node cout6.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.
Les lignes affichées
| Ligne | Ce qu’elle montre |
|---|---|
| 1 image : coût 81, alertes [] | Une entrée sans souci : vue, de courte durée |
| 2 image : coût 181 ... | Un visage, sans texte alternatif, gardé 90 jours |
| 4 audio : coût 7 ... | Une voix, sans transcription, gardée 31 jours |
| total 290 | Les quatre prix additionnés |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.