Ingestion

L’ingestion transforme des documents bruts en fragments indexables dans un magasin vectoriel. Le processus est modulaire : vous pouvez remplacer n’importe quel composant selon vos besoins.

Un FileLoader lit les octets bruts depuis une source (système de fichiers local, stockage cloud ou toute autre source personnalisée) et retourne un objet File.

Un DocumentExtractor convertit ce File en un Document structuré. Il analyse notamment les PDF via OCR, convertit le HTML en Markdown ou lit le texte brut en fonction du type de fichier.

Un TextSplitter divise le Document en objets DocumentChunk plus petits. La stratégie et la taille des fragments influencent directement la qualité de la recherche.

Un ChunkEnricher optionnel ajoute des métadonnées à chaque fragment avant l’indexation, par exemple un résumé généré par modèle ou des balises d’entités.

Un Embedder convertit chaque fragment en un vecteur, et le magasin conserve à la fois le vecteur et le texte brut pour permettre la recherche.

Pipeline

Pipeline

Pipeline est le point d’entrée principal. Il gère le chargement des fichiers, l’extraction, la division en fragments, l’intégration (embedding) et l’indexation. Il prend en charge le traitement en batch, avec gestion de la concurrence, du suivi de progression et des points de contrôle.

from mistralai.search.toolkit.ingestion.pipelines import Pipeline
from mistralai.client import Mistral
from mistralai.search.toolkit.embedders import MistralEmbedder, MODEL_1024_EMBEDDING
from mistralai.search.toolkit.ingestion.extractors import PlainTextExtractor
from mistralai.search.toolkit.ingestion.loaders import FilesystemFileLoader
from mistralai.search.toolkit.ingestion.text_splitters import CharacterTextSplitter
from mistralai.search.toolkit.ingestion.enrichers import SummaryEnricher
from mistralai.search.toolkit.plugins.vespa import VespaClientConfig
from vespa_app import app

mistral_client = Mistral(api_key="...")

collection_name = "my_collection"
config = VespaClientConfig(
    endpoint="http://localhost:8080",
)

vector_store = app.get_search_index(config, collection_name=collection_name)

pipeline = Pipeline(
    loader=FilesystemFileLoader(),
    extractor=PlainTextExtractor(),
    text_splitter=CharacterTextSplitter(chunk_size=512),
    chunk_enrichers=[SummaryEnricher(client=mistral_client)],
    embedder=MistralEmbedder(client=mistral_client, model_name=MODEL_1024_EMBEDDING),
    stores=vector_store,
)

num_chunks = await pipeline.run(documents=["doc1.txt", "doc2.txt"])
i
Information

collection_name (passé à app.get_search_index) sélectionne le schéma/la collection dans lequel(s) vos fragments sont indexés. Utilisez le même nom lors de la récupération des documents ultérieurement.

Points de contrôle

Pour les collections de documents volumineuses, activez les points de contrôle afin de reprendre le traitement en cas d’échec :

from mistralai.search.toolkit.ingestion.progress import create_tqdm_progress_callback
from mistralai.search.toolkit.ingestion.enrichers import SummaryEnricher

pipeline = Pipeline(
    loader=FilesystemFileLoader(),
    extractor=extractor,
    text_splitter=splitter,
    chunk_enrichers=[SummaryEnricher(client=mistral_client)],
    embedder=embedder,
    stores=vector_store,
    checkpoint_dir="./checkpoints",
)

num_chunks = await pipeline.run(
    documents=document_paths,
    use_checkpoint=True,
    progress_callback=create_tqdm_progress_callback(),
)

Au redémarrage, les documents disposant déjà d’un fichier de point de contrôle sont ignorés.

RoutedPipeline

RoutedPipeline achemine automatiquement les fichiers vers des pipelines spécifiques en fonction de leur extension et de leur type MIME. Utilisez-le pour ingérer des collections de documents aux formats variés : il sélectionne intelligemment l’extracteur et le pipeline de traitement adaptés à chaque type de fichier.

Protocoles

RoutedPipeline inclut 9 protocoles intégrés. Chaque protocole associe un ensemble de types de fichiers au pipeline d’extraction correspondant :

ProtocoleTypes de fichiers
ocrPDF, DOCX, PPTX, ODT, EPUB
plain_textTXT, MD, CSV, JS, PY, JSON, YAML…
htmlHTML, HTM
xlsxXLSX, XLS, ODS
numbersNUMBERS
legacy_officeDOC, PPT, HWP, HWPX
emailEML, MSG
imagePNG, JPEG, GIF, WebP
audioMP3, WAV, M4A, FLAC, OGG

Exemple

Utilisation de base avec les protocoles par défaut :

from mistralai.search.toolkit.ingestion.pipelines import RoutedPipeline

router = RoutedPipeline({
    "ocr": ocr_pipeline,
    "html": html_pipeline,
    "plain_text": text_pipeline,
    "xlsx": spreadsheet_pipeline,
})

document = await router.run_file(file=file)

Paramètres

ParamètreDescription
pipelinesDictionnaire associant les noms de protocoles aux instances de Pipeline
mime_registryRegistre MIME personnalisé pour la détection des types de fichiers (optionnel)
protocol_overridesDictionnaire optionnel pour remplacer le protocole par défaut pour des extensions de fichiers spécifiques

Exemple de remplacement

Forcer l’utilisation d’un autre protocole pour certaines extensions de fichiers :

router = RoutedPipeline(
    pipelines={
        "ocr": ocr_pipeline,
        "html": html_pipeline,
        "plain_text": text_pipeline,
        "xlsx": spreadsheet_pipeline,
    },
    protocol_overrides={
        ".doc": "ocr",  # Force legacy docs through OCR instead of legacy_office
    },
)

document = await router.run_file(file=file)
Composants

Composants

Chaque composant d’ingestion est documenté en détail, avec ses options de configuration, les bonnes pratiques et des exemples :