Une réponse dans une longue fiche
Découper un document (en anglais chunking), c’est le couper en morceaux assez petits pour être trouvés et lus un par un. Cela compte parce que la recherche rend des morceaux entiers : leur taille décide de ce que vous recevez.
Une médiathèque a une seule fiche avec les horaires, les règles d’emprunt et les salles. Un visiteur demande les retards. La réponse tient en une phrase. Donner toute la fiche la noie.
À la fin de cette leçon
Remarque
Je peux découper un document pour que chaque morceau puisse être retrouvé.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Morceau | une partie d’un document découpé | |
| Taille | le nombre de mots d’un morceau | 8 |
| Chevauchement | les mots que partagent deux morceaux de suite | |
| Titre | une ligne qui ouvre une section | |
| Recherche | trouver les morceaux qui répondent à une question |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Pourquoi couper un document en morceaux
Un seul vecteur pour toute une fiche mélange tous les sujets en une moyenne. Une question sur les retards ne paraît alors pas plus proche de la fiche qu’une question sur les salles.
Un petit morceau parle d’une seule chose : son vecteur pointe clairement quelque part. Il est aussi assez court pour entrer plus tard dans une consigne, à côté de quelques autres.
Taille et chevauchement
Le découpage le plus simple compte les mots. Un morceau de 8 mots contient 8 mots. Le morceau suivant commence quelques mots avant la fin du précédent. Ces mots partagés forment le chevauchement.
Le chevauchement évite de couper une idée en deux. Une phrase au bord d’un morceau se retrouve aussi au début du suivant.
Exemple travaillé : chevauchement sur dix mots
| Morceau | Commence au mot | Mots |
|---|---|---|
| 1 | 1 | a b c d |
| 2 | 4 | d e f g |
| 3 | 7 | g h i j |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Couper aux titres garde une idée entière
Un nombre de mots ne sait pas où finit une idée. Un titre, si. Si le document a des titres, commencez un nouveau morceau à chacun.
Le script ci-dessous fait les deux. Il coupe la fiche de la médiathèque à ses titres, puis découpe une section par mots avec un chevauchement.
Écrire le script de découpage, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const fiche = \"# Horaires\nLa médiathèque ouvre à 9 h du lundi au vendredi. Le samedi, elle ouvre à 10 h. Elle est fermée le dimanche.\n# Emprunt\nVous pouvez emprunter 8 livres pour 3 semaines. Un retard coûte 20 centimes par jour. Vous pouvez prolonger un livre deux fois en ligne.\n# Salles d’étude\nUne salle accueille 6 personnes. Réservez à l’accueil ou en ligne. Une réservation dure 2 heures.\";' 'function parTitre(texte) {' ' const parties = [];' ' const lignes = texte.split(\"\n\");' ' for (let i = 0; i < lignes.length; i++) {' ' if (lignes[i].startsWith(\"# \")) {' ' parties.push({ titre: lignes[i].slice(2), texte: \"\" });' ' } else {' ' const derniere = parties[parties.length - 1];' ' derniere.texte = (derniere.texte + \" \" + lignes[i]).trim();' ' }' ' }' ' return parties;' '}' > decoupe.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 découpage, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function parMots(texte, taille, chevauchement) {' ' const mots = texte.split(\" \");' ' const morceaux = [];' ' let debut = 0;' ' while (debut < mots.length) {' ' morceaux.push(mots.slice(debut, debut + taille).join(\" \"));' ' if (debut + taille >= mots.length) break;' ' debut = debut + taille - chevauchement;' ' }' ' return morceaux;' '}' 'const parties = parTitre(fiche);' 'console.log(\"Par titre :\", parties.length, \"morceaux\");' 'parties.forEach(function (partie) { console.log(\"-\", partie.titre, \":\", partie.texte.split(\" \").length, \"mots\"); });' 'const morceaux = parMots(parties[1].texte, 8, 3);' 'console.log(\"Par mots, taille 8, chevauchement 3 :\", morceaux.length, \"morceaux\");' 'morceaux.forEach(function (morceau) { console.log(\"-\", morceau); });' >> decoupe.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 les morceaux
docker exec -w /home/node/project agent node decoupe.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 |
|---|---|
| Par titre : 3 morceaux | Un morceau par titre |
| - Emprunt : 24 mots | La taille du morceau du milieu |
| Par mots, taille 8, chevauchement 3 : 5 morceaux | Le texte sur l’emprunt coupé en cinq |
| - deux fois en ligne. | Ses trois premiers mots terminent aussi le morceau d’avant |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup de gens croient que les gros morceaux sont plus sûrs parce qu’ils contiennent plus. Un gros morceau n’a qu’un vecteur qui mélange plusieurs sujets, et il remplit la consigne. Prenez le plus petit morceau qui contient encore une réponse entière.