Sortie structurée
La sortie structurée permet au modèle de renvoyer des données dans le format JSON que vous spécifiez, idéale pour l’extraction de données, l’étiquetage de classification, le remplissage de formulaires et d’autres scénarios.
JSON Mode
La méthode la plus simple de sortie structurée, forçant le modèle à renvoyer du JSON valide :
Python
from openai import OpenAI
client = OpenAI(
base_url="https://api.ofox.ai/v1",
api_key="<votre OFOXAI_API_KEY>"
)
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[
{"role": "system", "content": "Vous êtes un assistant d'extraction de données. Retournez les résultats au format JSON."},
{"role": "user", "content": "Extrayez le nom, l'entreprise et le poste du texte suivant : Jean Dupont est ingénieur senior chez Google"}
],
response_format={"type": "json_object"}
)
import json
result = json.loads(response.choices[0].message.content)
print(result)
# {"name": "Jean Dupont", "company": "Google", "title": "ingénieur senior"}Lors de l’utilisation du JSON Mode, le system prompt doit contenir le mot-clé « JSON », sinon certains modèles peuvent ignorer l’exigence de format.
Contrainte avec JSON Schema
Contrôlez la structure de sortie avec plus de précision, en vous assurant que les noms et types de champs correspondent aux attentes :
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[
{"role": "user", "content": "Analysez le sentiment de cet avis : Ce produit est incroyable, très facile à utiliser !"}
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "sentiment_analysis",
"schema": {
"type": "object",
"properties": {
"sentiment": {
"type": "string",
"enum": ["positive", "negative", "neutral"],
"description": "Tendance du sentiment"
},
"confidence": {
"type": "number",
"description": "Confiance 0-1"
},
"keywords": {
"type": "array",
"items": {"type": "string"},
"description": "Mots-clés de sentiment"
}
},
"required": ["sentiment", "confidence", "keywords"],
"additionalProperties": False
}
}
}
)Sortie :
{
"sentiment": "positive",
"confidence": 0.95,
"keywords": ["incroyable", "facile à utiliser"]
}Scénarios d’application pratique
Extraction de données
# Extraire des données structurées à partir de texte non structuré
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{
"role": "user",
"content": """Extrayez les informations de la commande suivante :
Le client Jean Dupont a passé commande le 15 janvier 2025 de 3 MacBook Pro,
prix unitaire 1 999 EUR, adresse de livraison : 123 rue de Rivoli, Paris"""
}],
response_format={
"type": "json_schema",
"json_schema": {
"name": "order_info",
"schema": {
"type": "object",
"properties": {
"customer": {"type": "string"},
"date": {"type": "string"},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"quantity": {"type": "integer"},
"unit_price": {"type": "number"}
}
}
},
"address": {"type": "string"}
},
"required": ["customer", "date", "items", "address"]
}
}
}
)Étiquetage de classification
# Classification multi-étiquettes
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{
"role": "user",
"content": "Classifiez le thème de cet article : La technologie IA s'applique de plus en plus dans le domaine médical..."
}],
response_format={
"type": "json_schema",
"json_schema": {
"name": "classification",
"schema": {
"type": "object",
"properties": {
"primary_category": {"type": "string"},
"secondary_categories": {
"type": "array",
"items": {"type": "string"}
},
"tags": {
"type": "array",
"items": {"type": "string"}
}
},
"required": ["primary_category"]
}
}
}
)Modèles compatibles
| Modèle | JSON Mode | JSON Schema |
|---|---|---|
openai/gpt-4o | ✅ | ✅ |
openai/gpt-4o-mini | ✅ | ✅ |
anthropic/claude-sonnet-4.5 | ✅ | — |
google/gemini-3-flash-preview | ✅ | ✅ |
Les modèles qui ne supportent pas JSON Schema peuvent obtenir un effet similaire en décrivant en détail le format JSON souhaité dans le system prompt.