Obtenir du JSON avec l'IA : données structurées fiables

Prompts pour extraire factures et formulaires en JSON ou CSV, gérer les champs manquants et valider le résultat avant de l'envoyer dans un tableur.

5 min de lecture

Tiroirs étiquetés en bois vus de près
Photo : Tulane Public Relations · CC BY 2.0, recadrée

Tu demandes à l'IA de sortir les informations d'une facture « en JSON », et elle répond : « Bien sûr ! Voici le JSON demandé », suivi d'un bloc de code, puis d'une note qui explique ses choix. Le lendemain, le champ montant s'appelle total, la date passe en toutes lettres et le prix devient "125,50 €", une chaîne de caractères. Pour un humain, c'est lisible. Pour un script ou un tableur, c'est une panne.

JSON est un format texte qui range des données en paires nom et valeur. Tu n'as pas besoin de savoir programmer pour en profiter, et si ta destination est un tableur, le CSV fera encore plus simple. Dans les deux cas, le principe reste le même : tu décides du format à l'avance, sans marge d'interprétation.

Décrire le schéma au lieu de dire « en JSON »

Le mot « JSON » seul laisse le modèle libre de choisir la structure, les noms et les types. Il faut lui donner le moule complet. Prends un restaurateur qui veut suivre ses factures fournisseurs.

Avant :

Extrais les informations de cette facture en JSON.

Après :

Prompt
Extrais les données de la facture ci-dessous. Réponds uniquement avec un objet JSON valide, sans texte avant ni après et sans balises de code Markdown.

Respecte exactement cette structure et ces noms de champs :

{
  "fournisseur": "chaîne",
  "numero_facture": "chaîne",
  "date": "AAAA-MM-JJ",
  "total_ht": nombre,
  "total_ttc": nombre,
  "lignes": [
    { "designation": "chaîne", "quantite": nombre, "prix_unitaire_ht": nombre }
  ],
  "categorie": "boissons" | "frais" | "epicerie" | "autre"
}

Règles :
- Les nombres s'écrivent avec un point décimal, sans symbole de devise.
- Si une information est absente ou illisible, mets null. Ne devine jamais et ne la calcule pas.
- N'ajoute aucun champ.

Facture :
[TEXTE DE LA FACTURE]

Quatre choix font la différence. Le schéma est montré en entier, donc les noms de champs ne bougent plus. La date a un format non ambigu : 2026-03-04 ne se confond pas selon les pays. La catégorie est une liste fermée, ce qui évite d'avoir « Boissons », « boisson » et « Vins » dans le même fichier. Enfin, le null donne à l'IA une issue honnête quand l'information manque.

Les champs manquants, source de la plupart des erreurs

Quand un champ est obligatoire dans ton schéma et que l'information n'est pas dans le document, le modèle a tendance à en produire une. Un numéro de TVA peut apparaître là où il n'y en avait pas. Le JSON sera parfaitement valide et faux.

Deux précautions aident. La première, c'est la règle du null ci-dessus, pour chaque champ. La seconde, c'est de demander la preuve quand l'enjeu le justifie : ajoute un champ extrait_source qui recopie le passage d'où vient la valeur. Tu peux alors comparer rapidement sur un échantillon. Pour la logique générale, l'article pour réduire les hallucinations va plus loin.

Le cas le plus courant : un CSV pour Excel

Si ta destination est un tableur, oublie JSON : demande directement un CSV. Une difficulté française à connaître : avec des réglages régionaux français, Excel attend en général un point-virgule comme séparateur et une virgule pour les décimales. Un CSV avec des virgules peut donc s'ouvrir avec tout dans une seule colonne.

Exemple pour une trésorière d'association qui transforme des inscriptions reçues par e-mail, en données fictives ici :

Prompt
Transforme les messages ci-dessous en un tableau CSV, sans aucun texte autour et sans balises de code.

