Juste, et pourtant inutile
Une fonction de banque donne une réponse correcte, en un long paragraphe de mots difficiles. Un client lit lentement. Un autre utilise un lecteur d’écran. Un troisième a un mauvais réseau et attend dix secondes.
Une bonne réponse qu’une personne ne peut pas utiliser reste un échec. L’accessibilité fait partie de la qualité d’une fonction.
À la fin de cette leçon
Remarque
Je peux rendre une fonction d’IA utilisable par des gens aux besoins différents.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Lecteur d’écran | un logiciel qui lit une page à voix haute | |
| Langage simple | des phrases courtes et des mots de tous les jours | |
| Jargon | un mot difficile que seuls les experts connaissent | ultérieurement |
| Temps de lecture | le temps qu’il faut pour lire une réponse | |
| Autre voie | une autre façon de faire la même chose |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le langage simple se contrôle par des règles
Le langage simple n’est pas une impression. Vous pouvez fixer des règles. Aucune phrase de plus de 12 mots. Aucun mot d’une courte liste de jargon. Aucune réponse de plus de 40 mots.
On peut passer une règle sur chaque réponse enregistrée. Celles qui l’enfreignent sont celles à réécrire.
Le temps, l’attente et les autres voies
Calculez le temps de lecture : les mots fois 60, divisés par les mots par minute. Une réponse de 40 mots à 120 mots par minute prend 20 secondes. Les lecteurs lents ont besoin de plus.
Montrez une attente visible pour une réponse lente, et laissez la personne l’arrêter. Proposez une autre voie que la discussion : un bouton, un formulaire ou un numéro de téléphone.
Une erreur courante
Attention
Beaucoup pensent que l’accessibilité ne concerne que le handicap, donc qu’elle peut attendre. Elle concerne tout le monde : une personne fatiguée, un lecteur débutant, un mauvais réseau. Testez les règles sur chaque réponse et proposez une autre voie qu’une zone de discussion.
É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 contrôleur de langage simple, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const REGLES = { maxPhrase: 12, maxMots: 40, jargon: [\"subséquemment\", \"paramétrer\", \"ultérieurement\"], mpm: 120 };' 'const REPONSES = [' ' { id: \"r1\", texte: \"Appuyez sur le bouton vert. Puis choisissez une date.\" },' ' { id: \"r2\", texte: \"Vous devrez ultérieurement paramétrer le menu pour changer la date avant de confirmer.\" },' ' { id: \"r3\", texte: \"Votre commande est en route. Elle devrait arriver vendredi. Sinon, dites-le-nous et nous regarderons ce qui s’est passé.\" },' '];' > acces.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 contrôleur de langage simple, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function mots(texte) {' ' return texte.split(\" \").filter(function (m) { return m.length > 0; });' '}' 'function phrases(texte) {' ' return texte.split(\".\").map(function (p) { return p.trim(); }).filter(function (p) { return p.length > 0; });' '}' >> acces.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 contrôleur de langage simple, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function problemes(texte) {' ' const sortie = [];' ' const plus = Math.max.apply(null, phrases(texte).map(function (p) { return mots(p).length; }));' ' if (plus > REGLES.maxPhrase) sortie.push(\"phrase longue\");' ' if (mots(texte).length > REGLES.maxMots) sortie.push(\"trop long\");' ' const durs = mots(texte.toLowerCase()).filter(function (m) { return REGLES.jargon.includes(m); });' ' if (durs.length > 0) sortie.push(\"mots difficiles\");' ' return sortie;' '}' >> acces.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 contrôleur de langage simple, partie 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' for (const r of REPONSES) {' ' const secondes = Math.ceil((mots(r.texte).length * 60) / REGLES.mpm);' ' console.log(r.id + \" \" + mots(r.texte).length + \" mots, \" + secondes + \" s, \" + JSON.stringify(problemes(r.texte)));' ' }' ' const q = \"Réécrivez avec des mots simples : Vous devrez ultérieurement paramétrer le menu pour changer la date.\";' ' const reponse = await demander([{ role: \"user\", content: q }], \"Ensuite, utilisez le menu pour changer la date.\", 30);' ' console.log(\"simple : \" + reponse.texte);' '}' 'main();' >> acces.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 contrôleur de langage simple
docker exec -w /home/node/project agent node acces.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 |
|---|---|
| r1 9 mots, 5 s, [] | Court et simple : aucun problème |
| r2 13 mots, 7 s, ["phrase longue","mots difficiles"] | Une phrase longue avec deux mots difficiles |
| r3 18 mots, 9 s, [] | Sous toutes les limites : elle passe |
| simple : ... | Une phrase. Les mots changent à chaque Run |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.