Réponse courte
L’ajustement fin entraîne une copie privée d’un modèle GPT-3 sur vos propres exemples, chacun formé d’un prompt et de la complétion voulue, pour que le modèle apprenne votre tâche et votre style au lieu de les lire dans un long prompt à chaque fois. Depuis le 14 décembre 2021, tous les clients de l’API d’OpenAI peuvent le faire avec un fichier JSONL et une seule commande.
Question de suivi Quand l’ajustement fin vaut-il mieux qu’un prompt?
Jusqu’ici, la plupart des gens enseignaient une tâche à GPT-3 comme le décrivait l’article de recherche d’origine : en écrivant quelques exemples dans le prompt et en laissant le modèle poursuivre la régularité. Le 14 décembre, OpenAI a ouvert une autre voie à tous les clients de son API. Vous pouvez maintenant faire l’ajustement fin (fine-tuning) de GPT-3, c’est-à-dire entraîner une version personnalisée de l’un de ses modèles sur un fichier de vos propres exemples, puis appeler cette version par l’API comme n’importe quelle autre.
L’idée est ancienne en apprentissage automatique. Un modèle apprend d’abord des régularités générales à partir d’une énorme quantité de texte, puis reçoit un entraînement supplémentaire sur une tâche précise. Ce qui est nouveau, c’est la facilité qu’OpenAI y a apportée : un fichier de données, une commande dans son outil en ligne de commande, et une attente qui peut se compter en minutes pour les petites tâches.
Ce que change l’ajustement fin
Avec un prompt, les poids du modèle (les milliards de nombres appris pendant l’entraînement) restent fixes. Vos exemples se trouvent dans l’entrée, occupent la fenêtre de 2 048 jetons et doivent être envoyés, et payés, à chaque requête. Avec l’ajustement fin, les exemples servent à modifier une copie des poids. Le savoir passe du prompt au modèle.
OpenAI énumère trois avantages pratiques. Vous pouvez fournir beaucoup plus d’exemples qu’il n’en tient dans un prompt. Les résultats deviennent plus constants : un client a fait passer ses résultats peu fiables de 17 % à 5 %. Et comme le modèle personnalisé connaît déjà la tâche, les prompts peuvent être beaucoup plus courts, ce qui réduit les coûts et accélère les réponses. OpenAI rapporte aussi que des gains apparaissent avec moins de 100 exemples, et que chaque doublement du jeu de données tend à apporter une nouvelle amélioration régulière.
Les données : des paires prompt-complétion en JSONL
Les données d’entraînement vont dans un fichier JSONL, pour JSON Lines : un fichier texte simple où chaque ligne est un exemple, écrit sous forme d’un petit objet JSON à deux champs, prompt et completion. Les carnets d’exemples d’OpenAI ajoutent quelques conventions qui comptent :
- Terminez chaque prompt par le même séparateur, comme une ligne qui contient
###, pour que le modèle apprenne où l’entrée s’arrête. - Commencez chaque complétion par une espace, parce que la plupart des mots sont stockés sous forme de jetons qui commencent par une espace.
- Terminez chaque complétion par le même marqueur, pour pouvoir dire à l’API de s’arrêter là.
L’outil en ligne de commande d’OpenAI comprend un vérificateur, openai tools fine_tunes.prepare_data, qui lit votre fichier, signale les problèmes et peut le séparer en un ensemble d’entraînement et un ensemble de validation, pour que vous puissiez mesurer les résultats sur des exemples que le modèle n’a jamais vus.
Un exemple concret : des réponses au soutien technique
Imaginez une petite entreprise de logiciels qui veut des réponses courtes, fidèles à sa marque, aux courriels de soutien les plus fréquents. Elle exporte d’anciens billets auxquels son personnel a bien répondu, retire les noms et les numéros de compte, et les écrit sous forme de paires :
{"prompt": "Client : On m’a facturé deux fois mon abonnement de novembre.\n\n###\n\n", "completion": " Désolé pour cet ennui! Je vois le double paiement et j’ai demandé un remboursement. Il devrait apparaître sur votre carte d’ici quelques jours ouvrables. END"}
{"prompt": "Client : Comment est-ce que j’exporte mes données vers un tableur?\n\n###\n\n", "completion": " Allez dans Paramètres, puis Données, et choisissez Exporter en CSV. Le fichier se téléchargera aussitôt. END"}
{"prompt": "Client : L’application me déconnecte toutes les quelques minutes.\n\n###\n\n", "completion": " Merci de nous le signaler. Veuillez installer la dernière version et vous reconnecter; si le problème continue, répondez à ce message et nous examinerons votre compte. END"}Un vrai fichier en contiendrait quelques centaines. L’entraînement se fait ensuite en une seule commande, openai api fine_tunes.create -t replies.jsonl -m ada, où -m choisit le modèle de base; la démonstration d’OpenAI utilise Ada, le plus petit et le moins cher, mais on peut choisir un modèle plus grand. Quand la tâche est terminée, l’outil affiche le nom du modèle personnalisé. Pour l’utiliser, envoyez un nouveau message de client qui se termine par le même séparateur, réglez le marqueur d’arrêt sur END, et le modèle écrit une réponse dans le style appris. Une personne devrait quand même relire les réponses avant leur envoi.
La partie coûteuse est rarement l’entraînement lui-même; la tâche de démonstration d’OpenAI sur son plus petit modèle a coûté un cent. Le vrai coût, ce sont les données : trouver de bonnes réponses passées, retirer les renseignements personnels, corriger les exemples incohérents et mettre de côté un ensemble de test. C’est un travail qualifié, et c’est lui qui détermine la qualité du résultat.
À essayer : rassemblez dix questions auxquelles vous répondez souvent, par courriel ou au travail, et écrivez chacune avec votre meilleure réponse sous forme de paire prompt-complétion, avec le séparateur et le marqueur END ci-dessus. Même si vous n’entraînez jamais de modèle, vous verrez à quel point vos propres exemples sont cohérents, ou incohérents.
Quand l’ajustement fin vaut-il mieux qu’un prompt?
Commencez par un prompt. Si une consigne claire et quelques exemples donnent de bons résultats, vous avez terminé, et vous pouvez changer d’approche en quelques secondes. Le prompt convient aussi aux tâches qui changent souvent, parce que mettre à jour un modèle ajusté exige de préparer de nouvelles données et de l’entraîner de nouveau.
L’ajustement fin devient rentable quand vous avez une tâche stable et répétée, et beaucoup de bons exemples. La classification en est un cas classique : le carnet d’OpenAI entraîne le petit modèle Ada à trier des courriels sportifs entre baseball et hockey, et atteint environ 99 % d’exactitude sur des exemples mis de côté. Il aide aussi quand vous avez besoin d’un format ou d’un ton constant sur des milliers de requêtes, quand votre meilleur prompt est devenu si long qu’il coûte cher, ou quand vos exemples ne tiennent tout simplement pas dans 2 048 jetons. L’annonce d’OpenAI mentionne un client qui ajoute environ 500 nouveaux exemples par semaine et qui a fait passer son exactitude de 85 % à 93 %.
Une règle pratique utile : si vous vous surprenez à coller le même long bloc d’exemples dans chaque requête, et que d’autres bons exemples vous attendent, c’est le moment d’essayer l’ajustement fin. Gardez un ensemble de validation pour pouvoir montrer que le modèle personnalisé bat vraiment votre meilleur prompt.
Sources
- Customizing GPT-3 for Your Application — OpenAI, 14 décembre 2021
- Fine tuning classification example (openai-python examples) — OpenAI (GitHub), 21 décembre 2021
- Language Models are Few-Shot Learners — OpenAI (arXiv), 28 mai 2020