IA pour développeurs · Tutoriel
Mistral : obtenir du JSON fiable avec les sorties structurées
Extraire des champs d'une facture ou d'un courriel n'a d'intérêt que si la réponse du modèle est exploitable par un programme. L'API de Mistral propose deux mécanismes pour cela : un mode JSON simple et des sorties structurées sur schéma. Lequel choisir et comment les écrire.
Par Kayzen AI · · 3 min de lecture

Un modèle de langage répond en texte libre. C'est gênant dès qu'il devient un maillon d'une chaîne automatisée : le programme qui reçoit la réponse attend des champs précis, pas une phrase. L'API de Mistral offre deux réponses à ce problème, de la plus souple à la plus stricte.
Option 1 : le mode JSON
On ajoute à l'appel le paramètre response_format avec la valeur {"type": "json_object"} :
import os
from mistralai.client import Mistral
client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
chat_response = client.chat.complete(
model="mistral-large-latest",
messages=[{
"role": "user",
"content": "What is the best French meal? Return the name and the ingredients in short JSON object.",
}],
response_format={"type": "json_object"},
)
D'après la documentation, la réponse est alors un objet JSON valide quel que soit le contenu du prompt. Mais « valide » ne veut pas dire « conforme à ce que vous attendez » : rien n'impose les noms des champs ni leur type. Mistral recommande d'ailleurs de demander explicitement du JSON dans le prompt et d'y décrire le format voulu. Le champ content de la réponse contient le JSON sous forme de chaîne de caractères, à décoder ensuite.
Option 2 : les sorties structurées sur schéma
Ici, on fournit le schéma attendu. En Python, il se décrit avec une classe Pydantic, puis on appelle client.chat.parse au lieu de client.chat.complete :
from pydantic import BaseModel
class Book(BaseModel):
name: str
authors: list[str]
chat_response = client.chat.parse(
model="ministral-8b-latest",
messages=[
{"role": "system", "content": "Extract the books information."},
{"role": "user", "content": "I recently read 'To Kill a Mockingbird' by Harper Lee."},
],
response_format=Book,
max_tokens=256,
temperature=0,
)
Le résultat, lu dans chat_response.choices[0].message.content, respecte le schéma :
{
"authors": ["Harper Lee"],
"name": "To Kill a Mockingbird"
}
La documentation indique que le kit Python donne aussi accès à une version déjà convertie en objet. Des équivalents existent en TypeScript, avec la bibliothèque Zod, et en appel HTTP direct, avec un schéma JSON.
Lequel choisir
La position de Mistral est nette : les sorties structurées sur schéma sont présentées comme plus fiables et recommandées chaque fois que c'est possible. Le mode JSON reste utile quand la forme de la réponse doit rester libre, par exemple quand les champs varient d'un document à l'autre.
Ce qu'il faut savoir avant de s'y fier
- Une ligne est ajoutée à votre prompt. Avec la méthode sur schéma, la documentation précise qu'une consigne demandant un objet JSON conforme est systématiquement placée en tête du prompt système. À garder en tête si vous comptez vos jetons ou si vous déboguez un comportement inattendu.
- Le schéma ne remplace pas les consignes. Mistral conseille d'ajouter des explications et d'itérer sur le prompt système. Un champ nommé
datene dit pas s'il s'agit de la date d'émission ou d'échéance. - Conforme ne veut pas dire exact. Le schéma garantit la forme, pas la justesse du contenu. Un montant mal lu sera rendu dans un champ numérique parfaitement valide.
- La liste des modèles compatibles est à vérifier. La page y consacre une question de sa FAQ ; contrôlez-la pour le modèle que vous visez. L'exemple officiel utilise
ministral-8b-latest, un petit modèle.
Notre lecture
Pour une PME, c'est la brique qui rend réaliste l'extraction automatique depuis des factures, des bons de commande ou des courriels. Partez du schéma sur Pydantic plutôt que du mode JSON : vous obtenez du même coup la validation des types côté Python. Fixez temperature=0 comme dans l'exemple officiel, prévoyez max_tokens assez large pour ne pas couper l'objet en cours de route, et gardez un contrôle humain par échantillonnage sur les champs qui engagent de l'argent. Le choix d'un éditeur français peut aussi simplifier la discussion sur l'hébergement des données, à confirmer selon votre contrat.