Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Augmenter les données d'entraînement
Quand ton dataset de fine-tuning est trop petit (moins de 100 exemples), le modèle risque de sur-apprendre. Une technique classique c'est l'augmentation de données : tu prends tes exemples existants et tu en crées des variantes.
En NLP, l'augmentation est plus subtile qu'en vision (où tu peux tourner/flipper une image). Pour du texte, on peut : 1. Reformuler les questions avec des synonymes ou des tournures différentes 2. Ajouter ou retirer des politesses ("s'il te plaît", "merci") 3. Changer le registre (tu/vous, formel/informel)
Dans cet exercice, on va simuler l'augmentation avec un système de modèles (templates). Tu reçois une liste de reformulations pour chaque question, et tu multiplies les exemples.
Écris une fonction augmenter_dataset(exemples, reformulations) qui prend : 1. Une liste d'exemples au format messages (chacun avec au moins un user et un assistant) 2. Un dictionnaire de reformulations : les clés sont les questions originales, les valeurs sont des listes de reformulations
Pour chaque exemple, si la question user a des reformulations disponibles, la fonction crée des copies de l'exemple avec chaque reformulation (en gardant la même réponse assistant). L'exemple original est toujours conservé.
La fonction renvoie la liste augmentée.
Exemple :
exemples = [ {"messages": [{"role": "user", "content": "Salut"}, {"role": "assistant", "content": "Bonjour !"}]} ] reformulations = {"Salut": ["Coucou", "Hey"]} augmenter_dataset(exemples, reformulations) renvoie 3 exemples : l'original avec "Salut", plus un avec "Coucou" et un avec "Hey" (tous avec la même réponse "Bonjour !")
exemples = [{'messages': [{'role': 'user', 'content': 'Salut'}, {'role': 'assistant', 'content': 'Bonjour !'}]}]
reformulations = {'Salut': ['Coucou']}
r = augmenter_dataset(exemples, reformulations)
assert r[0]['messages'][0]['content'] == 'Salut', 'L original doit être le premier'
Réponse préservée
exemples = [{'messages': [{'role': 'user', 'content': 'Q'}, {'role': 'assistant', 'content': 'R'}]}]
reformulations = {'Q': ['Q2']}
r = augmenter_dataset(exemples, reformulations)
assert all(ex['messages'][-1]['content'] == 'R' for ex in r), 'La réponse assistant doit rester la même'
Sans reformulation
exemples = [{'messages': [{'role': 'user', 'content': 'Test'}, {'role': 'assistant', 'content': 'Ok'}]}]
reformulations = {}
r = augmenter_dataset(exemples, reformulations)
assert len(r) == 1, 'Sans reformulation, on garde juste l original'
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
def augmenter_dataset(exemples, reformulations):
résultat = []
for ex in exemples:
résultat.append(ex)
# Trouver l'index du message user
idx_user = None
question = None
for i, msg in enumerate(ex["messages"]):
if msg["role"] == "user":
idx_user = i
question = msg["content"]
break
if question is None or question not in reformulations:
continue
for variante in reformulations[question]:
nouveau = {"messages": []}
for i, msg in enumerate(ex["messages"]):
if i == idx_user:
nouveau["messages"].append({"role": "user", "content": variante})
else:
nouveau["messages"].append({"role": msg["role"], "content": msg["content"]})
résultat.append(nouveau)
return résultat