Le découpage de texte (text chunking) est l'une des étapes les plus critiques dans la construction d'un pipeline RAG (Retrieval Augmented Generation). La façon dont vous découpez vos documents a un impact direct sur la qualité de l'ensemble de votre système. Une mauvaise stratégie de découpage peut conduire à l'insertion de contexte non pertinent dans vos invites, ce qui amène votre IA à donner des réponses complètement erronées.

Prenons cet exemple : vous avez un document avec des sections sur la recherche médicale et l'ingénierie logicielle. Si vous découpez mal, un utilisateur demandant « Combien de bugs les ingénieurs ont-ils corrigés cette année ? » pourrait obtenir des informations sur la recherche médicale au lieu de l'ingénierie logicielle, simplement parce que la section médicale contenait le mot « bug » dans un contexte différent.

Cela démontre pourquoi la stratégie de découpage compte autant. L'objectif est de créer des segments (chunks) qui maintiennent une cohérence sémantique et fournissent un contexte significatif lorsqu'ils sont récupérés.

Trois stratégies principales de découpage

Il existe trois approches principales pour découper du texte, chacune avec des avantages et des compromis distincts :
- Basé sur la taille : Diviser le texte en chaînes de longueur égale
- Basé sur la structure : Diviser en fonction de la structure du document (en-têtes, paragraphes, sections)
- Basé sur la sémantique : Regrouper des phrases ou sections liées en utilisant des techniques de NLP
Découpage basé sur la taille
Le découpage basé sur la taille est l'approche la plus simple. Vous divisez simplement votre document en segments de longueur approximativement égale en caractères ou en mots. C'est facile à mettre en œuvre et cela fonctionne de manière fiable sur différents types de documents.

Cependant, cette approche présente des inconvénients évidents. Les mots sont coupés en plein milieu de phrase, et les segments perdent un contexte important. Par exemple, un segment pourrait ne pas inclure l'en-tête de section qui expliquerait de quoi parle réellement le contenu.

La solution consiste à ajouter un chevauchement entre les segments. Chaque segment inclut certains caractères des segments voisins, garantissant une meilleure préservation du contexte et évitant les coupures abruptes.

Voici une implémentation de base du découpage basé sur les caractères avec chevauchement :
def chunk_by_char(text, chunk_size=150, chunk_overlap=20):
chunks = []
start_idx = 0
while start_idx < len(text):
end_idx = min(start_idx + chunk_size, len(text))
chunk_text = text[start_idx:end_idx]
chunks.append(chunk_text)
start_idx = (
end_idx - chunk_overlap if end_idx < len(text) else len(text)
)
return chunksDécoupage basé sur la structure
Le découpage basé sur la structure exploite l'organisation naturelle de vos documents. Si vous travaillez avec des fichiers markdown, vous pouvez découper sur les en-têtes. Pour d'autres formats, vous pourriez découper sur les paragraphes ou d'autres éléments structurels.

Cette approche fonctionne à merveille lorsque vous avez des garanties sur la structure du document. Pour les documents markdown, vous pouvez découper sur les en-têtes de section :
def chunk_by_section(document_text):
pattern = r'\n## '
return re.split(pattern, document_text)La limitation majeure est que de nombreux documents n'ont pas de structure cohérente. Les fichiers texte brut, les PDF, ou les documents téléchargés par les utilisateurs pourraient ne pas avoir de marqueurs structurels clairs sur lesquels découper.
Découpage basé sur la sémantique
Le découpage basé sur la sémantique est l'approche la plus sophistiquée. Elle analyse le sens et les relations entre les phrases pour regrouper le contenu lié. Cela implique généralement :
- Découper le texte en phrases
- Utiliser des techniques de NLP pour mesurer la similarité sémantique
- Regrouper les phrases liées en segments cohérents
Bien que cela puisse produire les segments de la plus haute qualité, c'est coûteux en calcul et plus complexe à mettre en œuvre. Pour la plupart des applications, les approches plus simples fonctionnent suffisamment bien.
Implémentation pratique
Voici une fonction de découpage basée sur les phrases qui offre un bon compromis :
def chunk_by_sentence(text, max_sentences_per_chunk=5, overlap_sentences=1):
sentences = re.split(r'(?<=[.!?])\s+', text)
chunks = []
start_idx = 0
while start_idx < len(sentences):
end_idx = min(start_idx + max_sentences_per_chunk, len(sentences))
current_chunk = sentences[start_idx:end_idx]
chunks.append(' '.join(current_chunk))
start_idx += max_sentences_per_chunk - overlap_sentences
if start_idx < 0:
start_idx = 0
return chunksChoisir la bonne stratégie
Votre choix de stratégie de découpage dépend entièrement de votre cas d'usage spécifique :
- Structure de document cohérente : Utilisez le découpage basé sur la structure pour les résultats les plus propres
- Types de documents mixtes : Le découpage basé sur les phrases fonctionne souvent bien
- Code ou contenu technique : Le découpage basé sur les caractères est le plus fiable
- Formats de documents inconnus : Le découpage basé sur les caractères est votre option la plus sûre
Rappelez-vous que le découpage est souvent un processus itératif. Commencez par une approche simple, testez-la avec vos documents et cas d'usage spécifiques, puis affinez-la en fonction des résultats. La « meilleure » stratégie de découpage est celle qui fonctionne de manière fiable pour vos données et exigences particulières.