Aller au contenu principal

Exemples pratiques du JSON Mode

Mettre le JSON Mode en pratique

Maintenant que vous savez activer le JSON Mode, passons à des cas concrets. Cette leçon présente trois scénarios courants avec du code complet en Python et TypeScript.

Cas 1 : Extraction d’entités

L’extraction d’entités depuis du texte non structuré est l’un des cas d’usage les plus fréquents. Voici comment extraire des informations de contact depuis un email :

from mistralai import Mistral
import json

client = Mistral(api_key="votre-clé-api")

email_text = """
Bonjour,
Je suis Marie Dupont, directrice commerciale chez TechVision SAS.
Vous pouvez me joindre au 06 12 34 56 78 ou par email à [email protected].
Notre siège est au 42 rue de la Paix, 75002 Paris.
Cordialement,
Marie
"""

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": """Extrais les informations de contact du texte fourni.
Retourne un JSON avec les clés : name, title, company, phone, email, address.
Si une information est absente, utilise null."""
        },
        {"role": "user", "content": email_text}
    ],
    response_format={"type": "json_object"},
    temperature=0
)

contact = json.loads(response.choices[0].message.content)
print(f"Nom : {contact['name']}")
print(f"Entreprise : {contact['company']}")
print(f"Téléphone : {contact['phone']}")

Sortie attendue :

{
  "name": "Marie Dupont",
  "title": "Directrice commerciale",
  "company": "TechVision SAS",
  "phone": "06 12 34 56 78",
  "email": "[email protected]",
  "address": "42 rue de la Paix, 75002 Paris"
}

Cas 2 : Classification de texte

La classification est un autre cas d’usage naturel. Voici un classifieur de tickets de support :

tickets = [
    "Mon paiement a été débité deux fois, j'exige un remboursement immédiat !",
    "Comment puis-je changer mon mot de passe ?",
    "Votre application plante à chaque fois que j'ouvre l'onglet paramètres.",
]

for ticket in tickets:
    response = client.chat.complete(
        model="mistral-small-latest",
        messages=[
            {
                "role": "system",
                "content": """Classifie le ticket de support.
Retourne un JSON avec :
- category: "billing", "account", "technical", "feature_request" ou "other"
- priority: "low", "medium", "high" ou "critical"
- sentiment: "positive", "neutral" ou "negative"
- summary: résumé en une phrase"""
            },
            {"role": "user", "content": ticket}
        ],
        response_format={"type": "json_object"},
        temperature=0
    )

    result = json.loads(response.choices[0].message.content)
    print(f"Catégorie: {result['category']} | Priorité: {result['priority']} | Sentiment: {result['sentiment']}")

L’équivalent TypeScript :

import Mistral from "@mistralai/mistralai";

const client = new Mistral({ apiKey: "votre-clé-api" });

const ticket = "Mon paiement a été débité deux fois !";

const response = await client.chat.complete({
  model: "mistral-small-latest",
  messages: [
    {
      role: "system",
      content: `Classifie le ticket de support.
Retourne un JSON avec : category, priority, sentiment, summary.`,
    },
    { role: "user", content: ticket },
  ],
  responseFormat: { type: "json_object" },
  temperature: 0,
});

const result = JSON.parse(response.choices[0].message.content!);
console.log(`Catégorie: ${result.category}`);
console.log(`Priorité: ${result.priority}`);

Cas 3 : Conversion de format

Convertir du texte libre en données structurées pour une base de données :

texte_produit = """
Le MacBook Pro 16 pouces avec puce M4 Pro est disponible à partir de 2 799 €.
Il dispose de 24 Go de RAM unifiée, d'un SSD de 512 Go, et d'un écran Liquid Retina XDR.
Disponible en Noir Sidéral et Argent. Livraison gratuite sous 3-5 jours.
"""

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": """Convertis la description produit en fiche structurée.
JSON avec : name, brand, price_eur (nombre), specs (objet avec ram_gb, storage_gb, screen),
colors (liste), delivery_days_min, delivery_days_max, free_shipping (booléen)."""
        },
        {"role": "user", "content": texte_produit}
    ],
    response_format={"type": "json_object"},
    temperature=0
)

produit = json.loads(response.choices[0].message.content)
print(json.dumps(produit, indent=2, ensure_ascii=False))

Résultat :

{
  "name": "MacBook Pro 16 pouces",
  "brand": "Apple",
  "price_eur": 2799,
  "specs": {
    "ram_gb": 24,
    "storage_gb": 512,
    "screen": "Liquid Retina XDR"
  },
  "colors": ["Noir Sidéral", "Argent"],
  "delivery_days_min": 3,
  "delivery_days_max": 5,
  "free_shipping": true
}

Traitement par lots

Pour traiter plusieurs éléments en une seule requête, demandez au modèle de retourner une liste :

textes = [
    "Excellent produit, je recommande !",
    "Livraison en retard, produit abîmé.",
    "Correct pour le prix, rien d'exceptionnel."
]

response = client.chat.complete(
    model="mistral-small-latest",
    messages=[
        {
            "role": "system",
            "content": "Analyse le sentiment de chaque avis. Retourne un JSON avec une clé 'reviews' contenant une liste d'objets {text, sentiment, score}. Le score va de -1.0 (très négatif) à 1.0 (très positif)."
        },
        {"role": "user", "content": "\n---\n".join(textes)}
    ],
    response_format={"type": "json_object"},
    temperature=0
)

reviews = json.loads(response.choices[0].message.content)["reviews"]
for r in reviews:
    print(f"[{r['score']:+.1f}] {r['sentiment']}{r['text'][:40]}...")

Points clés à retenir

  • Le JSON Mode excelle pour l’extraction, la classification et la conversion de données
  • Utilisez le system prompt pour définir la structure attendue et les types
  • temperature=0 assure des résultats reproductibles
  • Le traitement par lots en une seule requête est possible en demandant une liste JSON
  • Parsez toujours la réponse avec json.loads() / JSON.parse() avant d’accéder aux données