Aller au contenu principal

Format des données : conversations JSONL

Le format JSONL

JSONL (JSON Lines) est le format requis par l’API OpenAI pour le fine-tuning. Chaque ligne du fichier est un objet JSON indépendant représentant un exemple d’entraînement complet.

{"messages": [{"role": "system", "content": "..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
{"messages": [{"role": "system", "content": "..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}

Règle fondamentale : une ligne = un objet JSON = un exemple. Pas de retour à la ligne dans l’objet JSON lui-même.

Structure d’une conversation

Chaque exemple est un objet avec une clé messages contenant un tableau de messages. Chaque message a un role et un content :

Les rôles

  • system : instructions globales pour l’assistant (optionnel, mais recommandé)
  • user : le message de l’utilisateur
  • assistant : la réponse que le modèle doit apprendre à produire

Exemple minimal

{
  "messages": [
    {"role": "user", "content": "Bonjour, comment allez-vous ?"},
    {"role": "assistant", "content": "Bonjour ! Je suis prêt à vous aider. Que puis-je faire pour vous ?"}
  ]
}

Exemple avec message système

{
  "messages": [
    {
      "role": "system",
      "content": "Vous êtes un assistant commercial pour TechCorp. Répondez de manière concise et professionnelle. Proposez toujours un rendez-vous de démonstration."
    },
    {
      "role": "user",
      "content": "Je cherche une solution de CRM pour mon équipe de 50 personnes."
    },
    {
      "role": "assistant",
      "content": "Notre CRM TechCorp est conçu pour les équipes de 20 à 200 personnes, avec gestion des contacts, pipeline de vente et reporting intégré. Pour une équipe de 50, je vous recommande le plan Business à 29 €/utilisateur/mois. Souhaitez-vous planifier une démonstration personnalisée cette semaine ?"
    }
  ]
}

Conversations multi-tours

Vous pouvez inclure des conversations à plusieurs échanges. Le modèle apprend à maintenir la cohérence sur plusieurs tours :

{
  "messages": [
    {
      "role": "system",
      "content": "Vous êtes un assistant technique pour une API de paiement."
    },
    {
      "role": "user",
      "content": "Comment intégrer votre API de paiement ?"
    },
    {
      "role": "assistant",
      "content": "L'intégration se fait en 3 étapes : 1) Installer le SDK avec pip install paycorp-sdk, 2) Configurer votre clé API, 3) Créer votre premier paiement. Par quelle étape voulez-vous commencer ?"
    },
    {
      "role": "user",
      "content": "Comment configurer la clé API ?"
    },
    {
      "role": "assistant",
      "content": "Récupérez votre clé dans le dashboard (Settings > API Keys), puis configurez-la dans votre code :\n\nfrom paycorp import PayCorp\nclient = PayCorp(api_key=\"votre_clé\")\n\nUtilisez la clé de test (préfixe sk_test_) en développement et la clé live (sk_live_) en production. Ne commitez jamais vos clés dans le code source."
    }
  ]
}

Pondération avec weight

Vous pouvez indiquer au modèle quels messages assistant sont les plus importants en ajoutant un champ weight :

{
  "messages": [
    {"role": "user", "content": "Résume ce document."},
    {"role": "assistant", "content": "Voici le résumé...", "weight": 1}
  ]
}

Un weight de 0 signifie que le modèle ne s’entraînera pas sur ce message assistant spécifique (utile dans les conversations multi-tours où seul le dernier tour compte). La valeur par défaut est 1.

Script de création de fichier JSONL

import json

def creer_fichier_jsonl(exemples: list[dict], chemin: str):
    """Crée un fichier JSONL à partir d'une liste d'exemples."""
    with open(chemin, "w", encoding="utf-8") as f:
        for exemple in exemples:
            ligne = json.dumps(exemple, ensure_ascii=False)
            f.write(ligne + "\n")
    print(f"Fichier créé : {chemin} ({len(exemples)} exemples)")

# Vos exemples
exemples = [
    {
        "messages": [
            {"role": "system", "content": "Assistant support client TechCorp."},
            {"role": "user", "content": "Mon compte est bloqué."},
            {"role": "assistant", "content": "Je comprends votre frustration. Pour débloquer votre compte, j'ai besoin de votre adresse email d'inscription. Je vais vérifier le statut et vous guider dans la procédure de réactivation."}
        ]
    },
    {
        "messages": [
            {"role": "system", "content": "Assistant support client TechCorp."},
            {"role": "user", "content": "Comment changer mon mot de passe ?"},
            {"role": "assistant", "content": "Pour changer votre mot de passe : allez dans Paramètres > Sécurité > Modifier le mot de passe. Entrez votre mot de passe actuel, puis le nouveau (minimum 12 caractères, avec majuscule, chiffre et caractère spécial). Confirmez et cliquez sur Enregistrer."}
        ]
    }
]

creer_fichier_jsonl(exemples, "training_data.jsonl")

Erreurs fréquentes à éviter

  • Oublier le retour à la ligne entre chaque objet JSON
  • JSON mal formé : guillemets manquants, virgules en trop
  • Messages vides : un content vide provoque une erreur de validation
  • Rôles incorrects : seuls system, user et assistant sont acceptés
  • Encodage : utilisez toujours UTF-8 avec ensure_ascii=False

Points clés à retenir

  • Une ligne JSONL = un objet JSON = une conversation complète
  • Chaque conversation contient au minimum un message user et un message assistant
  • Le message system est optionnel mais recommandé pour la cohérence
  • Utilisez weight: 0 pour exclure certains tours d’entraînement dans les conversations multi-tours
  • Validez toujours votre fichier JSONL avant de l’uploader