Paramètres :
- séparateur : point-virgule ;
- décimales : virgule ;
- première ligne, exactement : nom;prenom;activite;montant;moyen_paiement;a_verifier
- activite : parmi [LISTE DES ACTIVITÉS]
- moyen_paiement : cheque, virement, especes ou vide si non précisé.

Une ligne par personne inscrite. Si un message inscrit deux personnes, fais deux lignes. Si une information est absente ou ambiguë, laisse la case vide et mets « oui » dans a_verifier.

Messages :
[COLLE LES MESSAGES]

Colle le résultat dans un fichier .csv, ou dans ton tableur en passant par la fonction d'import de texte. Attention aux données personnelles : avant de coller les messages de vraies personnes, regarde ce qu'il ne faut pas mettre dans un chatbot et les conditions de ton offre.

Valider le résultat, à chaque fois

Une sortie structurée peut casser de trois manières : le texte n'est pas du JSON valide, la structure ne correspond pas au schéma, ou les valeurs sont fausses. Les deux premières se contrôlent automatiquement. Voici un script Python court qui s'arrête dès qu'un problème apparaît :

import json

CHAMPS = {"fournisseur", "numero_facture", "date", "total_ht",
          "total_ttc", "lignes", "categorie"}
CATEGORIES = {"boissons", "frais", "epicerie", "autre"}

def valider(reponse: str) -> dict:
    data = json.loads(reponse)  # plante si ce n'est pas du JSON
    if set(data) != CHAMPS:
        raise ValueError(f"Champs incorrects : {set(data) ^ CHAMPS}")
    if data["categorie"] not in CATEGORIES:
        raise ValueError(f"Catégorie inconnue : {data['categorie']}")
    ttc, ht = data["total_ttc"], data["total_ht"]
    if ttc is not None and ht is not None and ttc < ht:
        raise ValueError("Total TTC inférieur au total HT")
    return data

Le contrôle du TTC relève du bon sens métier, et il attrape des erreurs qu'aucun schéma ne verrait. Pour les valeurs, prévois un contrôle par sondage : compare dix documents à la main avant de faire confiance au traitement, puis quelques-uns de temps en temps.

Sans code, tu peux demander au modèle de te signaler les lignes suspectes dans une nouvelle conversation, mais il peut en rater. Une somme recalculée dans le tableur reste plus sûre.

Passer à l'API quand le volume monte

Si tu traites des dizaines de documents par un programme, le prompt seul n'est pas la meilleure solution. Les API des principaux fournisseurs proposent des options pour contraindre la sortie à un schéma JSON. Leurs noms et leurs garanties évoluent, regarde la documentation de ton fournisseur au moment où tu t'y mets. Ces options te garantissent une structure conforme, pas des valeurs justes : garde la règle du null et les contrôles métier.

Pour un flux en plusieurs étapes, une sortie JSON sert aussi de pont entre deux modèles ou deux prompts, comme dans une chaîne de prompts.

Fais l'essai sur trois documents réels

Choisis trois documents du même type, dont un mal fichu : une facture scannée, un message incomplet. Passe-les dans le prompt de ton choix avec un schéma de cinq champs seulement, puis compare chaque valeur à l'original. Le document mal fichu te dira quelles règles ajouter avant d'élargir le schéma.

Techniques avancées

Résumer et interroger de longs documents avec l'IA

Un PDF de 80 pages ne se traite pas comme un e-mail. Quand découper, comment obtenir des réponses sourcées, et comment repérer ce que l'IA a sauté.

5 min de lecture

Techniques avancées

Chaîner les prompts : découper une tâche complexe en étapes

Un seul prompt géant donne un résultat moyen partout. Exemple complet en quatre maillons sur un dossier de subvention, avec les contrôles à faire.

5 min de lecture

Techniques avancées

Faire écrire l'IA dans ton style : la méthode complète

« Écris comme moi » ne marche pas. Comment construire une fiche de style à partir de tes textes, et chasser les tics qui trahissent un texte généré.

5 min de lecture