Aller au contenu principal

Atelier : Extraction Structurée

Objectif de cet atelier

Cet atelier se concentre sur l’extraction structurée : transformer du texte libre en données exploitables par un programme. Vous pratiquerez l’extraction JSON, le résumé de document et la traduction avec les modèles Mistral.

Exercice 1 : Extraction JSON depuis un texte libre

Le contexte

Vous automatisez le traitement de factures reçues par email. Le texte des factures varie d’un fournisseur à l’autre, mais vous devez toujours extraire les mêmes champs.

Le prompt

messages = [
    {
        "role": "system",
        "content": """Vous êtes un extracteur de données spécialisé dans les documents comptables.
Règles strictes :
- Retournez UNIQUEMENT du JSON valide, sans commentaire ni texte additionnel
- Si un champ n'est pas trouvé, mettez null (pas "non renseigné", pas "")
- Les montants doivent être des nombres (pas de symbole euro dans la valeur)
- Les dates au format ISO 8601 (YYYY-MM-DD)
- La TVA doit être extraite séparément du montant HT"""
    },
    {
        "role": "user",
        "content": """Extrayez les données de cette facture :

"FACTURE N° 2026-0847
Date : 15 mars 2026

De : CloudServ SAS
     42 rue de la Paix, 75002 Paris
     SIRET : 823 456 789 00012

À : TechCorp SARL
    12 avenue des Champs, 69001 Lyon

Désignation : Hébergement cloud - Pack Premium
Période : 01/03/2026 au 31/03/2026
Montant HT : 1 250,00 EUR
TVA 20% : 250,00 EUR
Total TTC : 1 500,00 EUR

Conditions de paiement : 30 jours fin de mois
IBAN : FR76 3000 4000 0500 0001 2345 678"

Schéma JSON :
{
  "numero_facture": "string",
  "date_facture": "string (YYYY-MM-DD)",
  "fournisseur": {
    "nom": "string",
    "adresse": "string",
    "siret": "string"
  },
  "client": {
    "nom": "string",
    "adresse": "string"
  },
  "lignes": [
    {
      "designation": "string",
      "periode": "string",
      "montant_ht": "number"
    }
  ],
  "tva_taux": "number",
  "tva_montant": "number",
  "total_ttc": "number",
  "conditions_paiement": "string",
  "iban": "string"
}"""
    },
    {
        "role": "assistant",
        "content": "{"
    }
]

response = client.chat.complete(
    model="mistral-large-latest",
    messages=messages,
    temperature=0.0,
    stop=["\n}"]
)
# Reconstruire le JSON : "{" + response + "\n}"

Résultat attendu

{
  "numero_facture": "2026-0847",
  "date_facture": "2026-03-15",
  "fournisseur": {
    "nom": "CloudServ SAS",
    "adresse": "42 rue de la Paix, 75002 Paris",
    "siret": "823 456 789 00012"
  },
  "client": {
    "nom": "TechCorp SARL",
    "adresse": "12 avenue des Champs, 69001 Lyon"
  },
  "lignes": [
    {
      "designation": "Hébergement cloud - Pack Premium",
      "periode": "01/03/2026 au 31/03/2026",
      "montant_ht": 1250.00
    }
  ],
  "tva_taux": 20,
  "tva_montant": 250.00,
  "total_ttc": 1500.00,
  "conditions_paiement": "30 jours fin de mois",
  "iban": "FR76 3000 4000 0500 0001 2345 678"
}

Remarquez l’utilisation du pré-remplissage assistant ("{") et de la stop sequence pour garantir un JSON valide.

Exercice 2 : Résumé structuré de document

Le contexte

Vous devez résumer des rapports longs pour un dashboard de veille interne. Chaque résumé doit suivre un format identique pour être affiché de manière uniforme.

Le prompt

messages = [
    {
        "role": "system",
        "content": """Vous produisez des résumés structurés pour un dashboard de veille.
Format obligatoire pour chaque résumé :
{
  "titre_court": "max 60 caractères",
  "resume": "max 3 phrases, factuel, sans opinion",
  "impact_business": "faible | moyen | élevé",
  "secteurs": ["liste des secteurs concernés"],
  "action_requise": true/false,
  "action_detail": "description si action requise, null sinon"
}"""
    },
    {
        "role": "user",
        "content": """Résumez cet article pour notre dashboard de veille :

"L'Union européenne a adopté le 28 mars 2026 un nouveau règlement sur
l'intelligence artificielle (AI Act 2.0) qui renforce les obligations de
transparence pour les systèmes de génération de texte et d'images. Les
entreprises qui déploient des modèles de plus de 10 milliards de paramètres
devront désormais publier un rapport d'évaluation des risques trimestriel et
mettre en place un système de traçabilité des contenus générés. Les sanctions
pour non-conformité peuvent atteindre 6% du chiffre d'affaires mondial annuel.
Le règlement entre en vigueur le 1er janvier 2027, avec une période de
transition de 6 mois pour les entreprises déjà en activité. Les PME de moins
de 50 salariés bénéficient d'un régime allégé avec des obligations réduites
de reporting."

Retournez le JSON structuré."""
    }
]

