Chunking : découper vos documents pour un RAG fiable
Le chunking consiste à découper vos documents en morceaux avant de les ranger dans la base d’un RAG : au moment de répondre, l’IA ne retrouvera que ces morceaux. Pour votre client, un mauvais découpage donne un assistant qui cite une procédure tronquée ou une liste sans son titre, et qui se trompe sans que personne ne sache pourquoi. Voici les méthodes de chunking et leurs réglages, avec la démonstration de ma masterclass RAG : un même document découpé dans n8n tous les 1 000 caractères, puis par section.
Chunking : pourquoi découper un document pour un RAG
En psychologie, le chunking est une technique de mémorisation. Ici, c’est le découpage des documents pour un RAG, la base de connaissances d’un agent IA. Le fonctionnement complet est dans l’article sur le RAG.
Quand quelqu’un pose une question, la base renvoie au modèle quelques morceaux, 4 dans ma masterclass. Le modèle ne voit rien d’autre. Le découpage décide donc de ce qu’il lit.
- Un morceau trop gros mélange plusieurs sujets. Son vecteur devient flou, il remonte mal, et il coûte des tokens à chaque question.
- Un morceau trop petit perd son contexte. Une ligne « plafond : 50 € » ne dit plus de quoi elle est le plafond.
Le bon morceau tient une idée entière, avec ce qu’il faut pour la comprendre seule.
Ce que donne un découpage tous les 1 000 caractères
Dans la masterclass, la procédure financière d’une entreprise fictive, Technosphère Solution, passe dans n8n. Le texte est converti en Markdown, puis coupé par le Recursive Character Text Splitter tous les 1 000 caractères. Résultat : 33 morceaux dans Supabase.
En ouvrant le premier, on voit le problème. Il se termine par le titre « Table des matières ». La table elle-même ouvre le morceau suivant, sans son titre. Le modèle qui reçoit ce deuxième morceau lit une liste, sans savoir ce qu’elle est.
Avec 4 documents, cela ne change aucune réponse, et c’est le piège : un test sur peu de données ne montre rien. Sur des milliers de documents, ces coupures produisent des erreurs, et personne ne pense à regarder le découpage.
C’est pourtant le réglage par défaut. Dans n8n, le Default Data Loader en mode Simple utilise le Recursive Character Text Splitter avec 1 000 caractères et 200 de chevauchement. Le récursif essaie de couper entre deux paragraphes, puis entre deux lignes, puis entre deux mots. Réglé ainsi, il ne connaît pas les sections.
Les 6 méthodes de chunking, de la plus simple à la plus fine
| Méthode | Comment elle coupe | Quand la prendre | Ce qu’elle coûte |
|---|---|---|---|
| Taille fixe | Tous les N caractères ou tokens, avec un chevauchement | Corpus hétérogène, premier essai | Rien |
| Récursive | Par paragraphes, puis lignes, puis mots, pour rester sous N | Le défaut de n8n, la plupart des textes | Rien |
| Par structure | Une section par morceau, d’après les titres Markdown ou HTML | Procédures, documentation, contrats, tout document titré | Un nœud Code, ou une option du splitter |
| Sémantique | Compare les phrases voisines par embedding et coupe quand le sujet change | Textes longs sans titres : transcriptions, emails | Un embedding par phrase |
| Agentique | Un modèle de langage choisit les coupures et ajoute un titre ou un résumé | Documents mal structurés ; encore exploratoire selon IBM | Un appel au modèle par document |
| Contextuelle | Garde le découpage et colle devant chaque morceau 50 à 100 tokens de contexte | Grosses bases où une erreur coûte cher | 1,02 $ par million de tokens de documents (Anthropic) |
Pour les documents d’une PME, presque toujours titrés, je commence par la structure. La méthode contextuelle vient ensuite, en plus : c’est la troisième technique de la masterclass RAG, avec ses chiffres.
Etalab a publié en février 2025 le test d’une autre variante, sur des fiches de service-public.fr : chaque morceau enrichi de questions qu’il pourrait recevoir et de mots-clés. Avec le modèle d’embedding E5, le bon morceau arrivait dans les 5 premiers dans 95,1 % des cas.
Les réglages : taille, chevauchement, nombre de morceaux
La taille
n8n part de 1 000 caractères. Dans la masterclass, les sections font de 400 à 1 000 caractères, et 1 400 une fois le contexte ajouté. Pinecone conseille de tester 128 ou 256 tokens pour des réponses précises, 512 ou 1 024 pour garder plus de contexte. Anthropic part de morceaux de 800 tokens pour chiffrer le coût de sa méthode. La bonne taille est celle qui marche sur les questions du client.
L’unité
Les splitters Character et Recursive Character de n8n comptent en caractères. Le Token Splitter compte en tokens, l’unité que facture le modèle.
Le chevauchement
Les 200 caractères du mode Simple de n8n répètent la fin d’un morceau au début du suivant, pour ne pas perdre une idée coupée en deux. Comptez 10 à 20 % de la taille. Le nœud Recursive Character Text Splitter, lui, part de 0 : réglez-le. Avec un découpage par section, la coupure tombe sur un titre, et le chevauchement sert moins.
Le nombre de morceaux renvoyés
J’en demande 4 au départ. Avec un rerank, la base en renvoie 20 et le modèle de rerank garde les 4 meilleurs ; Anthropic a trouvé que 20 était le meilleur réglage de ses tests. Chaque morceau de plus allonge le prompt.
Les métadonnées
Chaque morceau porte l’identifiant de son document. C’est lui qui permet d’effacer les anciens morceaux quand le document change, et de filtrer ce que chaque agent a le droit de lire.
Le découpage par section dans n8n, pas à pas
Dans la vidéo, la seule modification du workflow est un nœud Code, écrit par Claude, placé entre le nœud Markdown et le Supabase Vector Store. Voici une version courte, testée, à coller dans un nœud Code en mode « Run Once for All Items » :
const MIN = 400; // une section plus courte rejoint la suivante
const MAX = 1000; // une section plus longue se coupe par paragraphes
// L’identifiant du Google Doc, repris du nœud Edit Fields (mettez le nom exact du vôtre)
const idFichier = $('Edit Fields').first().json.id_fichier;
const morceaux = [];
let courant = '';
const ranger = () => {
if (courant.trim()) morceaux.push({ json: { texte: courant.trim(), id_fichier: idFichier } });
courant = '';
};
const ajouter = (bloc) => { courant = courant ? courant + '\n\n' + bloc : bloc; };
for (const item of $input.all()) {
for (const brut of item.json.data.split(/\n(?=#{1,3} )/)) {
const section = brut.trim();
if (section.length <= MAX) {
if ((courant + '\n\n' + section).length > MAX) ranger();
ajouter(section);
if (courant.length >= MIN) ranger();
continue;
}
// Section trop longue : on la coupe par paragraphes, chaque morceau garde le titre
ranger();
const blocs = section.split(/\n\n+/);
const titre = blocs[0].startsWith('#') ? blocs.shift() : '';
ajouter(titre);
for (const bloc of blocs) {
if (courant !== titre && (courant + '\n\n' + bloc).length > MAX) { ranger(); ajouter(titre); }
ajouter(bloc);
}
ranger();
}
ranger();
}
return morceaux;
Ce qu’il fait :
- Il coupe avant chaque titre de niveau 1 à 3. Le titre reste en tête de sa section.
- Une section de moins de 400 caractères rejoint la suivante, tant que l’ensemble ne dépasse pas 1 000.
- Une section de plus de 1 000 caractères se coupe entre deux paragraphes, et chaque morceau repart avec le titre de la section.
- Il attend le texte dans le champ
data, celui que remplit le nœud Markdown. L’identifiant vient du nœud Edit Fields, parce qu’Extract from File ne garde que le texte. Comme la boucle traite un fichier à la fois,first()désigne bien le fichier en cours.
Dans le Default Data Loader, choisissez le type JSON, le mode Load Specific Data avec {{ $json.texte }}, et la métadonnée id_fichier avec {{ $json.id_fichier }}. Gardez le découpage Simple : les morceaux de moins de 1 000 caractères passent tels quels, et un paragraphe isolé plus long, rare, sera recoupé par le splitter.
Dans la vidéo, la procédure financière donne 49 morceaux au lieu de 33, et presque tous commencent par un titre de section. Pas tous : un découpage par titres dépend de la façon dont le document a été écrit.
Sans code, une alternative existe. Remplacez le mode Simple du Default Data Loader par un Recursive Character Text Splitter, et ajoutez son option Split Code réglée sur Markdown. Il coupe alors d’abord avant les titres de niveau 2 et plus, et chaque titre reste avec son texte. Deux différences avec le code : il regroupe plusieurs sections tant qu’elles tiennent dans la taille, et il ne remet pas le titre en tête des morceaux d’une longue section. Testez les deux sur vos documents.
Tester son découpage avant de livrer
Puisqu’un test sur 4 documents ne montre rien, testez sur la base du client, avec ses questions :
- Demandez au client 20 à 30 questions réelles, celles qu’on lui pose chaque semaine, avec le document qui contient la réponse.
- Pour chaque question, regardez dans l’exécution n8n les morceaux renvoyés par la base. Le bon passage y est-il, entier ?
- Comptez. Puis changez un seul réglage (la méthode, la taille ou le chevauchement), réindexez dans une seconde table, et rejouez les mêmes questions.
C’est la méthode que recommande Pinecone : indexer plusieurs tailles, lancer des requêtes représentatives, comparer. Quand le découpage est bon, l’étape suivante est le contexte ajouté à chaque morceau, puis le rerank, tous deux montrés dans la masterclass RAG. Si votre client n’a pas encore d’assistant, partez de l’agent IA dans n8n.
Ce que vous pouvez vendre avec ça
À qui : une entreprise qui a déjà un assistant sur ses documents et qui n’en est pas contente. Une ESN où le chatbot interne répond à côté, un éditeur de logiciel dont l’assistant de support cite des bouts de documentation coupés, un cabinet dont l’outil confond deux versions d’une même procédure.
Ce que vous livrez : un audit du découpage sur 30 vraies questions, qui compte combien de fois le bon passage est retrouvé. Ensuite, vous réindexez les documents par section dans le workflow n8n du client, avec l’identifiant du document sur chaque morceau et la suppression des anciennes versions. Pour finir, vous relancez le même test : le client voit deux scores sur les mêmes questions.
Comment le présenter : « Sur vos 30 questions, je compte combien de fois votre assistant trouve le bon passage. Je redécoupe vos documents, puis je vous montre le nouveau score. » Les questions viennent du client : il ne contestera pas le résultat.


