Comment fonctionne le pipeline IA

Architecture technique du pipeline : OCR, extraction LLM, fallbacks, sécurité.

Mis à jour le 1 mai 2026

Le pipeline IA de PV-Express transforme une plaquette PDF brute en dossier AGOA structuré et prêt à générer en moins d'une minute. Voici le détail technique des 4 étapes, les fallbacks en cas d'erreur, et les garanties de sécurité.

Vue d'ensemble en 4 étapes

┌──────────┐   ┌──────────┐   ┌────────────┐   ┌──────────────────┐
│  Upload  │──>│   OCR    │──>│ Extraction │──>│ Préparation      │
│   PDF    │   │ Mistral  │   │    LLM     │   │ dossier (review) │
└──────────┘   └──────────┘   └────────────┘   └──────────────────┘
    2 s          12 s            18 s              2 s

Total typique : ~35 à 40 secondes sur un PDF scanné de 10 pages.

Étape 1 — Upload

Le PDF est uploadé via une connexion HTTPS TLS 1.3 vers Supabase Storage. Le fichier est stocké dans le bucket plaquettes/ sous un chemin {tenant_id}/{dossier_id}/{filename} qui garantit l'isolation tenant.

Au moment du POST, l'API valide :

  • Type MIME : application/pdf uniquement
  • Taille : ≤ 50 Mo
  • Header magique PDF (%PDF-) pour bloquer les fichiers déguisés
  • Quota plan (nombre de dossiers du mois)

Étape 2 — OCR Mistral souverain UE

Si le PDF est natif (texte sélectionnable détecté via pdfplumber), cette étape est sautée et le texte brut est passé directement à l'étape 3.

Sinon, le PDF est envoyé à l'API Mistral OCR hébergée dans l'UE (Paris). Le retour est un JSON structuré page par page avec :

  • Texte brut
  • Bounding boxes des blocs détectés
  • Score de confiance par bloc (0.0 à 1.0)

Fallback OCR — 3 retries backoff exponential

TentativeDélai avant retryAction
10 sPremier appel API
22 sRetry sur erreur 5xx ou timeout
35 sDernier retry
ÉchecDossier en statut error, message UI

Étape 3 — Extraction LLM

Le texte OCR (ou le texte natif) est concaténé et envoyé à Claude Sonnet 4.7 avec un prompt système structuré qui demande un JSON strict respectant un schéma Zod versionné.

Le prompt inclut :

  • Définition exhaustive des 28 champs à extraire
  • Règles métier (ex : "le capital social doit être en euros, sans séparateur de milliers")
  • Format de sortie strict avec exemples
  • Instruction de retourner null plutôt qu'une donnée inventée si le champ est absent
  • Score de confiance par champ (0.0 à 1.0)

Fallback LLM — Sonnet → Mistral Large 2

Si Claude Sonnet retourne une erreur 5xx, un timeout (> 60 s), ou un JSON qui ne valide pas le schéma Zod, le pipeline bascule automatiquement sur Mistral Large 2 (souverain UE) avec le même prompt.

Le champ raw_extraction.fallback_used: true est annoté pour traçabilité. Le score de confiance moyen est généralement plus bas (~0.78 vs ~0.91 pour Sonnet), ce qui se reflète dans la page de révision : plus de champs en jaune (à vérifier).

Étape 4 — Préparation dossier

Le JSON validé est :

  1. Stocké dans dossiers.raw_extraction (snapshot brut LLM, immuable)
  2. Copié dans dossiers.validated_extraction (mutable, modifié par le collaborateur en page de révision)
  3. Indexé pour la recherche full-text (raison sociale, SIREN)
  4. Le statut du dossier passe de extracting à review

Une notification optionnelle (email ou webhook) peut être déclenchée selon la configuration du cabinet.

Sécurité du pipeline

Tout traité côté server

Aucun appel LLM ne part du navigateur. Toutes les requêtes vers Anthropic ou Mistral sont signées avec les clés API stockées en variables d'environnement Vercel, jamais exposées au front.

Chiffrement at-rest

Les PDFs sont stockés dans Supabase Storage avec chiffrement AES-256 at-rest, géré par AWS KMS (région eu-west-3 Paris). Les snapshots DB Postgres sont également chiffrés.

RLS tenant strict

Toutes les tables (dossiers, documents_generated, audit_log, storage.objects) ont des policies Row Level Security qui filtrent sur tenant_id. Un utilisateur authentifié sur le tenant A ne peut physiquement pas lire les données du tenant B, même via une requête SQL crafted, car la session JWT contient le tenant_id et RLS l'applique au niveau du moteur Postgres.

Pas de réutilisation des données pour l'entraînement

Les contrats Anthropic et Mistral souscrits par PV-Express incluent explicitement une clause no-training sur les données client. Vos plaquettes ne servent jamais à entraîner les modèles.

Audit log immuable

Chaque étape du pipeline (upload, OCR, extraction, fallback, génération) est loguée dans audit_log avec timestamp UTC, user_id, IP, et diff before/after. Voir Audit log.

Coûts par dossier (info technique)

Pour transparence sur la chaîne de coûts (votre prix utilisateur ne varie pas) :

ComposantCoût moyen / dossier
Mistral OCR (10 pages scannées)0,02 €
Claude Sonnet 4.7 (~8K tokens in / 2K out)0,04 €
Supabase Storage + DB0,003 €
Total infra~0,06 €

Et ensuite ?

Une fois l'extraction terminée, vérifiez les champs en page de révision (Réviser et valider l'extraction), puis générez la pochette (Générer la pochette AGOA).