Skip to main content
Un fine-tuning moyen avec de bonnes données vaut souvent mieux qu’un fine-tuning ambitieux sur un dataset confus. Si vous devez retenir une seule règle, c’est celle-ci : écrivez les exemples que vous voulez vraiment revoir à l’inférence.

Commencez simple : le format chat

Pour un modèle instruct, le format le plus simple à maintenir reste généralement un JSONL avec messages :
{"messages": [{"role": "user", "content": "Explique LoRA simplement."}, {"role": "assistant", "content": "LoRA ajoute de petits poids entraînables au lieu de réentraîner tout le modèle."}]}
{"messages": [{"role": "user", "content": "Résume ce texte en trois points."}, {"role": "assistant", "content": "- Point 1\n- Point 2\n- Point 3"}]}
Ce format est un bon point de départ parce qu’il ressemble à l’usage réel du modèle après entraînement.

Les autres formats utiles

Selon le workflow, vous verrez aussi :

Prompt / completion

{"prompt": "Traduis en anglais : Bonjour", "completion": "Hello"}

Texte brut

{"text": "MLX est un framework de machine learning orienté Apple Silicon."}
Ces formats existent, mais si vous n’avez pas de contrainte particulière, restez sur le format chat.

Organisation minimale des fichiers

data/
├── train.jsonl
└── valid.jsonl
  • train.jsonl : obligatoire
  • valid.jsonl : fortement recommandé
Sans validation, vous aurez plus de mal à détecter l’overfitting ou un dataset mal construit.

Ce qui fait un bon exemple

Un bon exemple :
  • correspond à un comportement que vous voulez réellement
  • est formulé clairement
  • ne se contredit pas avec les autres exemples
  • reste proche du niveau de détail attendu en production
Un mauvais exemple :
  • mélange plusieurs objectifs
  • donne une réponse floue ou approximative
  • force un style différent d’une ligne à l’autre
  • contient des erreurs que vous espérez “corriger plus tard”

Script simple pour générer un dataset

import json
import random

examples = [
    {
        "question": "Quand utiliser un modèle 4-bit ?",
        "answer": "Quand la mémoire est limitée et que vous voulez garder un workflow simple."
    },
    {
        "question": "À quoi sert LoRA ?",
        "answer": "À adapter un modèle sans réentraîner tous ses poids."
    },
]

random.shuffle(examples)
split = int(len(examples) * 0.8)

def to_chat(example):
    return {
        "messages": [
            {"role": "user", "content": example["question"]},
            {"role": "assistant", "content": example["answer"]},
        ]
    }

with open("data/train.jsonl", "w") as train_file:
    for item in examples[:split]:
        train_file.write(json.dumps(to_chat(item), ensure_ascii=False) + "\n")

with open("data/valid.jsonl", "w") as valid_file:
    for item in examples[split:]:
        valid_file.write(json.dumps(to_chat(item), ensure_ascii=False) + "\n")

Toujours valider les fichiers

Un JSONL cassé peut vous faire perdre du temps pour rien. Vérifiez systématiquement vos fichiers avant l’entraînement.
import json

def validate_jsonl(path):
    with open(path) as f:
        for line_number, line in enumerate(f, start=1):
            json.loads(line)
    print(f"{path} OK")

validate_jsonl("data/train.jsonl")
validate_jsonl("data/valid.jsonl")

Règles de qualité utiles

Gardez un style cohérent

Si vous voulez un assistant concis, toutes vos réponses d’entraînement doivent être concises.

Évitez les exemples trop longs

Des exemples très longs consomment vite le contexte et compliquent l’entraînement. Découpez-les si nécessaire.

Préférez la diversité utile à la quantité brute

Deux cents bons exemples couvrant bien votre cas d’usage valent souvent mieux que mille variantes répétitives.

Ne mélangez pas trop d’objectifs

Si vous voulez à la fois changer le ton, le format de sortie et la connaissance métier, vérifiez que votre dataset n’introduit pas trois comportements contradictoires.

Comment savoir si votre dataset est prêt

Posez-vous ces questions :
  1. Est-ce que chaque ligne ressemble à un vrai échange attendu plus tard ?
  2. Est-ce que la réponse est celle que vous aimeriez montrer à un utilisateur ?
  3. Est-ce qu’un autre développeur comprendrait le comportement visé en lisant dix lignes au hasard ?
Si la réponse est non, améliorez le dataset avant de lancer l’entraînement.