Exercices Entraîner son LLM Auditer la qualité d'un dataset
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Auditer la qualité d'un dataset

Avant d'envoyer ton dataset à OpenAI, tu ne vérifies pas juste le format. Tu vérifies la qualité. Un dataset qui passe la validation de format peut quand même produire un mauvais modèle si les données sont pourries : des exemples dupliqués, des réponses trop courtes pour que le modèle apprenne quoi que ce soit, un system prompt incohérent entre les exemples, ou une conversation où les rôles n'arrivent pas dans le bon ordre.

Dans un vrai pipeline de fine-tuning professionnel, l'audit qualité vérifie plusieurs choses au-delà du simple format :

Structure des rôles : les messages doivent suivre un ordre logique. Le premier message doit être "system" (le contexte), suivi d'au moins une paire "user" puis "assistant". Si le premier message est "assistant", ça n'a pas de sens : le modèle ne peut pas répondre avant qu'on lui pose une question.

Détection des doublons : si deux exemples ont exactement la même question user, le modèle va sur-apprendre sur cette question. C'est du gaspillage de tokens (et d'argent).

Longueur des réponses : une réponse assistant de 2 mots ("ok merci") n'apprend rien au modèle. OpenAI recommande des réponses d'au moins 20-30 mots pour que le fine-tuning soit efficace.

Écris une fonction auditer_dataset(exemples, min_tokens=10) qui prend une liste d'exemples au format messages et un nombre minimum de tokens (on approxime : 1 token = 4 caractères). La fonction renvoie un dictionnaire avec :
- "total" : nombre total d'exemples
- "valides" : nombre d'exemples sans aucun problème
- "erreurs_structure" : nombre d'exemples avec un problème de structure (pas de clé messages, messages vide, rôles manquants, pas d'assistant)
- "erreurs_ordre" : nombre d'exemples où le premier message n'est pas "system" ou où un "assistant" arrive avant tout "user"
- "doublons" : nombre de doublons détectés (même contenu user)
- "reponses_courtes" : nombre d'exemples où la réponse assistant fait moins de min_tokens tokens estimés
- "details" : liste de dicts {"index": i, "problemes": ["..."]} pour chaque exemple problématique

Exemple :

data = [
{"messages": [{"role": "system", "content": "Tu es un expert."}, {"role": "user", "content": "Salut"}, {"role": "assistant", "content": "Bonjour, comment puis-je t'aider aujourd'hui ?"}]},
{"messages": [{"role": "user", "content": "Salut"}, {"role": "assistant", "content": "Ok"}]},
]
r = auditer_dataset(data, min_tokens=5)
r["erreurs_ordre"] renvoie 1 (le deuxième exemple ne commence pas par system)
r["doublons"] renvoie 1 (même question "Salut")
r["reponses_courtes"] renvoie 1 (la réponse "Ok" est trop courte)

Tests (5/6)

Exemple parfait
data = [{'messages': [{'role': 'system', 'content': 'Tu es un expert.'}, {'role': 'user', 'content': 'Question ?'}, {'role': 'assistant', 'content': 'Voici une réponse détaillée qui fait au moins quarante caractères pour passer le filtre.'}]}]
r = auditer_dataset(data, min_tokens=5)
assert r['valides'] == 1
assert r['erreurs_structure'] == 0
assert r['erreurs_ordre'] == 0
Détecte les doublons
data = [
    {'messages': [{'role': 'system', 'content': 's'}, {'role': 'user', 'content': 'Salut'}, {'role': 'assistant', 'content': 'Bonjour, comment vas-tu ?  Bienvenue chez nous.'}]},
    {'messages': [{'role': 'system', 'content': 's'}, {'role': 'user', 'content': 'Salut'}, {'role': 'assistant', 'content': 'Hey ! Comment ça va ? Tout roule pour toi ?'}]}
]
r = auditer_dataset(data, min_tokens=5)
assert r['doublons'] == 1
Détecte l'ordre des rôles
data = [{'messages': [{'role': 'user', 'content': 'Q'}, {'role': 'assistant', 'content': 'Réponse assez longue pour le test de tokens.'}]}]
r = auditer_dataset(data, min_tokens=3)
assert r['erreurs_ordre'] >= 1
assert any('system' in p.lower() for d in r['details'] for p in d['problemes'])
Détecte les réponses courtes
data = [{'messages': [{'role': 'system', 'content': 's'}, {'role': 'user', 'content': 'Q'}, {'role': 'assistant', 'content': 'Ok'}]}]
r = auditer_dataset(data, min_tokens=5)
assert r['reponses_courtes'] == 1
Structure invalide
data = [{'data': 'mauvais'}, {'messages': []}]
r = auditer_dataset(data)
assert r['erreurs_structure'] == 2
assert r['valides'] == 0

+ 0 tests cachés

Indices (3 disponibles)

solution.py