Préparer vos données d'entraînement
L’importance des données
La qualité de votre modèle fine-tuné dépend directement de la qualité de vos données d’entraînement. Un modèle entraîné sur des données médiocres produira des résultats médiocres, peu importe le nombre d’epochs ou les hyperparamètres choisis.
Cette leçon vous guide dans la collecte, la structuration et la préparation de vos données avant de les formater en JSONL.
Sources de données
Données existantes
La première source à explorer est votre historique :
- Logs de conversations : si vous utilisez déjà un chatbot ou un assistant, vos logs contiennent des exemples réels d’interactions
- Tickets support : les échanges client/support avec leurs résolutions forment d’excellents exemples
- Documents internes : guides de style, procédures, templates de réponses
- Évaluations humaines : les réponses que vos équipes ont validées ou corrigées
Données synthétiques
Quand vous n’avez pas assez de données réelles, vous pouvez en générer :
from openai import OpenAI
client = OpenAI()
def generer_exemple(sujet: str, style: str) -> dict:
"""Génère un exemple d'entraînement synthétique."""
response = client.responses.create(
model="gpt-5.4",
input=f"""Génère une conversation réaliste entre un utilisateur
et un assistant spécialisé en {sujet}.
L'assistant doit répondre dans un style {style}.
Format : un message utilisateur, puis la réponse idéale."""
)
return response
Attention : les données synthétiques doivent être vérifiées par un humain. Ne les utilisez pas en aveugle.
Combien de données faut-il ?
OpenAI recommande un minimum de 10 exemples, mais en pratique, 50 est le strict minimum pour observer une différence. Entre 100 et 500 exemples, vous obtiendrez des résultats fiables.
Structurer vos exemples
Chaque exemple doit représenter une interaction complète :
- Message système (optionnel) : définit le rôle et les contraintes de l’assistant
- Message utilisateur : la requête ou question
- Message assistant : la réponse idéale que vous voulez que le modèle apprenne
exemple = {
"messages": [
{
"role": "system",
"content": "Vous êtes un assistant juridique spécialisé en droit du travail français."
},
{
"role": "user",
"content": "Quel est le délai de préavis pour un CDI ?"
},
{
"role": "assistant",
"content": "Le délai de préavis pour un CDI dépend de votre ancienneté et de votre convention collective. En règle générale : moins de 6 mois d'ancienneté, le préavis est fixé par la convention collective ; entre 6 mois et 2 ans, il est d'1 mois ; au-delà de 2 ans, il est de 2 mois. Vérifiez toujours votre convention collective, qui peut prévoir des durées différentes."
}
]
}
Bonnes pratiques de préparation
Diversité des exemples
- Couvrez l’ensemble des cas d’usage que vous visez
- Incluez des cas limites et des questions ambiguës
- Variez la longueur des questions et des réponses
- Représentez les différents niveaux de difficulté
Cohérence
- Toutes les réponses doivent suivre le même style et le même format
- Si vous utilisez un message système, utilisez-le dans tous les exemples
- Les réponses doivent être celles que vous attendez réellement en production
Split train/validation
import json
import random
# Charger vos données
with open("donnees_completes.jsonl", "r") as f:
exemples = [json.loads(line) for line in f]
# Mélanger
random.shuffle(exemples)
# Séparer 80/20
split = int(len(exemples) * 0.8)
train = exemples[:split]
validation = exemples[split:]
# Sauvegarder
for nom, data in [("train.jsonl", train), ("validation.jsonl", validation)]:
with open(nom, "w") as f:
for ex in data:
f.write(json.dumps(ex, ensure_ascii=False) + "\n")
print(f"Train : {len(train)} exemples, Validation : {len(validation)} exemples")
Points clés à retenir
- La qualité prime sur la quantité — 100 exemples excellents valent mieux que 1 000 médiocres
- Vérifiez manuellement vos données synthétiques
- Séparez toujours un jeu de validation (20 %) pour évaluer objectivement
- Assurez la cohérence de style et de format dans tous vos exemples