Exercices Entraîner son LLM Convertir des données brutes en JSONL
🎉

Bravo!

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

Convertir des données brutes en JSONL

En pratique, tes données d'entraînement ne tombent jamais du ciel au bon format. Tu les récupères depuis un fichier CSV, une base de données, un export Notion ou un Google Sheet. La première chose à faire, c'est les convertir au format JSONL attendu par OpenAI.

Le format JSONL (JSON Lines), c'est un fichier texte où chaque ligne est un objet JSON indépendant. Pas de virgules entre les lignes, pas de crochets englobants. Chaque ligne se suffit à elle-même.

{"messages": [{"role": "system", "content": "..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
{"messages": [{"role": "system", "content": "..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}

La conversion depuis un CSV est très courante. Imagine un fichier CSV avec deux colonnes : "question" et "reponse". Chaque ligne devient un exemple d'entraînement avec un message system (toujours le même), un message user (la question) et un message assistant (la réponse).

Écris une fonction csv_vers_jsonl(lignes_csv, system_prompt) qui prend :
1. Une liste de dictionnaires (comme ce que donne csv.DictReader) avec les clés "question" et "reponse"
2. Un system prompt qui sera le même pour tous les exemples

La fonction renvoie une chaîne au format JSONL : chaque ligne est un exemple d'entraînement complet au format messages.

Exemple :

lignes = [
{"question": "C'est quoi Python ?", "reponse": "Un langage de programmation."},
{"question": "Et Django ?", "reponse": "Un framework web Python."}
]
csv_vers_jsonl(lignes, "Tu es un prof.")
renvoie deux lignes JSONL, chacune avec les trois messages system/user/assistant

Tests (4/5)

Conversion basique
import json
lignes = [{'question': 'Salut', 'reponse': 'Bonjour !'}]
r = csv_vers_jsonl(lignes, 'Sois sympa.')
obj = json.loads(r)
assert obj['messages'][0] == {'role': 'system', 'content': 'Sois sympa.'}
assert obj['messages'][1] == {'role': 'user', 'content': 'Salut'}
assert obj['messages'][2] == {'role': 'assistant', 'content': 'Bonjour !'}
Plusieurs lignes JSONL
import json
lignes = [{'question': 'Q1', 'reponse': 'R1'}, {'question': 'Q2', 'reponse': 'R2'}]
r = csv_vers_jsonl(lignes, 'sys')
resultat = r.split('\n')
assert len(resultat) == 2, 'Deux lignes CSV doivent donner deux lignes JSONL'
for l in resultat:
    obj = json.loads(l)
    assert len(obj['messages']) == 3
Liste vide
r = csv_vers_jsonl([], 'sys')
assert r == '', 'Aucune ligne CSV doit donner une chaîne vide'
Chaque ligne est du JSON valide
import json
lignes = [{'question': f'Q{i}', 'reponse': f'R{i}'} for i in range(5)]
r = csv_vers_jsonl(lignes, 'test')
for l in r.split('\n'):
    obj = json.loads(l)
    assert 'messages' in obj
    roles = [m['role'] for m in obj['messages']]
    assert roles == ['system', 'user', 'assistant']

+ 0 tests cachés

Indices (3 disponibles)

solution.py