> ## Documentation Index
> Fetch the complete documentation index at: https://docsmlx.otterly.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Préparer vos données

> Construire un dataset lisible, cohérent et exploitable pour un fine-tuning MLX

Un fine-tuning moyen avec de bonnes données vaut souvent mieux qu'un fine-tuning ambitieux sur un dataset confus.

Si vous devez retenir une seule règle, c'est celle-ci : **écrivez les exemples que vous voulez vraiment revoir à l'inférence**.

***

## Commencez simple : le format chat

Pour un modèle instruct, le format le plus simple à maintenir reste généralement un JSONL avec `messages` :

```jsonl theme={null}
{"messages": [{"role": "user", "content": "Explique LoRA simplement."}, {"role": "assistant", "content": "LoRA ajoute de petits poids entraînables au lieu de réentraîner tout le modèle."}]}
{"messages": [{"role": "user", "content": "Résume ce texte en trois points."}, {"role": "assistant", "content": "- Point 1\n- Point 2\n- Point 3"}]}
```

Ce format est un bon point de départ parce qu'il ressemble à l'usage réel du modèle après entraînement.

***

## Les autres formats utiles

Selon le workflow, vous verrez aussi :

### Prompt / completion

```jsonl theme={null}
{"prompt": "Traduis en anglais : Bonjour", "completion": "Hello"}
```

### Texte brut

```jsonl theme={null}
{"text": "MLX est un framework de machine learning orienté Apple Silicon."}
```

Ces formats existent, mais si vous n'avez pas de contrainte particulière, restez sur le format chat.

***

## Organisation minimale des fichiers

```text theme={null}
data/
├── train.jsonl
└── valid.jsonl
```

* `train.jsonl` : obligatoire
* `valid.jsonl` : fortement recommandé

Sans validation, vous aurez plus de mal à détecter l'overfitting ou un dataset mal construit.

***

## Ce qui fait un bon exemple

Un bon exemple :

* correspond à un comportement que vous voulez réellement
* est formulé clairement
* ne se contredit pas avec les autres exemples
* reste proche du niveau de détail attendu en production

Un mauvais exemple :

* mélange plusieurs objectifs
* donne une réponse floue ou approximative
* force un style différent d'une ligne à l'autre
* contient des erreurs que vous espérez "corriger plus tard"

***

## Script simple pour générer un dataset

```python theme={null}
import json
import random

examples = [
    {
        "question": "Quand utiliser un modèle 4-bit ?",
        "answer": "Quand la mémoire est limitée et que vous voulez garder un workflow simple."
    },
    {
        "question": "À quoi sert LoRA ?",
        "answer": "À adapter un modèle sans réentraîner tous ses poids."
    },
]

random.shuffle(examples)
split = int(len(examples) * 0.8)

def to_chat(example):
    return {
        "messages": [
            {"role": "user", "content": example["question"]},
            {"role": "assistant", "content": example["answer"]},
        ]
    }

with open("data/train.jsonl", "w") as train_file:
    for item in examples[:split]:
        train_file.write(json.dumps(to_chat(item), ensure_ascii=False) + "\n")

with open("data/valid.jsonl", "w") as valid_file:
    for item in examples[split:]:
        valid_file.write(json.dumps(to_chat(item), ensure_ascii=False) + "\n")
```

***

## Toujours valider les fichiers

Un JSONL cassé peut vous faire perdre du temps pour rien. Vérifiez systématiquement vos fichiers avant l'entraînement.

```python theme={null}
import json

def validate_jsonl(path):
    with open(path) as f:
        for line_number, line in enumerate(f, start=1):
            json.loads(line)
    print(f"{path} OK")

validate_jsonl("data/train.jsonl")
validate_jsonl("data/valid.jsonl")
```

***

## Règles de qualité utiles

### Gardez un style cohérent

Si vous voulez un assistant concis, toutes vos réponses d'entraînement doivent être concises.

### Évitez les exemples trop longs

Des exemples très longs consomment vite le contexte et compliquent l'entraînement. Découpez-les si nécessaire.

### Préférez la diversité utile à la quantité brute

Deux cents bons exemples couvrant bien votre cas d'usage valent souvent mieux que mille variantes répétitives.

### Ne mélangez pas trop d'objectifs

Si vous voulez à la fois changer le ton, le format de sortie et la connaissance métier, vérifiez que votre dataset n'introduit pas trois comportements contradictoires.

***

## Comment savoir si votre dataset est prêt

Posez-vous ces questions :

1. Est-ce que chaque ligne ressemble à un vrai échange attendu plus tard ?
2. Est-ce que la réponse est celle que vous aimeriez montrer à un utilisateur ?
3. Est-ce qu'un autre développeur comprendrait le comportement visé en lisant dix lignes au hasard ?

Si la réponse est non, améliorez le dataset avant de lancer l'entraînement.

***

<CardGroup cols={2}>
  <Card title="Guide LoRA" icon="dumbbell" href="/mlx/fine-tuning/lora-guide">
    Lancer un premier fine-tuning.
  </Card>

  <Card title="Tips & astuces" icon="lightbulb" href="/mlx/fine-tuning/tips-and-tricks">
    Éviter les pièges fréquents.
  </Card>
</CardGroup>
