Comment fonctionne le pipeline IA
Architecture technique du pipeline : OCR, extraction LLM, fallbacks, sécurité.
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/pdfuniquement - 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
| Tentative | Délai avant retry | Action |
|---|---|---|
| 1 | 0 s | Premier appel API |
| 2 | 2 s | Retry sur erreur 5xx ou timeout |
| 3 | 5 s | Dernier retry |
| Échec | — | Dossier 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
nullplutô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 :
- Stocké dans
dossiers.raw_extraction(snapshot brut LLM, immuable) - Copié dans
dossiers.validated_extraction(mutable, modifié par le collaborateur en page de révision) - Indexé pour la recherche full-text (raison sociale, SIREN)
- 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) :
| Composant | Coût moyen / dossier |
|---|---|
| Mistral OCR (10 pages scannées) | 0,02 € |
| Claude Sonnet 4.7 (~8K tokens in / 2K out) | 0,04 € |
| Supabase Storage + DB | 0,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).