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

Diviseurs de texte disponibles

DiviseurIdéal pour
Diviseur de texte par caractèresTexte simple, prototypage rapide
Diviseur de texte par tokensDécoupage conscient des tokens, gestion du Contexte pour les LLM
Diviseur de texte MarkdownDocuments Markdown, contenu structuré avec en-têtes
Diviseur de texte par séparateursLogique de division personnalisée, texte hiérarchique
Diviseurs personnalisésToute stratégie de division
i
Information

Tous les diviseurs conservent automatiquement les métadonnées importantes dans chaque fragment :

  • page_number : numéro de page source
  • filename : nom de fichier original
  • filepath : chemin du fichier original
  • start_offset : position du caractère dans le document
  • end_offset : position du caractère dans le document
  • images : liste des références d’images dans le fragment (le cas échéant)
Conseils pour la taille des fragments

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 LLMTaille du fragmentRecouvrementCas d’usage
4 ko tokens300-500 caractères50-100 caractèresContexte limité, récupération rapide
8 ko tokens500-1 000 caractères100-200 caractèresQualité de récupération équilibrée
32 ko+ tokens1 000-2 000 caractères200-500 caractèresContexte riche, récupération complexe
Code/technique500-1 000 caractères100-200 caractèresConserver les unités logiques
Juridique/financier1 000-2 000 caractères200-500 caractèresContexte 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

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ètreTypeValeur par défautDescription
chunk_sizeint1000Nombre maximal de caractères par fragment
Diviseur de texte par tokens

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 :

OptionTypeValeur par défautObjectif
chunk_sizeint1000Tokens par fragment (utilise le tokenizer Mistral)
chunk_overlapint0Tokens de recouvrement entre les fragments
tokenizer_modelstr"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ètreTypeValeur par défautDescription
headers_to_split_onlist[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_headersboolFalseSupprimer 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

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.")