À quelle fréquence une réponse invente-t-elle des faits ?
Une hallucination est une affirmation, dans une réponse, que sa source ne soutient pas. Un assistant qui dit qu’une bibliothèque ouvre à 8 heures alors qu’elle ouvre à 9 heures a halluciné.
Pour agir, on le mesure sous forme de taux, et on dit à quel point on est sûr de ce taux.
À la fin de cette leçon
Remarque
Je peux mesurer à quelle fréquence une réponse dit ce que sa source ne dit pas.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Affirmation | un fait énoncé dans une réponse |
| Source | le texte sur lequel la réponse doit s’appuyer |
| Non soutenue | une affirmation que la source ne confirme pas |
| Taux | les affirmations non soutenues, en part de toutes les affirmations |
| Intervalle | la plage où le vrai taux peut se trouver |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Vérifiez chaque affirmation contre la source
Coupez une réponse en affirmations, un fait chacune. Pour chaque affirmation, demandez si la source la dit.
Une première passe simple utilise des mots clés. Une affirmation est soutenue quand chaque mot clé dont elle dépend est dans la source. Elle ne l’est pas quand il en manque un.
Exemple détaillé : quatre affirmations, une source
| Affirmation | Mots clés | Dans la source ? | Verdict |
|---|---|---|---|
| Elle ouvre à 9 heures | ouvre, 9 | Les deux | Soutenue |
| Elle a 20 ordinateurs | ordinateurs, 20 | 20 manque | Non soutenue |
| Un retard coûte 25 centimes par jour | 25, centimes, jour | Tous | Soutenue |
| Elle ouvre le dimanche | dimanches | Manque | Non soutenue |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le taux est un compte sur un compte
Comptez les affirmations non soutenues. Divisez par toutes les affirmations et écrivez le résultat en pourcentage. Trois non soutenues sur huit font 37,5 %.
Comptez des affirmations, pas des réponses. Une réponse de cinq affirmations dont une est fausse fait une mauvaise affirmation sur cinq.
Rééchantillonnez pour voir si le taux est fragile
Écrivez les 40 affirmations en 0 pour soutenue et 1 pour non soutenue. Tirez 40 fois dans cette liste, en remettant chaque valeur après l’avoir tirée. Comptez les uns.
Recommencez 200 fois et triez les comptes. Le 6e et le 195e marquent la plage. Une graine fixe fait se répéter les tirages.
Exemple détaillé : 6 non soutenues sur 40
| Étape | Résultat |
|---|---|
| Affirmations et non soutenues | 40 et 6 |
| Taux | 15 % |
| Plus bas compte trié de la plage | 2, soit 5 % |
| Plus haut compte trié de la plage | 10, soit 25 % |
| Ce qu’il faut annoncer | 15 %, plage de 5 à 25 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur courante
Attention
Beaucoup pensent que 6 non soutenues sur 40 donnent un vrai taux d’exactement 15 %. C’est seulement ce que montre cet échantillon. Quarante autres affirmations pourraient donner 10 ou 20. Annoncez le taux avec son intervalle.
É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 taux et l’intervalle, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const source = \"La bibliothèque du Port ouvre à 9 heures et ferme à 17 heures en semaine. Elle compte 12 ordinateurs. Les adhérents peuvent emprunter 6 livres pour 3 semaines. Un retard coûte 25 centimes par jour.\";' 'const connus = source.toLowerCase().split(\".\").join(\" \").split(\" \");' 'const affirmations = [' ' \"ouvre 9\", \"ferme 17\", \"ordinateurs 12\", \"ordinateurs 20\",' ' \"emprunter 6 livres\", \"semaines 4\", \"25 centimes jour\", \"dimanches\",' '].map(function (a) { return a.split(\" \"); });' > taux.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 taux et l’intervalle, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function soutenue(besoins) {' ' return besoins.every(function (m) { return connus.indexOf(m) >= 0; });' '}' 'const fausses = affirmations.filter(function (a) { return soutenue(a) === false; });' 'const drapeaux = \"0001000001000001000000100000100000010000\".split(\"\").map(Number);' >> taux.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 taux et l’intervalle, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function intervalle(liste, graine) {' ' const n = liste.length;' ' const comptes = [];' ' let s = graine;' ' for (let t = 0; t < 200; t++) {' ' let total = 0;' ' for (let k = 0; k < n; k++) { s = (s * 16807) % 2147483647; total += liste[s % n]; }' ' comptes.push(total);' ' }' ' comptes.sort(function (a, b) { return a - b; });' ' return [comptes[5] * 100 / n, comptes[194] * 100 / n];' '}' >> taux.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 taux et l’intervalle, partie 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"non soutenues : \" + fausses.length + \" sur \" + affirmations.length + \" (\" + (fausses.length * 100 / affirmations.length) + \" pour cent)\");' ' const uns = drapeaux.filter(function (d) { return d === 1; }).length;' ' const marge = intervalle(drapeaux, 12345);' ' console.log(\"plus grand test : \" + uns + \" sur \" + drapeaux.length + \" = \" + (uns * 100 / drapeaux.length) + \" pour cent\");' ' console.log(\"intervalle : \" + marge[0] + \" à \" + marge[1] + \" pour cent\");' >> taux.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 taux et l’intervalle, partie 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' const q = \"La source dit que la bibliothèque ouvre à 9 heures. L’affirmation « elle ouvre à 8 heures » est-elle soutenue ? Une phrase courte.\";' ' const echantillon = \"Non, la source dit qu’elle ouvre à 9 heures, donc l’affirmation n’est pas soutenue.\";' ' const reponse = await demander([{ role: \"user\", content: q }], echantillon, 60);' ' console.log(\"le modèle dit : \" + reponse.texte);' '}' 'main();' >> taux.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 taux et l’intervalle
docker exec -w /home/node/project agent node taux.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 |
|---|---|
| non soutenues : 3 sur 8 (37.5 pour cent) | Le contrôle par mots clés sur huit affirmations |
| plus grand test : 6 sur 40 = 15 pour cent | Une liste enregistrée de 40 affirmations |
| intervalle : 5 à 25 pour cent | La plage rééchantillonnée |
| le modèle dit : ... | Une vraie vérification du labo. Un échantillon enregistré si aucun modèle ne répond |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.