Aller au contenu principal

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 :

  1. Phase 1 : fine-tuning supervisé pour enseigner le format et le style de base
  2. 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 beta contrô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