Ressources/Entraînement du modèle/Préparation des données

Concept

Fichiers d'entraînement JSONL

Le format JSONL (JSON Lines) est un fichier texte contenant un objet JSON complet par ligne. C'est le format standard pour les données de réglage fin : une ligne correspond à un enregistrement d'entraînement.

Chapitre 54 min de lecture5 références

Définition

JSON est la méthode la plus courante pour écrire des données structurées sous forme de texte : les objets entre accolades, les listes entre crochets, les clés et les valeurs entre guillemets. JSONL, également appelé JSON Lines ou JSON délimité par des retours à la ligne, ajoute une règle supplémentaire : chaque ligne du fichier est une valeur JSON complète et valide, et les lignes sont séparées par un saut de ligne. Pour les données d'entraînement, chaque valeur est un objet contenant un exemple.

train.jsonl
1{"messages":[{"role":"system","content":"You are…"},{"role":"user","content":"How do I reset my password?"},{"role":"assistant","content":"Open Settings → Security…"}]}
2{"messages":[{"role":"user","content":"Hi"},{"role":"assistant","content":"Hello! How can I help?","weight":0},{"role":"user","content":"Export my report as PDF"},{"role":"assistant","content":"Open the report, click Export → PDF…","weight":1}]}
3{"messages":[{"role":"system","content":"You are…"},{"role":"user","content":"Can I change my plan mid-month?"},{"role":"assistant","content":"Yes. The difference is prorated…"}]}
…une ligne par enregistrement, pas de virgules entre les lignes, pas de [ ] autour
{ … }un objet JSON complet = un enregistrement d'entraînement"messages"la conversation, dans l'ordre"role"qui l'a dit : système, utilisateur ou assistant"weight"apprendre cette réponse (1) ou seulement la lire (0)\nun saut de ligne termine l'enregistrement
Un fichier JSONL est une pile d'objets JSON indépendants, à raison d'un par ligne. Chaque ligne peut être lue, vérifiée, comptée ou mélangée individuellement, c'est pourquoi tous les principaux services de fine-tuning l'utilisent.

Pourquoi l'entraînement l'utilise

  • Lecture en continu : un fournisseur peut lire un fichier de plusieurs gigaoctets ligne par ligne au lieu de le charger et de l'analyser dans son intégralité.
  • Indépendance : les enregistrements peuvent être comptés, mélangés, divisés en ensembles d'entraînement et de validation, ou échantillonnés sans analyser le reste du fichier.
  • Erreurs claires : un enregistrement malformé interrompt une seule ligne, et le message d'erreur peut l'identifier (« ligne 482 : fin de saisie inattendue »).
  • Extensible : ajouter des exemples signifie ajouter des lignes ; rien d'autre ne change dans le fichier.

Les règles et les erreurs de fichiers

La spécification JSON Lines comporte trois règles : le fichier est en UTF-8, chaque ligne est une valeur JSON valide et chaque ligne se termine par un caractère de saut de ligne. Il est fortement recommandé de terminer le fichier par un saut de ligne. Presque tous les fichiers d'entraînement corrompus enfreignent l'une de ces règles :

erreurs courantes dans un fichier
✗ {"messages": [ ...          ← a pretty-printed object split over lines
     {"role": "user", ... } ]}
✗ [ {"messages": ...}, {"messages": ...} ]   ← a JSON array, not one object per line
✗ {"messages": [...]},        ← trailing comma
✗                             ← a blank line in the middle
✓ {"messages":[...]}          ← one complete object, then a line break

Les sauts de ligne dans le texte d'un message ne posent pas de problème, car JSON les stocke sous forme échappée (une barre oblique inversée suivie d'un n) dans la chaîne de caractères. Ce qui ne doit pas se produire, c'est un véritable saut de ligne au milieu d'un objet — ce qui est exactement ce que fait le formatage d'un fichier pour en faciliter la lecture.

Même format, structures différentes

