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 la recherche avec un taux de réussite

Après cette leçon: Je peux trouver les morceaux qui répondent à une question et dire si j’ai bien réussi.

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

Il a trouvé quelque chose, mais était-ce juste ?

La recherche (retrieval en anglais) consiste à trouver les morceaux qui répondent à une question. La mesurer, c’est poser des questions dont vous connaissez la réponse et compter combien de fois le bon morceau revient.

Le site d’une médiathèque affiche toujours trois résultats. L’équipe trouve que cela marche bien. Personne n’a compté. Sans comptage, impossible de savoir si un changement a aidé ou nui.

À la fin de cette leçon

Remarque

Je peux trouver les morceaux qui répondent à une question et dire si j’ai bien réussi.

Mots-clés

MotCe que ça veut direExemple
Chercheurle code qui trouve des morceaux pour une question
Réussitele bon morceau est revenu
Taux de réussitela part des questions réussies80 %
Cas de testune question dont le morceau source est connu
Score minimalle plus petit score qui vaut d’être rendu0.3

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un cas de test a une source connue

Écrivez des questions et, pour chacune, l’id du morceau qui contient la réponse. Lancez le chercheur sur chaque question. Une réussite, c’est le bon id parmi les morceaux rendus.

Le taux de réussite est le nombre de réussites divisé par le nombre de questions. Quatre réussites sur cinq questions font un taux de 80 %.

Certaines questions n’ont pas de réponse

Les visiteurs posent des questions que les documents ne couvrent pas. Pour elles, le bon résultat est rien. Si le chercheur rend son morceau le moins mauvais, une étape suivante peut bâtir une réponse sur un mauvais texte.

Un score minimal aide. Ne rendez un morceau que si son score atteint le minimum. Sinon, rendez une liste vide.

Exemple travaillé : cinq cas de test

Question surAttenduTrouvéRésultat
L’heure d’ouverturehoraireshorairesRéussi
L’amenderetardssallesRaté
Le bibliothécaireaucunrienRéussi
Le parkingaucunsallesRaté
Réserver une sallesallessallesRéussi

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Noter un chercheur dans un script

Le script suivant reconstruit la base de la médiathèque de la leçon 3, avec les mêmes vecteurs de comptes. Il ajoute un score minimal de 0,3 et rend au plus un morceau.

Il lance ensuite cinq cas de test, dont un sans réponse, et affiche chaque résultat et le taux de réussite.

Écrire le script de notation, partie 1

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const vocabulaire = [\"ouvre\", \"ferme\", \"samedi\", \"dimanche\", \"emprunter\", \"livre\", \"retard\", \"amende\", \"salle\", \"médiathèque\", \"vendredi\", \"semaine\"];' 'const morceaux = [' '  { id: \"horaires-semaine\", texte: \"La médiathèque ouvre à 9 h et ferme à 18 h du lundi au vendredi.\" },' '  { id: \"horaires-weekend\", texte: \"Le samedi, la médiathèque ouvre à 10 h et ferme à 14 h. Elle est fermée le dimanche.\" },' '  { id: \"emprunt\", texte: \"Vous pouvez emprunter 8 livres pour 3 semaines. Vous pouvez prolonger un livre deux fois en ligne.\" },' '  { id: \"retards\", texte: \"Un livre rendu en retard coûte 20 centimes par jour. L’amende s’arrête à 10 euros.\" },' '  { id: \"salles\", texte: \"Une salle d’étude accueille 6 personnes. Réservez une salle à l’accueil ou en ligne pour 2 heures.\" },' '];' > note.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 notation, partie 2

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function racine(mot) { return mot.length > 3 && mot.endsWith(\"s\") ? mot.slice(0, -1) : mot; }' 'function vecteurDe(texte) {' '  const mots = texte.toLowerCase().replace(/[^a-z0-9àâçéèêëîïôûù ]/g, \" \").split(\" \").filter(function (m) { return m.length > 0; }).map(racine);' '  return vocabulaire.map(function (terme) {' '    return mots.filter(function (mot) { return mot === terme; }).length;' '  });' '}' 'function cosinus(a, b) {' '  let dot = 0, sa = 0, sb = 0;' '  for (let i = 0; i < a.length; i++) { dot += a[i] * b[i]; sa += a[i] * a[i]; sb += b[i] * b[i]; }' '  return sa === 0 || sb === 0 ? 0 : dot / Math.sqrt(sa * sb);' '}' 'const base = morceaux.map(function (m) { return { id: m.id, vecteur: vecteurDe(m.texte) }; });' 'const MINIMUM = 0.3;' >> note.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 notation, partie 3

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function chercher(question) {' '  const requete = vecteurDe(question);' '  let meilleur = { id: \"\", score: 0 };' '  base.forEach(function (element) {' '    const score = cosinus(requete, element.vecteur);' '    if (score > meilleur.score) meilleur = { id: element.id, score: score };' '  });' '  return meilleur.score >= MINIMUM ? [meilleur.id] : [];' '}' >> note.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 notation, partie 4

Commande
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const cas = [' '  { question: \"à quelle heure ouvre la médiathèque le samedi\", attendu: \"horaires-weekend\" },' '  { question: \"combien de livres puis-je emprunter\", attendu: \"emprunt\" },' '  { question: \"combien coûte un retard\", attendu: \"retards\" },' '  { question: \"puis-je réserver une salle\", attendu: \"salles\" },' '  { question: \"qui est le bibliothécaire\", attendu: null },' '];' 'let reussis = 0;' 'cas.forEach(function (un) {' '  const trouves = chercher(un.question);' '  const ok = un.attendu === null ? trouves.length === 0 : trouves.indexOf(un.attendu) >= 0;' '  if (ok) reussis = reussis + 1;' '  console.log((ok ? \"TROUVÉ \" : \"RATÉ   \") + un.question + \" -> \" + (trouves.join(\" \") || \"rien\"));' '});' 'console.log(\"Taux de réussite :\", reussis, \"sur\", cas.length);' >> note.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 script et lire le taux

Commande
docker exec -w /home/node/project agent node note.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 qu’il affiche

LigneCe qu’elle montre
TROUVÉ à quelle heure ouvre la médiathèque le samedi -> horaires-weekendLe bon morceau
TROUVÉ qui est le bibliothécaire -> rienRien trouvé, et c’est juste
Taux de réussite : 5 sur 5Chaque cas est réussi

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une erreur fréquente

Attention

Beaucoup de gens croient que la recherche marche si elle rend toujours quelque chose. Pour une question que les documents ne couvrent pas, rendre quelque chose est un échec. Comptez aussi ces questions, et donnez au chercheur un moyen de dire rien.

À 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.