Skip to content

Pipelines de traitement

Multimodal Mistral AI

Les pipelines de traitement sont le premier maillon de la chaîne de transformation du contenu. Leur rôle est d’extraire du texte exploitable à partir de n’importe quelle source — que ce soit un PDF scanné, une image, un podcast audio, une vidéo YouTube ou une page web.

Le diagramme ci-dessous montre comment l’input router dirige chaque ressource vers son pipeline spécialisé, puis comment tous les contenus extraits convergent vers le traitement commun (chunking + embedding) :

Vue d'ensemble des pipelines
100%
flowchart TB
    subgraph "Input Router"
        IR[input_router]
    end
    
    subgraph "Pipelines Spécialisés"
        TEXT[Pipeline Texte]
        PDF[Pipeline PDF]
        IMG[Pipeline Image]
        AUDIO[Pipeline Audio]
        YT[Pipeline YouTube]
        WEB[Pipeline Website]
    end
    
    subgraph "Traitement Commun"
        DETECT[detect_complex_content]
        SPLIT[splitter_selection]
        CHUNK[splitter_application]
        ENRICH[chunk_enrichment]
        EMBED[embedding_generation]
    end
    
    IR --> TEXT
    IR --> PDF
    IR --> IMG
    IR --> AUDIO
    IR --> YT
    IR --> WEB
    
    TEXT --> DETECT
    PDF --> DETECT
    IMG --> DETECT
    AUDIO --> DETECT
    YT --> DETECT
    WEB --> DETECT
    
    DETECT --> SPLIT --> CHUNK --> ENRICH --> EMBED
  1. Input Router : Analyse l’input et détermine son type (extension de fichier, URL pattern…)
  2. Pipeline spécialisé : Extrait le contenu textuel selon les spécificités du format
  3. Traitement commun : Découpe le texte en chunks optimaux et génère les embeddings

Le pipeline le plus simple, pour le traitement de texte brut. C’est aussi le pipeline de base vers lequel tous les autres convergent après avoir extrait leur contenu.

Pipeline Texte
100%
graph LR
    A[text_input_check] --> B[detect_complex_content]
    B --> C[splitter_selection]
    C --> D[splitter_application]
    D --> E{Complex?}
    E -->|Oui| F[chunk_enrichment]
    E -->|Non| G[embedding_generation]
    F --> G
    G --> H[END]
    
    style A fill:#0277bd
    style G fill:#388e3c
    style H fill:#7c4dff
NodeResponsabilitéExplication
text_input_checkValide le texte d’entréeVérifie que le texte n’est pas vide et respecte les limites
detect_complex_contentDétecte tables, code, formulesAnalyse les patterns pour identifier le contenu structuré
splitter_selectionChoisit le splitter appropriéSélectionne MarkdownSplitter, CodeSplitter ou RecursiveSplitter
splitter_applicationApplique le chunkingDécoupe en segments de 512 tokens avec 15% de chevauchement
chunk_enrichmentEnrichit les chunks complexes via LLMAjoute du contexte aux chunks contenant du code ou des formules
embedding_generationGénère les embeddings MistralConvertit chaque chunk en vecteur de 1024 dimensions

Le module ContentComplexityDetector analyse le texte pour identifier les éléments qui nécessitent un traitement spécial :

class ContentComplexityDetector:
"""Détecte le contenu qui nécessite un traitement particulier.
Pourquoi ? Un tableau ou une formule mathématique perdent leur sens
si on les coupe au milieu lors du chunking. Cette détection permet
d'adapter la stratégie de découpage.
"""
def detect(self, text: str) -> ComplexityResult:
return ComplexityResult(
has_tables=self._detect_tables(text), # Markdown/HTML tables
has_code=self._detect_code(text), # Blocs de code indentés
has_formulas=self._detect_formulas(text), # LaTeX/MathML
has_lists=self._detect_structured_lists(text) # Listes hiérarchiques
)

Le pipeline PDF est le plus sophistiqué de tous car les PDFs présentent une grande variabilité : certains contiennent du texte sélectionnable, d’autres sont des images scannées, et beaucoup sont un mélange des deux.

Pipeline PDF
100%
graph TB
    A[document_input_check] --> B[pdf_loader]
    B --> C[pdf_cleaner]
    C --> D[pdf_page_analyzer]
    D --> E[pdf_processing_strategy]
    
    E -->|split_pages| F[pdf_split_by_pages]
    E -->|split_size| G[pdf_split_by_size]
    E -->|parse_only| H[pdf_text_parser]
    E -->|ocr_only| I[pdf_ocr_processor]
    E -->|hybrid| J[pdf_hybrid_processor]
    
    F --> H
    F --> I
    F --> J
    G --> H
    G --> I
    G --> J
    
    H --> K[pdf_content_merger]
    I --> K
    J --> K
    
    K --> L[detect_complex_content]
    
    style A fill:#0277bd
    style E fill:#f9a825
    style K fill:#388e3c

Le système sélectionne automatiquement la meilleure stratégie selon l’analyse de chaque page :

class ProcessingStrategy(str, Enum):
"""Stratégies de traitement PDF.
Le choix est automatique basé sur l'analyse de chaque page.
"""
PARSE_ONLY = "parse_only" # PDF natif avec texte sélectionnable
OCR_ONLY = "ocr_only" # OCR uniquement (scans)
HYBRID = "hybrid" # Parsing + OCR selon les pages
SPLIT_THEN_PARSE = "split_then_parse"
SPLIT_THEN_OCR = "split_then_ocr"
class SplitStrategy(str, Enum):
"""Stratégies de découpage"""
BY_PAGES = "by_pages" # Découpage par nombre de pages
BY_SIZE = "by_size" # Découpage par taille
NodeResponsabilité
pdf_loaderChargement depuis S3
pdf_cleanerNettoyage et normalisation
pdf_page_analyzerAnalyse de chaque page
ParamètreValeur
Taille max50 MB
Pages max1000
Modèle OCRmistral-ocr-latest

