Le contexte : de l’expérimentation à la production
Depuis début 2024, j’ai travaillé sur l’industrialisation d’un pipeline LLM pour AXA Group Operations, destiné à extraire et modéliser automatiquement des contrats d’assurance complexes. Ce qui a commencé comme une preuve de concept avec quelques appels OpenAI dans un notebook Jupyter s’est rapidement transformé en un système critique traitant des milliers de documents par jour.
Voici ce que j’ai appris en mettant ce pipeline en production — et les erreurs coûteuses que vous pouvez éviter.
Architecture : les fondations d’un système fiable
1. Orchestration avec Airflow
J’ai choisi Apache Airflow pour orchestrer l’ensemble du pipeline. Pas parce que c’est à la mode, mais parce que :
- Retry logic natif : crucial quand vos appels LLM échouent aléatoirement à cause de rate limits
- Monitoring visuel : voir instantanément où ça bloque dans un DAG complexe
- Backfill facile : relancer 3 mois de traitements après avoir corrigé un bug de prompt
Le DAG principal ressemble à ceci :
ingestion >> validation >> chunking >> llm_extraction >> post_processing >> storage
Chaque étape est idempotente. Si l’extraction LLM plante à 80%, on ne recommence pas à zéro.
2. Stratégie multi-modèle
Ne jamais dépendre d’un seul fournisseur. Notre stack :
- OpenAI GPT-4 : tâches complexes, extraction nuancée
- Mistral Large : alternative européenne, RGPD-friendly
- Claude 3 Opus : analyse de documents longs (100k+ tokens)
Le routeur de modèle décide en fonction de :
- La taille du document
- La sensibilité des données
- Les quotas restants
- Le coût par token
3. Gestion des coûts : le vrai problème
En novembre 2024, notre facture OpenAI a atteint $12,000/mois. Voici comment on l’a ramenée à $3,200 :
Caching agressif
# Hash sémantique du contenu + version du prompt
cache_key = f"{"{"}doc_hash}:{"{"}prompt_version}"
if cached := redis.get(cache_key):
return cached
Prompt engineering rigoureux
- Réduction de 40% des tokens en output en structurant les réponses JSON
- Suppression des exemples redondants dans les prompts système
Batching intelligent Regrouper plusieurs extractions dans un seul appel quand possible (attention : ça réduit la précision de 2-3%).
Monitoring : ce qui compte vraiment
Les métriques classiques (latence, throughput) ne suffisent pas. Voici ce qu’on surveille :
Métriques métier
- Taux d’extraction réussie : % de contrats entièrement parsés
- Confidence score : auto-évaluation du LLM (étonnamment fiable sur GPT-4)
- Human-in-the-loop ratio : combien d’extractions nécessitent validation humaine
Alertes opérationnelles
- Spike de coûts : +30% en 1h → alerte Slack
- Drift de qualité : baisse du confidence moyen → investigation
- Rate limit approchant : 80% du quota → throttling automatique
Points de défaillance et solutions
Problème #1 : Hallucinations structurées
Le LLM invente des clauses qui n’existent pas, mais le JSON est parfaitement valide.
Solution : Validation cross-référencée
# Extraire 2x avec des prompts différents
result_a = extract_with_prompt_v1(doc)
result_b = extract_with_prompt_v2(doc)
# Comparer les outputs
if similarity(result_a, result_b) < 0.85:
flag_for_human_review()
Problème #2 : Latence imprévisible
Certains documents prenaient 45 secondes, d’autres 3 minutes. Impossible de provisionner correctement.
Solution : Timeouts adaptatifs par taille de document
timeout = base_timeout + (doc_size_kb * timeout_per_kb)
Problème #3 : State management distribué
Avec 20 workers Airflow parallèles, maintenir l’état cohérent était un cauchemar.
Solution : PostgreSQL comme source de vérité unique, Redis pour le caching éphémère uniquement.
Déploiement : l’infrastructure
Stack AWS
- ECS Fargate pour les workers Airflow (auto-scaling 5-50 instances)
- RDS PostgreSQL pour l’état Airflow + métadonnées métier
- ElastiCache Redis pour le caching de résultats LLM
- S3 pour stockage documents + outputs
- CloudWatch + Datadog pour observabilité
CI/CD
- Tests de prompts dans les PR GitHub (oui, on test les prompts !)
- Déploiement blue-green avec 10% de trafic sur la nouvelle version pendant 24h
Leçons apprises
- Commencer petit, scaler prudemment : ne pas paralléliser avant d’avoir résolu la fiabilité sur 1 thread
- Les prompts sont du code : versionnés, testés, reviewés
- La qualité > la vitesse : un mauvais résultat rapide coûte plus cher qu’un bon résultat lent
- Prévoir le budget tokens : comme on prévoit le budget cloud classique
- Human feedback loop essentiel : au moins les 3 premiers mois, quelqu’un valide 100% des outputs
Résultats chiffrés
Après 12 mois en production :
- 94.3% de précision sur l’extraction de clauses
- 3,200$/mois de coûts LLM (vs 12k initialement)
- 760 heures de travail manuel économisées par mois
- < 1% de downtime
Conclusion
Industrialiser un pipeline LLM, ce n’est pas juste “coller GPT-4 sur vos données”. C’est de l’ingénierie distribuée classique, avec en plus la gestion d’un composant externe non-déterministe et coûteux.
Si vous vous lancez : investissez dans le monitoring dès le jour 1, ne sous-estimez pas les coûts, et gardez toujours un humain dans la boucle au début.
Besoin d’aide pour architecturer votre pipeline IA ? Contactez-moi pour un audit ou un accompagnement technique.