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 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"])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 :
| Protocole | Types de fichiers |
|---|---|
ocr | PDF, DOCX, PPTX, ODT, EPUB |
plain_text | TXT, MD, CSV, JS, PY, JSON, YAML… |
html | HTML, HTM |
xlsx | XLSX, XLS, ODS |
numbers | NUMBERS |
legacy_office | DOC, PPT, HWP, HWPX |
email | EML, MSG |
image | PNG, JPEG, GIF, WebP |
audio | MP3, 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ètre | Description |
|---|---|
pipelines | Dictionnaire associant les noms de protocoles aux instances de Pipeline |
mime_registry | Registre MIME personnalisé pour la détection des types de fichiers (optionnel) |
protocol_overrides | Dictionnaire 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
Chaque composant d’ingestion est documenté en détail, avec ses options de configuration, les bonnes pratiques et des exemples :
- Chargeurs de fichiers : chargement de fichiers depuis un système de fichiers, un stockage cloud ou des sources personnalisées
- Extracteurs de documents : extraction de contenu à partir de PDF, HTML, tableurs, etc.
- Sépareurs de texte : division des documents en fragments avec une taille et un chevauchement optimaux
- Enrichisseurs de fragments : ajout de métadonnées personnalisées pour le filtrage et le classement
- Embedders : conversion de texte en vecteurs pour la recherche sémantique
- Index de recherche : stockage et recherche dans les fragments indexés