Une ligne sans son en-tête
Découper un document, c’est le couper en morceaux que la recherche pourra rendre. Un bon morceau reste trouvable et compréhensible seul. C’est important parce qu’une recherche rend des morceaux, et qu’un morceau qui a perdu son titre ou l’en-tête de son tableau ne dit rien.
Un tableau de frais est coupé ligne par ligne. La ligne « grand, 5 euros » est rendue pour « combien coûte un grand colis ». Elle ne dit pas à quoi correspondent les 5 euros.
À la fin de cette leçon
Remarque
Je peux couper un document structuré pour que chaque morceau garde son titre, l’en-tête de son tableau et sa source.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Morceau | une partie d’un document qui est indexée |
| Chemin des titres | les titres au-dessus d’un morceau, du haut vers le bas |
| Métadonnées | des faits gardés à côté d’un morceau, comme sa source |
| En-tête de tableau | la première ligne, qui nomme chaque colonne |
| Fil d’Ariane | un chemin de titres écrit sur une seule ligne |
| Morceau orphelin | un morceau qui ne veut rien dire sans son contexte |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Gardez le chemin des titres avec chaque morceau
On peut couper un document par taille ou aux titres. Il faut aussi garder les titres. Un morceau sous « Retours > Frais » doit porter ce chemin, écrit en fil d’Ariane : Manuel de la boutique > Retours > Frais.
Indexez le chemin avec le texte. Une recherche « retours frais » trouve alors le morceau même si le corps ne dit jamais « retours ».
Une ligne de tableau veut son en-tête
Un tableau est un en-tête et des lignes. Coupé ligne par ligne, chaque ligne perd l’en-tête. On transforme donc chaque ligne en mots qui le portent : « article : grand, frais : 5 euros ».
Une liste suit la même règle. Gardez la phrase qui l’introduit avec chaque élément, sinon l’élément flotte seul.
Exemple détaillé : la même ligne, avant et après
| Version | Ce qui est indexé |
|---|---|
| Coupée net | | grand | 5 euros | |
| Avec son en-tête | article : grand, frais : 5 euros |
| Avec le chemin aussi | Manuel de la boutique > Retours > Frais : article : grand, frais : 5 euros |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Métadonnées et contrôle de taille
Gardez des métadonnées à côté de chaque morceau : son fichier source, son titre, puis plus tard son propriétaire et sa date. Elles permettent à une réponse de citer d’où elle vient, et la leçon 5 s’en servira pour filtrer.
Contrôlez ensuite la taille. Une section bien plus longue que les autres contient deux idées et doit être recoupée. Signalez les titres trop longs.
Une erreur courante
Attention
Beaucoup pensent que couper tous les 500 caractères suffit pour n’importe quel document. Cette coupe traverse les tableaux et les titres, et laisse des orphelins. Coupez d’abord selon la structure, et n’utilisez la taille que pour recouper ce qui reste trop long.
Écrire le découpeur, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const doc = [' ' \"# Manuel de la boutique\",' ' \"## Horaires\",' ' \"La boutique ouvre à neuf heures en semaine.\",' ' \"## Retours\",' ' \"### Délai\",' ' \"Renvoyez un colis sous trente jours.\",' ' \"### Frais\",' ' \"| article | frais |\",' ' \"| petit | 2 euros |\",' ' \"| grand | 5 euros |\",' '];' > decoupe1.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 découpeur, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function cellules(ligne) {' ' return ligne.split(\"|\").map(function (c) { return c.trim(); }).filter(function (c) { return c.length > 0; });' '}' >> decoupe1.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 découpeur, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function morceaux(lignes, source) {' ' const chemin = [];' ' const sortie = [];' ' let entete = null;' ' lignes.forEach(function (ligne) {' ' const m = ligne.match(/^(#+) (.*)/);' ' if (m) {' ' chemin.length = m[1].length - 1;' ' chemin.push(m[2]);' ' sortie.push({ source: source, titre: chemin.join(\" > \"), lignes: [] });' ' entete = null;' ' return;' ' }' >> decoupe1.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 découpeur, partie 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' const actuel = sortie[sortie.length - 1];' ' if (ligne.startsWith(\"|\") === false) { actuel.lignes.push(ligne); return; }' ' const c = cellules(ligne);' ' if (entete === null) { entete = c; return; }' ' actuel.lignes.push(entete.map(function (h, i) { return h + \" : \" + c[i]; }).join(\", \"));' ' });' ' return sortie;' '}' >> decoupe1.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 découpeur, partie 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'console.log(\"Une ligne de tableau isolée :\", doc[9]);' 'morceaux(doc, \"manuel.md\").filter(function (c) { return c.lignes.length > 0; }).forEach(function (c) {' ' console.log(c.source + \" | \" + c.titre + \" | \" + c.lignes.join(\" / \"));' '});' >> decoupe1.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 et lire les morceaux
docker exec -w /home/node/project agent node decoupe1.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.
Ceci est une maquette
Le Run lit dix lignes d’un Markdown inventé. Un vrai document peut être un PDF, une page web ou un tableur, et demande un analyseur pour chacun. L’idée reste la même : trouver la structure, puis la garder.
Le Run n’appelle aucun modèle.
Ce que le Run affiche
| Morceau | Texte gardé |
|---|---|
| Manuel de la boutique > Horaires | La boutique ouvre à neuf heures en semaine. |
| Manuel de la boutique > Retours > Délai | Renvoyez un colis sous trente jours. |
| Manuel de la boutique > Retours > Frais | article : petit, frais : 2 euros / article : grand, frais : 5 euros |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.