1000 le nombre magique dans le monde des LLM
Posté le 26 mars 2025 • 4 min de lecture • 676 motsTravailler efficacement avec des modèles de langage de grande taille (LLMs) implique plus qu'un simple prompt. Lorsqu'on construit un pipeline RAG (Retrieval-Augmented Generation) ou qu'on intègre des documents dans un système basé sur des LLMs, le découpage du texte en chunks devient un levier de performance critique.

La valeur par défaut de 1000 tokens par chunk n’est pas arbitraire :
Certains cas nécessitent des tailles différentes :
Il est important de noter que la découpe n’est pas toujours strictement exacte. En effet, les outils cherchent à préserver la cohérence sémantique du contenu en priorisant les découpes sur des séparateurs logiques (paragraphe, phrase, mot). Certains morceaux peuvent dépasser légèrement la limite fixée, par exemple atteindre 1080 tokens, si cela permet de ne pas casser une phrase ou une idée en plein milieu. Cette tolérance est volontaire : elle permet de générer des morceaux plus naturels, plus compréhensibles et plus efficaces en contexte pour les modèles de langage. En revanche, cela reste maîtrisé, et les variations dépassent rarement quelques dizaines de tokens.
Des modèles comme GPT-4 Turbo ou Gemini 1.5 peuvent accepter jusqu’à 1 million de tokens en entrée. Cela ne signifie pas qu’il est judicieux d’y injecter un document entier non filtré.
Deux raisons majeures :
Un bon découpage permet donc de réduire la charge et d’augmenter la précision.
Il est préférable de fournir moins d’information, mais plus ciblée, en sélectionnant les chunks les plus pertinents pour la question posée.
Cela suppose généralement :
top-k) avant injection dans la fenêtre contextuelle du modèle. Au lieu de garder tous les résultats, on prend uniquement les k meilleurs chunks (les plus similaires à la question). C’est ce qu’on appelle le top-k retrieval.
Exemple : k = 5 → on garde les 5 chunks les plus pertinents.Lorsque le découpage est fait sans chevauchement (chunk_overlap = 0), les chunks n’ont aucun lien direct entre eux. Cela peut poser problème si une information cruciale se trouve à la frontière entre deux morceaux.
Dans ce cas, un overlap de 200 tokens est souvent recommandé. Il permet :
Cette configuration est supportée dans tous les outils de prétraitement modernes comme LangChain, LlamaIndex, ou Haystack.
| Élément | Recommandation par défaut |
|---|---|
| Taille du chunk | ~1000 tokens (avec tolérance contrôlée) |
| Filtrage avant injection | Oui, via vector search ou hybrid search |
| Chevauchement | 200 tokens |
| Pertinence contextuelle | Prioritaire sur la quantité |
| Fenêtre contextuelle | Utiliser uniquement la partie utile |
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # découpe en morceaux de 1000 caractères
chunk_overlap=200, # chaque chunk partage 200 caractères
separators=["\n\n", "\n", ".", "!", "?", ",", " ", ""], # permet de découper de façon plus intelligente en respectant la structure du texte (paragraphes, phrases, etc.)
length_function=len # pour compter les caractères
)Les bonnes pratiques ont un usage général. Il vous faudra adapter ces indications à votre projet.
Découper intelligemment, filtrer agressivement, et chevaucher prudemment. Ce sont des leviers techniques simples mais puissants pour améliorer la performance et la robustesse de vos intégrations LLM.