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
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Chercheur | le code qui trouve des morceaux pour une question | |
| Réussite | le bon morceau est revenu | |
| Taux de réussite | la part des questions réussies | 80 % |
| Cas de test | une question dont le morceau source est connu | |
| Score minimal | le plus petit score qui vaut d’être rendu | 0.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 sur | Attendu | Trouvé | Résultat |
|---|---|---|---|
| L’heure d’ouverture | horaires | horaires | Réussi |
| L’amende | retards | salles | Raté |
| Le bibliothécaire | aucun | rien | Réussi |
| Le parking | aucun | salles | Raté |
| Réserver une salle | salles | salles | Ré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
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
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
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
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
docker exec -w /home/node/project agent node note.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 qu’il affiche
| Ligne | Ce qu’elle montre |
|---|---|
| TROUVÉ à quelle heure ouvre la médiathèque le samedi -> horaires-weekend | Le bon morceau |
| TROUVÉ qui est le bibliothécaire -> rien | Rien trouvé, et c’est juste |
| Taux de réussite : 5 sur 5 | Chaque 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.