Introduction : Le Cas Concret qui a Tout Changé
Il y a six mois, j'ai été contacté par un éditeur de logiciels RH qui Traitait manuellement 3 000 CV par semaine. Chaque curriculum vitae devait être analysé pour extraire les compétences, l'expérience professionnelle et le niveau de formation. L'équipe de recrutement Passait 40 heures par semaine sur cette tâche répétitive. Je leur ai proposé une architecture OCR + LLM qui a réduit ce temps à 15 minutes. Ce cas concret illustre parfaitement la puissance de cette combinaison que je vais vous détailler dans cet article.
Le Problème : Pourquoi les Méthodes Traditionnelles Échouent
Les approches classiques d'extraction de données documentaires présentent trois limitations majeures :
- Extraction rigide : Les expressions régulières et parseurs statiques ne gèrent pas la variabilité des formats
- Perte contextuelle : Un CV.pdf scanné perd sa structure hiérarchique lors de la conversion
- Manque de compréhension sémantique : Une facture de 2 340 € et un reçu de 23,40 € sont simplement deux nombres pour un système classique
La combinaison OCR (Optical Character Recognition) et LLM (Large Language Model) permet de surmonter ces obstacles en ajoutant une couche de compréhension sémantique après l'extraction brute.
Architecture de la Solution Complète
L'architecture que je recommande se compose de quatre couches distinctes fonctionnant en chaîne :
- Couche 1 — Prétraitement d'image : Amélioration du contraste, rotation, détection de bordures
- Couche 2 — OCR : Conversion image vers texte avec preservation de la structure
- Couche 3 — post-traitement : Correction orthographique, normalisation du format
- Couche 4 — LLM : Analyse sémantique, extraction structurée, validation
Mise en Œuvre Pratique avec HolySheep AI
Pour l'implémentation, j'utilise
HolySheep AI comme fournisseur LLM. Leur infrastructure offre une latence moyenne de 45 millisecondes pour les appels synchrones, ce qui est crucial pour le traitement en temps réel de documents. Le taux de change avantageux (1¥ = 1$) permet également de réduire les coûts d'exploitation de 85% par rapport aux fournisseurs occidentaux.
Étape 1 : Configuration de l'Environnement
# Installation des dépendances Python
pip install python-docx pytesseract pillow openai python-dotenv
Configuration des variables d'environnement
export HOLYSHEEP_API_KEY="YOUR_HOLYSHEEP_API_KEY"
export HOLYSHEEP_BASE_URL="https://api.holysheep.ai/v1"
Structure du projet
project/
├── ocr_processor.py # Module OCR
├── llm_analyzer.py # Module analyse LLM
├── document_pipeline.py # Pipeline complet
└── config.py # Configuration
Étape 2 : Module OCR avec Tesseract
import pytesseract
from PIL import Image, ImageEnhance, ImageFilter
import io
class OCRProcessor:
def __init__(self, lang='fra+eng'):
self.lang = lang
def preprocess_image(self, image_path: str) -> Image.Image:
"""Amélioration de l'image pour une meilleure reconnaissance OCR."""
img = Image.open(image_path)
# Conversion en niveaux de gris
img = img.convert('L')
# Augmentation du contraste
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(1.5)
# Réduction du bruit
img = img.filter(ImageFilter.MedianFilter(size=3))
return img
def extract_text(self, image_path: str) -> dict:
"""Extraction du texte avec preservation de la structure."""
img = self.preprocess_image(image_path)
# Configuration Tesseract pour preservation de layout
custom_config = r'--oem 3 --psm 6 -l fra+eng'
# Extraction avec structure
text = pytesseract.image_to_string(
img,
config=custom_config,
output_type=pytesseract.Output.DICT
)
# Extraction détaillée avec blocs
blocks = pytesseract.image_to_data(
img,
output_type=pytesseract.Output.DICT
)
return {
'text': text['text'],
'blocks': blocks,
'confidence': sum(text.get('conf', [0])) / max(len(text.get('conf', [1])), 1)
}
Utilisation
processor = OCRProcessor()
result = processor.extract_text('document_test.png')
print(f"Texte extrait : {result['text'][:200]}...")
print(f"Confiance OCR : {result['confidence']:.2f}%")
Étape 3 : Module d'Analyse LLM avec HolySheep
import openai
from dotenv import load_dotenv
import os
import json
load_dotenv()
class DocumentAnalyzer:
def __init__(self):
self.client = openai.OpenAI(
api_key=os.getenv('HOLYSHEEP_API_KEY'),
base_url="https://api.holysheep.ai/v1"
)
# DeepSeek V3.2 : $0.42/1M tokens — excellent rapport qualité/prix
self.model = "deepseek-v3.2"
def extract_structured_data(self, raw_text: str, document_type: str) -> dict:
"""Extraction de données structurées via LLM."""
prompts = {
'cv': """Analyse ce CV et extrais les informations au format JSON :
{
"nom": string,
"email": string,
"telephone": string,
"competences": [string],
"experiences": [{"entreprise": string, "poste": string, "duree": string}],
"formation": [{"etablissement": string, "diplome": string, "annee": int}]
}
CV :
""",
'facture': """Analyse cette facture et extrais :
{
"numero_facture": string,
"date": string,
"fournisseur": string,
"montant_total": float,
"lignes": [{"description": string, "quantite": int, "prix": float}]
}
Facture :
"""
}
try:
response = self.client.chat.completions.create(
model=self.model,
messages=[
{"role": "system", "content": "Tu es un expert en extraction de données documentaires. Réponds UNIQUEMENT en JSON valide."},
{"role": "user", "content": prompts.get(document_type, prompts['cv']) + raw_text}
],
temperature=0.1,
max_tokens=2048
)
result = response.choices[0].message.content
return json.loads(result)
except Exception as e:
print(f
Ressources connexes
Articles connexes