Les sépareurs de texte divisent les documents en objets DocumentChunk récupérables. Le choix du séparateur a un impact significatif sur la qualité de la récupération.

Sépareurs de texte disponibles

Sépareurs de texte disponibles

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

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

  • numéro_de_page : numéro de la page source
  • nom_de_fichier : nom du fichier original
  • chemin_de_fichier : chemin du fichier original
  • position_début : position du caractère dans le document
  • position_fin : position du caractère dans le document
  • images : liste des références d’images dans le fragment (le cas échéant)
Recommandations pour la taille des fragments

Recommandations pour la taille des fragments

La taille des fragments a un impact significatif sur la qualité de la récupération et l’utilisation du Contexte LLM. Choisissez en fonction de votre cas d’usage :

Contexte LLMTaille du fragmentRecouvrementCas d’usage
4 k tokens300 à 500 caractères50 à 100 caractèresContraintes mémoire, récupération rapide
8 k tokens500 à 1 000 caractères100 à 200 caractèresQualité de récupération équilibrée
32 k+ tokens1 000 à 2 000 caractères200 à 500 caractèresContexte riche, récupération complexe
Code/technique500 à 1 000 caractères100 à 200 caractèresPréserver les unités logiques
Juridique/financier1 000 à 2 000 caractères200 à 500 caractèresContexte complet pour l’interprétation

Règle empirique : ~400 à 600 caractères ≈ 100 à 150 tokens. Ajustez en fonction de la complexité du domaine et des besoins en précision de récupération.

Avantages du recouvrement des fragments :

  • Évite que les limites sémantiques ne 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
Séparateur de texte par caractères

Séparateur 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
taille_fragmentint1000Nombre maximal de caractères par fragment
Séparateur de texte par tokens

Séparateur de texte par tokens

Découpage conscient des tokens à l’aide d’un tokeniseur pour la gestion de la fenêtre de Contexte LLM et le 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
taille_fragmentint1000Tokens par fragment (utilise le tokeniseur Mistral)
recouvrement_fragmentint0Tokens de recouvrement entre les fragments
modèle_tokeniseurstr"mistral"Tokeniseur à utiliser pour le comptage

Quand l’utiliser :

  • Budget précis en tokens pour les fenêtres de Contexte LLM
  • Fragments cohérents quel que soit le type de texte
  • Pour travailler avec des limites de tokens spécifiques

Séparateur de texte Markdown

MarkdownTextSplitter divise les documents Markdown aux limites des en-têtes. Il hérite de SeparatorTextSplitter et ajoute une division consciente des 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 et ajoute :

ParamètreTypeValeur par défautDescription
en-têtes_à_diviserlist[tuple[str, str]][("#", "En-tête 1"), ("##", "En-tête 2"), ("###", "En-tête 3")]En-têtes Markdown sur lesquels diviser — chaque tuple est (préfixe_en-tête, libellé)
supprimer_en-têtesboolFalseSupprimer les lignes d’en-tête du contenu des fragments

Tous les paramètres de SeparatorTextSplitterConfig sont également disponibles (taille_fragment, taille_max_fragment, recouvrement_fragment, séparateurs_fragments, conserver_séparateur, supprimer_espaces).

Séparateur 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 lorsqu’es possible
  • Retourne les positions de début/fin
Créer des sépareurs personnalisés

Créer des sépareurs personnalisés

Implémentez le protocole TextSplitter :

from mistralai.search.toolkit.context import IngestContext
from mistralai.search.toolkit.ingestion.text_splitters import TextSplitter
from mistralai.search.toolkit.ingestion.text_splitters.models import TextFragment

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, context: IngestContext = IngestContext()) -> list[TextFragment]:
        paragraphs = text.split("\n\n")
        fragments = []
        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)

            fragments.append(TextFragment(
                content=content,
                start_offset=offset,
                end_offset=offset + len(content),
            ))
            offset += len(content) + 2

        return fragments

splitter = ParagraphSplitter(max_paragraphs_per_chunk=3)
fragments = splitter.split_text("First paragraph.\n\nSecond paragraph.\n\nThird paragraph.")