DPO (Direct Preference Optimization)
Qu’est-ce que le DPO ?
Le DPO (Direct Preference Optimization) est une méthode de fine-tuning qui enseigne au modèle à préférer certaines réponses à d’autres. Au lieu de montrer uniquement la bonne réponse, vous montrez une paire : une réponse préférée et une réponse non préférée. Le modèle apprend à maximiser la probabilité de la première tout en minimisant celle de la seconde.
DPO vs fine-tuning supervisé
| Aspect | Supervisé (SFT) | DPO |
|---|---|---|
| Données | La bonne réponse uniquement | Paire : réponse préférée + non préférée |
| Objectif | Apprendre à imiter | Apprendre à discriminer |
| Cas d'usage | Format, style, classification | Ton subtil, sécurité, alignement |
| Données nécessaires | 50+ exemples | 50+ paires de préférences |
Quand utiliser le DPO
Le DPO est particulièrement utile quand :
- Les nuances comptent : la différence entre une bonne et une excellente réponse est subtile
- Vous voulez éviter certains comportements : le modèle doit apprendre ce qu’il ne faut PAS faire
- L’alignement est critique : sécurité, conformité, ton de marque
- Vous avez des préférences humaines : des évaluateurs ont classé des réponses A vs B
Format des données DPO
Le format utilise la méthode dpo avec des paires preferred / non_preferred :
{
"method": "dpo",
"input": [
{
"role": "system",
"content": "Vous êtes un assistant commercial professionnel."
},
{
"role": "user",
"content": "Votre produit est trop cher."
}
],
"preferred_output": [
{
"role": "assistant",
"content": "Je comprends votre préoccupation sur le prix. Notre solution inclut le support premium, les mises à jour illimitées et une garantie de disponibilité 99,9 %. Comparé aux alternatives qui facturent ces services séparément, notre rapport qualité-prix est très compétitif. Puis-je vous montrer une analyse comparative ?"
}
],
"non_preferred_output": [
{
"role": "assistant",
"content": "Ce n'est pas cher du tout, c'est le prix du marché. Si vous ne pouvez pas vous le permettre, nous avons un plan basique."
}
]
}
Préparer un fichier DPO
Script de création
import json
paires = [
{
"method": "dpo",
"input": [
{"role": "system", "content": "Assistant support client bienveillant."},
{"role": "user", "content": "Votre service ne marche pas !"}
],
"preferred_output": [
{
"role": "assistant",
"content": "Je suis désolé pour ce désagrément. Pouvez-vous me décrire le problème que vous rencontrez ? Je vais faire mon maximum pour le résoudre rapidement."
}
],
"non_preferred_output": [
{
"role": "assistant",
"content": "Ça marche très bien chez tout le monde. Avez-vous essayé de redémarrer votre ordinateur ?"
}
]
},
{
"method": "dpo",
"input": [
{"role": "system", "content": "Assistant support client bienveillant."},
{"role": "user", "content": "Je veux un remboursement."}
],
"preferred_output": [
{
"role": "assistant",
"content": "Je comprends votre demande. Pouvez-vous me donner votre numéro de commande ? Je vais vérifier votre éligibilité au remboursement et vous guider dans la procédure."
}
],
"non_preferred_output": [
{
"role": "assistant",
"content": "Les remboursements ne sont pas possibles après 14 jours. Lisez les CGV."
}
]
}
]
with open("dpo_training.jsonl", "w", encoding="utf-8") as f:
for paire in paires:
f.write(json.dumps(paire, ensure_ascii=False) + "\n")
print(f"Fichier DPO créé : {len(paires)} paires")
Lancer un fine-tuning DPO
from openai import OpenAI
client = OpenAI()
# Upload du fichier DPO
fichier = client.files.create(
file=open("dpo_training.jsonl", "rb"),
purpose="fine-tune"
)
# Créer le job avec la méthode DPO
job = client.fine_tuning.jobs.create(
training_file=fichier.id,
model="gpt-5.4-mini",
method={
"type": "dpo",
"dpo": {
"hyperparameters": {
"beta": 0.1 # Contrôle la force de la préférence
}
}
},
suffix="dpo-support-v1"
)
print(f"Job DPO : {job.id}")
Le paramètre beta
Le beta contrôle la force de la régularisation DPO :
- beta faible (0.05-0.1) : le modèle s’éloigne davantage du modèle de base pour suivre les préférences
- beta élevé (0.2-0.5) : le modèle reste plus proche du modèle de base, changements conservateurs
Bonnes pratiques DPO
Qualité des paires
- Les deux réponses doivent être plausibles — la non préférée ne doit pas être absurde
- La différence doit être claire mais pas caricaturale
- Variez les types de situations couvertes
Cohérence des préférences
- Définissez clairement vos critères de préférence avant de commencer
- Utilisez plusieurs évaluateurs et gardez les paires où ils sont d’accord
- Documentez vos critères pour pouvoir reproduire les évaluations
Combiner SFT et DPO
La stratégie la plus efficace est souvent de combiner les deux :
- Phase 1 : fine-tuning supervisé pour enseigner le format et le style de base
- Phase 2 : DPO sur le modèle déjà fine-tuné pour affiner les nuances
Points clés à retenir
- Le DPO enseigne au modèle à préférer certaines réponses sur d’autres
- Le format utilise des paires preferred/non_preferred
- Le paramètre
betacontrôle l’équilibre entre préférences et stabilité - Le DPO est idéal pour les nuances de ton, la sécurité et l’alignement
- Combiner SFT puis DPO donne souvent les meilleurs résultats