response = client.chat.complete(
    model="mistral-large-latest",
    messages=messages,
    temperature=0.1
)

Résultat attendu

{
  "titre_court": "AI Act 2.0 : nouvelles obligations de transparence IA",
  "resume": "L'UE adopte un renforcement de l'AI Act imposant des rapports trimestriels pour les grands modèles. Les sanctions atteignent 6% du CA mondial. Entrée en vigueur le 1er janvier 2027 avec régime allégé pour les PME.",
  "impact_business": "élevé",
  "secteurs": ["intelligence artificielle", "technologie", "réglementation"],
  "action_requise": true,
  "action_detail": "Évaluer la conformité de nos modèles et planifier la mise en place du reporting trimestriel avant janvier 2027."
}

Exercice 3 : Traduction technique avec préservation du format

Le contexte

Vous devez traduire de la documentation technique du français vers l’anglais en conservant exactement le formatage Markdown et les termes techniques qui ne doivent pas être traduits.

Le prompt

messages = [
    {
        "role": "system",
        "content": """Vous êtes un traducteur technique français vers anglais.

Règles :
- Conservez EXACTEMENT le formatage Markdown (titres, listes, code blocks)
- Ne traduisez PAS les termes entre backticks
- Ne traduisez PAS les noms de variables, fonctions ou paramètres
- Les blocs de code restent identiques (ne traduisez que les commentaires)
- Adaptez les expressions idiomatiques au contexte technique anglophone
- Utilisez l'anglais américain"""
    },
    {
        "role": "user",
        "content": """Traduisez ce passage de documentation :

## Configuration de l'API

Pour commencer, installez le package `mistralai` :

```bash
pip install mistralai

Authentification

Vous devez configurer votre clé API avant tout appel :

# Initialisation du client Mistral
client = Mistral(api_key="votre-clé")

Important : ne stockez jamais votre clé API en dur dans le code. Utilisez plutôt des variables d’environnement ou un gestionnaire de secrets.

Paramètres disponibles

  • temperature : contrôle la créativité (défaut : 0.7)
  • top_p : filtrage par probabilité cumulée (défaut : 1.0)
  • max_tokens : limite de tokens en sortie""" } ]

response = client.chat.complete( model=“mistral-large-latest”, messages=messages, temperature=0.2 )


### Résultat attendu

Le modèle doit produire une traduction fidèle où :
- Les titres Markdown (`##`, `###`) sont conservés
- Les termes entre backticks (`mistralai`, `temperature`, `top_p`, `max_tokens`) restent en anglais
- Les blocs de code sont identiques sauf le commentaire traduit
- Le formatage gras (`**Important**`) est préservé
- Les listes à puces gardent la même structure

## Techniques avancées pour l'extraction

### Validation côté code

Après extraction, validez toujours le JSON côté code :

```python
import json

try:
    data = json.loads(response.choices[0].message.content)
    # Validation des champs obligatoires
    required_fields = ["numero_facture", "date_facture", "total_ttc"]
    for field in required_fields:
        if field not in data or data[field] is None:
            print(f"Champ manquant : {field}")
except json.JSONDecodeError:
    print("Réponse invalide, relancer avec temperature=0")

Gestion des erreurs

Si le modèle ne retourne pas du JSON valide :

  1. Réessayez avec temperature=0.0
  2. Utilisez le pré-remplissage assistant pour forcer le format
  3. Ajoutez un exemple (one-shot) de la sortie attendue
  4. En dernier recours, parsez la réponse avec une regex pour extraire le JSON

Points clés à retenir

  • Le pré-remplissage assistant et les stop sequences garantissent un JSON valide
  • Fournissez toujours le schéma JSON exact dans le prompt
  • Température 0 pour l’extraction, 0.1-0.2 pour le résumé
  • Validez systématiquement la sortie côté code
  • Pour la traduction technique, listez explicitement ce qui ne doit pas être traduit