Tous les principaux services de réglage fin acceptent le format JSONL, mais chacun définit son propre schéma pour le contenu d'une ligne. Certains utilisent une liste messages avec les rôles system, user et assistant ; d'autres placent l'invite système dans un champ distinct ; d'autres encore appellent la liste contents et le rôle de l'assistant model ; certains prennent en charge un poids (weight) sur chaque message de l'assistant afin que les réponses précédentes ne servent que de contexte.

un exemple, trois formats de fournisseurs
// chat "messages" (with an optional weight per assistant reply)
{"messages":[{"role":"user","content":"Hi"},{"role":"assistant","content":"Hello!","weight":0},{"role":"user","content":"Export as PDF"},{"role":"assistant","content":"Open the report, click Export → PDF.","weight":1}]}

// "contents" with user / model roles
{"contents":[{"role":"user","parts":[{"text":"Export as PDF"}]},{"role":"model","parts":[{"text":"Open the report, click Export → PDF."}]}]}

// separate system field
{"system":"You are a support assistant.","messages":[{"role":"user","content":"Export as PDF"},{"role":"assistant","content":"Open the report, click Export → PDF."}]}

Lorsqu'un format n'a pas de poids par message, une conversation à tours multiples avec plusieurs cibles est écrite sous la forme d'un enregistrement par cible, chacun étant coupé juste après sa réponse cible. Dans ces enregistrements, les réponses précédentes de l'assistant sont également apprises, car le format n'a aucun moyen de les marquer uniquement comme contexte.

Exemple pratique : une conversation, deux fichiers
  1. Une conversation comporte quatre messages : « Bonjour », une salutation, « Exporter mon rapport en PDF », et les instructions. Seules les instructions sont marquées comme cible.
  2. Pour un fournisseur qui prend en charge les poids : une seule ligne, avec la salutation à weight: 0 et les instructions à weight: 1.
  3. Pour un fournisseur sans prise en charge des poids : également une seule ligne, se terminant aux instructions. Si la salutation avait aussi été une cible, il y aurait eu deux lignes — l'une se terminant à la salutation, l'autre aux instructions — et la salutation aurait été apprise deux fois.
  4. Les deux fichiers contiennent le même texte nettoyé et expurgé. Seul l'encapsulage diffère.

Erreurs courantes

  • Formater un fichier d'entraînement pour que chaque objet s'étende sur plusieurs lignes.
  • Enregistrer un tableau JSON d'enregistrements et le nommer .jsonl.
  • Modifier manuellement un fichier dans un outil qui modifie l'encodage ou ajoute des guillemets typographiques, ce qui corrompt le JSON.
  • Réutiliser le fichier d'un fournisseur avec un autre fournisseur : le format est le même, mais le schéma interne ne l'est pas.

Références et lectures complémentaires

Les sources externes s'ouvrent dans un nouvel onglet.

  1. 01JSON Linesjsonlines.org · jsonlines.orgLa spécification courte : UTF-8, une valeur par ligne, un saut de ligne entre elles.
  2. 02RFC 8259: The JavaScript Object Notation (JSON) Data Interchange FormatIETF · RFC Editor · rfc-editor.orgLa norme JSON elle-même, y compris la façon dont les chaînes de caractères échappent les sauts de ligne.
  3. 03Supervised fine-tuningOpenAI API docs · developers.openai.comLa structure `messages` du chat.
  4. 04Prepare supervised fine-tuning data for Gemini modelsGoogle Cloud documentation · docs.cloud.google.comLa structure `contents` avec les rôles utilisateur et modèle.
  5. 05Prepare data for fine-tuning your modelsAmazon Bedrock User Guide · docs.aws.amazon.comLes structures avec un champ système distinct, ainsi que les limites par modèle.

Transformez des semaines de travail d'expert en quelques minutes

Découvrez comment Scalata s'adapte à votre équipe, à vos données et à vos contrôles.

Contacter le service commercial