Les diviseurs de texte (text splitters) découpe les documents en objets DocumentChunk récupérables. Le choix du diviseur a un impact significatif sur la qualité de récupération.
Diviseurs de texte disponibles
| Diviseur | Idéal pour |
|---|---|
| Diviseur de texte par caractères | Texte simple, prototypage rapide |
| Diviseur de texte par tokens | Découpage conscient des tokens, gestion du Contexte pour les LLM |
| Diviseur de texte Markdown | Documents Markdown, contenu structuré avec en-têtes |
| Diviseur de texte par séparateurs | Logique de division personnalisée, texte hiérarchique |
| Diviseurs personnalisés | Toute stratégie de division |
Tous les diviseurs conservent automatiquement les métadonnées importantes dans chaque fragment :
page_number: numéro de page sourcefilename: nom de fichier originalfilepath: chemin du fichier originalstart_offset: position du caractère dans le documentend_offset: position du caractère dans le documentimages: liste des références d’images dans le fragment (le cas échéant)
Conseils pour la taille des fragments
La taille des fragments a un impact significatif sur la qualité de récupération et l’utilisation du Contexte des LLM. Choisissez en fonction de votre cas d’usage :
| Contexte du LLM | Taille du fragment | Recouvrement | Cas d’usage |
|---|---|---|---|
| 4 ko tokens | 300-500 caractères | 50-100 caractères | Contexte limité, récupération rapide |
| 8 ko tokens | 500-1 000 caractères | 100-200 caractères | Qualité de récupération équilibrée |
| 32 ko+ tokens | 1 000-2 000 caractères | 200-500 caractères | Contexte riche, récupération complexe |
| Code/technique | 500-1 000 caractères | 100-200 caractères | Conserver les unités logiques |
| Juridique/financier | 1 000-2 000 caractères | 200-500 caractères | Contexte complet pour l’interprétation |
Règle pratique : ~400-600 caractères ≈ 100-150 tokens. Ajustez en fonction de la complexité du domaine et des besoins de précision de récupération.
Avantages du recouvrement entre fragments :
- Évite que les limites sémantiques séparent des concepts liés
- Améliore le Contexte lorsque les fragments sont utilisés individuellement
- Augmente la taille de l’index et la latence des requêtes de manière proportionnelle
Diviseur de texte par caractères
CharacterTextSplitter divise le texte par nombre de caractères. Idéal pour les textes simples et le prototypage rapide.
Exemple :
from mistralai.search.toolkit.ingestion.text_splitters import CharacterTextSplitter
splitter = CharacterTextSplitter(
chunk_size=500, # Characters per chunk
)
chunks = splitter.split_document(document)Paramètres :
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
chunk_size | int | 1000 | Nombre maximal de caractères par fragment |
Diviseur de texte par tokens
Division sensible aux tokens utilisant un tokenizer pour gérer les fenêtres de Contexte des LLM et un contrôle précis des tokens.
Exemple :
from mistralai.search.toolkit.ingestion.text_splitters import TokenTextSplitter
splitter = TokenTextSplitter(
chunk_size=1000, # Tokens per chunk
chunk_overlap=200, # Token overlap
)
chunks = splitter.split_document(document)Options de configuration :
| Option | Type | Valeur par défaut | Objectif |
|---|---|---|---|
chunk_size | int | 1000 | Tokens par fragment (utilise le tokenizer Mistral) |
chunk_overlap | int | 0 | Tokens de recouvrement entre les fragments |
tokenizer_model | str | "mistral" | Tokenizer à utiliser pour le comptage |
Quand l’utiliser :
- Budget token précis pour les fenêtres de Contexte des LLM
- Fragments cohérents sur différentes densités de texte
- Lors du travail avec des limites de tokens spécifiques
Diviseur de texte Markdown
MarkdownTextSplitter divise les documents Markdown aux limites des en-têtes. Il hérite de SeparatorTextSplitter et ajoute une division sensible aux en-têtes avec des niveaux d’en-tête configurables.
Prérequis :
Installez l’extra text-splitter-langchain :
uv add "mistralai-search-toolkit[text-splitter-langchain]"Exemple :
from mistralai.search.toolkit.ingestion.text_splitters import MarkdownTextSplitter, MarkdownTextSplitterConfig
config = MarkdownTextSplitterConfig(
headers_to_split_on=[
("#", "h1"),
("##", "h2"),
("###", "h3"),
],
strip_headers=False, # Keep headers in chunks
chunk_size=1000, # Inherited from SeparatorTextSplitterConfig
chunk_overlap=200, # Inherited from SeparatorTextSplitterConfig
)
splitter = MarkdownTextSplitter(config=config)
chunks = splitter.split_document(document)Paramètres (MarkdownTextSplitterConfig) :
MarkdownTextSplitterConfig étend SeparatorTextSplitterConfig, ajoutant :
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
headers_to_split_on | list[tuple[str, str]] | [("#", "Header 1"), ("##", "Header 2"), ("###", "Header 3")] | En-têtes Markdown sur lesquels diviser — chaque tuple est (préfixe_en-tête, étiquette) |
strip_headers | bool | False | Supprimer les lignes d’en-tête du contenu du fragment |
Tous les paramètres de SeparatorTextSplitterConfig sont également disponibles (chunk_size, chunk_max_size, chunk_overlap, chunk_separators, keep_separator, strip_whitespace).
Diviseur de texte par séparateurs
Division récursive avec des séparateurs personnalisés pour gérer des structures de document personnalisées, avec un contrôle précis sur les points de division et l’organisation hiérarchique du texte.
Exemple :
from mistralai.search.toolkit.ingestion.text_splitters import SeparatorTextSplitter, SeparatorTextSplitterConfig
config = SeparatorTextSplitterConfig(
chunk_size=1000, # Target size (characters)
chunk_max_size=1500, # Maximum size (characters)
chunk_overlap=200, # Overlap (characters)
chunk_separators=[ # Tried in order
"\n\n", # Paragraphs first
"\n", # Then lines
". ", # Then sentences
" ", # Then words
"", # Finally characters
],
)
splitter = SeparatorTextSplitter(config=config)
chunks = splitter.split_document(document)Fonctionnalités :
- Essaie les séparateurs dans l’ordre
- Respecte la taille maximale même si la division échoue
- Fusionne les petits fragments lorsque c’est possible
- Retourne les décalages de début/fin
Créer des diviseurs personnalisés
Implémentez le protocole TextSplitter :
from mistralai.search.toolkit.ingestion.text_splitters import TextSplitter
from mistralai.search.toolkit.document import DocumentChunk
class ParagraphSplitter(TextSplitter):
"""Split text into chunks by paragraphs."""
def __init__(self, max_paragraphs_per_chunk: int = 3):
self.max_paragraphs_per_chunk = max_paragraphs_per_chunk
def split_text(self, text: str, **kwargs) -> list[DocumentChunk]:
paragraphs = text.split("\n\n")
chunks = []
offset = 0
for i in range(0, len(paragraphs), self.max_paragraphs_per_chunk):
chunk_paragraphs = paragraphs[i:i + self.max_paragraphs_per_chunk]
content = "\n\n".join(chunk_paragraphs)
chunks.append(DocumentChunk(
content=content,
start_offset=offset,
end_offset=offset + len(content),
))
offset += len(content) + 2
return chunks
splitter = ParagraphSplitter(max_paragraphs_per_chunk=3)
chunks = splitter.split_text("First paragraph.\n\nSecond paragraph.\n\nThird paragraph.")