Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Mesurer un taux d’hallucination

Après cette leçon: Je peux mesurer à quelle fréquence une réponse dit ce que sa source ne dit pas.

Leçon de 70 min8 commandesLab agent de code IA : utiliser opencode pour expliquer et corriger du code, et vérifier son travail

À 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

MotCe que ça veut dire
Affirmationun fait énoncé dans une réponse
Sourcele texte sur lequel la réponse doit s’appuyer
Non soutenueune affirmation que la source ne confirme pas
Tauxles affirmations non soutenues, en part de toutes les affirmations
Intervallela 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

AffirmationMots clésDans la source ?Verdict
Elle ouvre à 9 heuresouvre, 9Les deuxSoutenue
Elle a 20 ordinateursordinateurs, 2020 manqueNon soutenue
Un retard coûte 25 centimes par jour25, centimes, jourTousSoutenue
Elle ouvre le dimanchedimanchesManqueNon 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

ÉtapeRésultat
Affirmations et non soutenues40 et 6
Taux15 %
Plus bas compte trié de la plage2, soit 5 %
Plus haut compte trié de la plage10, soit 25 %
Ce qu’il faut annoncer15 %, 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

Commande
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

Commande
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

Commande
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

Commande
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

Commande
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

Commande
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

Commande
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

Commande
docker exec -w /home/node/project agent node 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.

Ce que le Run affiche

LigneCe 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 centUne liste enregistrée de 40 affirmations
intervalle : 5 à 25 pour centLa 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.

À propos de ce labo et de sa source: Lab agent de code IA : utiliser opencode pour expliquer et corriger du code, et vérifier son travail

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.