Stratégies de chunking
Le chunking — découper un document en morceaux avant de l'indexer — est le paramètre le plus sous-estimé d'un RAG. Un mauvais chunking annule l'intérêt du meilleur embedding et du meilleur LLM. Ce guide montre les 5 stratégies courantes, leurs impacts mesurables, et quand utiliser laquelle.
#Pourquoi ça compte plus que l'embedding
Changer l'embedding peut donner +5 % de pertinence. Changer de chunking peut donner +30 %. L'embedding place le chunk dans l'espace sémantique — si le chunk est mal découpé, l'espace est mal peuplé et toute la pipeline part en vrille.
#Quelle taille de chunk ?
- 200-400 tokens
- Court. Bon pour questions très précises ("quelle est la date X dans le contrat Y ?"). Risque : perd le contexte autour.
- 500-800 tokens
- Sweet spot général. Une idée développée tient, l'embedding est encore précis.
- 1000-1500 tokens
- Long. Conserve le contexte, mais dilue le signal. Utile pour des docs où les idées sont très étendues (essais, thèses).
- > 2000 tokens
- Trop. Le chunk devient un résumé flou d'un gros bloc. Préférez un chunking hiérarchique (voir plus bas).
#Recouvrement (overlap)
Le recouvrement, c'est les derniers N tokens d'un chunk qui sont répétés au début du chunk suivant. Il évite de couper en plein milieu d'une idée.
- 0 tokens
- Aucun recouvrement. Simple mais perd les idées qui chevauchent deux chunks.
- 100-200 tokens (15-25 %)
- Valeur courante. Compromis coût/qualité raisonnable.
- 300+ tokens (40 %+)
- Beaucoup de redondance. Utile pour des domaines très denses (code, texte juridique). Coût : plus de chunks à stocker.
#5 stratégies classées du pire au meilleur
#1. Par caractères fixes (le pire)
text[i:i+chunk_size]. Coupe au milieu des mots, des phrases, des idées. Ne l'utilisez que pour prototyper.
#2. Par phrases / paragraphes
Découper sur les doubles retours à la ligne (paragraphes) ou les points (phrases). Gros progrès par rapport au caractère brut.
#3. Récursif (LangChain, LlamaIndex)
Essaye d'abord de couper sur les gros délimiteurs (\n\n, \n, ., espace), en dernier recours sur le caractère. Le défaut dans la plupart des frameworks. Correct.
#4. Structure-aware (Markdown, HTML, code)
Respecte les titres, sections, listes. Un titre reste avec son paragraphe. Un bloc de code ne se coupe jamais au milieu. Gros bond qualité sur du contenu structuré.
#5. Sémantique (le meilleur, le plus cher)
On génère des embeddings par phrase, on détecte les ruptures sémantiques (distance cosinus qui dépasse un seuil), on coupe là. Qualité inégalée sur du texte libre mal structuré. Coût en CPU significatif à l'indexation.
#Implémentations
#Récursif (LlamaIndex)
#Structure-aware Markdown
#Sémantique
#Évaluer son chunking
Sans mesure, on tourne dans le noir. Protocole minimal :
- 01Jeu de 30-50 questions-réponsesQuestions que vous poseriez vraiment, réponses que vous attendez. Ne trichez pas : écrivez-les avant d'évaluer.
- 02Métrique : recall@kPour chaque question, le passage attendu est-il dans les top-k (ex : top-5) retrouvés ? Pourcentage = recall@5.
- 03A/B entre deux stratégiesIndexez votre corpus avec stratégie A puis B. Mesurez recall@5 sur les 2. L'écart est très éloquent.
- 04TunezChangez chunk_size (400 / 700 / 1000), overlap (50 / 150 / 250), et regardez la courbe.
#Pièges fréquents
- Tables coupées
- Un PDF avec tableaux : parseur par défaut casse la structure. Utilisez unstructured.io ou PyMuPDF avec extraction de tables.
- Code source dans un chunk texte
- Le markdown-aware splitter préserve les blocs ```. Sans lui, un bloc se coupe et tout est cassé.
- Documents multilingues
- Un chunk moitié français moitié anglais a un embedding moyen inutile. Séparez par langue avant.
- Chunks avec uniquement des titres
- "Section 3.2.1 — Obligations" sans le texte qui suit, c'est du bruit. Filtrez les chunks < 100 chars.
Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.