Utilise Mistral Vision pour générer une description textuelle de l’image.

Pipeline Image
100%
graph LR
    A[image_input_check] --> B[image_loader]
    B -->|error| E[image_error_handler]
    B -->|continue| C[image_preprocessor]
    C -->|error| E
    C -->|continue| D[image_vision_analyzer]
    D -->|error| E
    D -->|continue| F[detect_complex_content]
    
    style A fill:#0277bd
    style D fill:#f9a825
    style E fill:#c62828
NodeResponsabilité
image_loaderChargement depuis S3
image_preprocessorRedimensionnement et optimisation
image_vision_analyzerAnalyse avec Mistral Vision
image_error_handlerGestion des erreurs
ParamètreValeur
Modèle Visionmistral-small-latest
Taille max10 MB
Résolution max1540x1540
Formats supportésjpg, jpeg, png, webp, gif

Transcription audio via Voxtral avec découpage automatique pour les fichiers longs.

Pipeline Audio
100%
graph LR
    A[audio_input_check] --> B[audio_loader]
    B -->|error| E[audio_error_handler]
    B -->|continue| C[audio_splitter]
    C -->|error| E
    C -->|continue| D[audio_transcriber]
    D -->|error| E
    D -->|continue| F[detect_complex_content]
    
    style A fill:#0277bd
    style D fill:#f9a825
    style E fill:#c62828
NodeResponsabilité
audio_loaderChargement depuis S3
audio_splitterDécoupage en segments ≤ 15 min
audio_transcriberTranscription avec Voxtral
audio_error_handlerGestion des erreurs
ParamètreValeur
Modèlevoxtral-mini-latest
Durée max par segment15 minutes
Formats supportéswav, mp3, m4a, flac, ogg
Découpage automatiqueSi > 15 min

Récupère la transcription via l’API YouTube, avec fallback sur le téléchargement audio si indisponible.

Pipeline YouTube
100%
graph TB
    A[youtube_input_check] --> B{Transcription disponible?}
    B -->|Oui| C[youtube_transcript]
    B -->|Non| D[youtube_audio_download]
    C -->|success| E[detect_complex_content]
    C -->|fallback| D
    D --> F[audio_splitter]
    F --> G[audio_transcriber]
    G --> E
    
    A -->|error| H[youtube_error_handler]
    C -->|error| H
    D -->|error| H
    
    style A fill:#0277bd
    style C fill:#388e3c
    style D fill:#f9a825
    style H fill:#c62828
  1. Tentative API

    • Récupération de la transcription via YouTubeTranscriptApi
    • Utilisation de proxy Webshare (IPs résidentielles)
  2. Fallback Audio (si transcription indisponible)

    • Téléchargement de l’audio de la vidéo
    • Routage vers le pipeline audio standard
NodeResponsabilité
youtube_input_checkValidation de l’URL YouTube
youtube_transcriptRécupération via API
youtube_audio_downloadTéléchargement audio (fallback)
youtube_error_handlerGestion des erreurs

Crawl de sites web avec conversion en Markdown via httpx + BeautifulSoup.

Pipeline Website
100%
graph LR
    A[website_input_check] --> B[website_crawler]
    B -->|error| E[website_error_handler]
    B -->|continue| C[website_content_cleaner]
    C -->|error| E
    C -->|continue| D[detect_complex_content]
    
    style A fill:#0277bd
    style C fill:#388e3c
    style E fill:#c62828
NodeResponsabilité
website_input_checkValidation de l’URL
website_crawlerCrawl avec httpx
website_content_cleanerNettoyage HTML → Markdown
website_error_handlerGestion des erreurs
CaractéristiqueDétail
Compatible serverlessPas de navigateur requis
Proxy WebshareIPs résidentielles pour éviter les blocages
Conversion Markdownhtml2text pour un texte structuré
User-Agent rotatifPlusieurs UA réalistes

Après l’extraction du contenu par chaque pipeline, le traitement commun s’applique :

class ContentComplexityDetector:
"""Détecte le contenu complexe nécessitant un traitement spécial"""
def detect(self, text: str) -> ComplexityResult:
return ComplexityResult(
has_tables=self._detect_tables(text),
has_code=self._detect_code(text),
has_formulas=self._detect_formulas(text),
has_lists=self._detect_structured_lists(text)
)

Le système choisit automatiquement le meilleur splitter :

Type de contenuSplitter utilisé
Texte simpleRecursiveCharacterTextSplitter
CodeCodeTextSplitter
MarkdownMarkdownTextSplitter
Contenu mixteCombinaison intelligente
CHUNK_SIZE = 512 # Taille cible en tokens
CHUNK_OVERLAP_PERCENT = 0.15 # 15% de chevauchement
CHUNK_OVERLAP = 77 # ~77 tokens

Pour les chunks contenant du contenu complexe, un enrichissement LLM est appliqué pour préserver le contexte sémantique.

EMBEDDING_MODEL = "mistral-embed"
EMBEDDING_DIMENSION = 1024
EMBEDDING_BATCH_SIZE = 50

Chaque pipeline dispose d’un error handler dédié qui :

  • Capture les exceptions spécifiques au type de contenu
  • Génère des messages d’erreur explicites
  • Permet la continuation du traitement des autres ressources en mode batch
class PipelineError(Exception):
"""Erreur générique de pipeline"""
def __init__(self, message: str, pipeline: str, details: dict = None):
self.message = message
self.pipeline = pipeline
self.details = details or {}

Pipelines de traitement multimodal pour une extraction de contenu optimale.