Exercices Entraîner son LLM Nettoyer les données d'entraînement
🎉

Bravo!

Débutant 🧠 Fondamentaux 10 XP 0 personnes ont réussi

Nettoyer les données d'entraînement

Dans un vrai projet de fine-tuning, tes données brutes ne sont jamais propres. Tu récupères des conversations depuis un export Slack, un CRM ou un fichier CSV rempli à la main. Résultat : des doublons, des exemples trop courts pour être utiles, des textes avec des espaces en trop partout.

Le nettoyage, c'est l'étape la plus ingrate mais aussi la plus importante. Un modèle entraîné sur des données sales apprend du bruit. "Garbage in, garbage out" comme on dit.

Voici ce que ta fonction de nettoyage doit faire :

1. Supprimer les doublons : si deux exemples ont exactement la même question utilisateur, on ne garde que le premier.
2. Filtrer les exemples trop courts : si la réponse de l'assistant fait moins de min_length caractères, on la jette.
3. Filtrer les exemples trop longs : si la réponse de l'assistant dépasse max_length caractères, on la jette aussi.
4. Nettoyer les espaces : appliquer strip() sur le contenu de chaque message.

Écris une fonction nettoyer_dataset(exemples, min_length=10, max_length=2000) qui prend une liste d'exemples au format messages et renvoie un dictionnaire avec deux clés : "propres" (la liste nettoyée) et "stats" (un dictionnaire avec le nombre de doublons supprimés, trop courts, et trop longs).

Chaque exemple a le format {"messages": [{"role": "...", "content": "..."}, ...]}.

Pour détecter les doublons, compare le contenu du premier message "user" de chaque exemple.
Pour la longueur, regarde le contenu du dernier message "assistant".

Exemple :

data = [
{"messages": [{"role": "user", "content": "Salut"}, {"role": "assistant", "content": "Bonjour, comment vas-tu ?"}]},
{"messages": [{"role": "user", "content": "Salut"}, {"role": "assistant", "content": "Hey !"}]},
{"messages": [{"role": "user", "content": "Aide"}, {"role": "assistant", "content": "Ok"}]}
]
nettoyer_dataset(data, min_length=5)
renvoie {"propres": [premier exemple seulement], "stats": {"doublons": 1, "trop_courts": 1, "trop_longs": 0}}

Tests (4/5)

Supprime les doublons
data = [
    {'messages': [{'role': 'user', 'content': 'Salut'}, {'role': 'assistant', 'content': 'Bonjour ami !'}]},
    {'messages': [{'role': 'user', 'content': 'Salut'}, {'role': 'assistant', 'content': 'Hey salut à toi !'}]}
]
r = nettoyer_dataset(data, min_length=5)
assert len(r['propres']) == 1
assert r['stats']['doublons'] == 1
Filtre trop courts
data = [
    {'messages': [{'role': 'user', 'content': 'Test'}, {'role': 'assistant', 'content': 'Ok'}]},
    {'messages': [{'role': 'user', 'content': 'Autre'}, {'role': 'assistant', 'content': 'Voici une réponse suffisamment longue'}]}
]
r = nettoyer_dataset(data, min_length=10)
assert len(r['propres']) == 1
assert r['stats']['trop_courts'] == 1
Filtre trop longs
data = [
    {'messages': [{'role': 'user', 'content': 'Q1'}, {'role': 'assistant', 'content': 'a' * 100}]}
]
r = nettoyer_dataset(data, max_length=50)
assert len(r['propres']) == 0
assert r['stats']['trop_longs'] == 1
Nettoie les espaces
data = [
    {'messages': [{'role': 'user', 'content': '  Salut  '}, {'role': 'assistant', 'content': '  Bienvenue à toi  '}]}
]
r = nettoyer_dataset(data, min_length=5)
assert r['propres'][0]['messages'][0]['content'] == 'Salut'
assert r['propres'][0]['messages'][1]['content'] == 'Bienvenue à toi'

+ 0 tests cachés

Indices (3 disponibles)

solution.py