In einem Update haben wir euch schon davon berichtet, dass es aktuell möglich ist, das GPT-4o Mini Modell bei OpenAI mit bis zu 2.000.000 Token pro Tag kostenlose zu finetunen – noch bis zum 23. September. Das hat viele von euch interessiert und deshalb kommt jetzt unser Tutorial zur Feinabstimmung der OpenAI Modelle, in dem wir euch Schritt für Schritt zeigen, wie das Ganze funktioniert, was man dafür braucht und wie gut es am Ende funktioniert.
Keine Angst: OpenAI macht es uns da mittlerweile relativ leicht und wir müssen nicht einmal mehr die Kommandozeile verwenden, sondern können alles direkt auf der Website machen. Die einzige kleine Schwierigkeit ist die Erstellung einer sogenannten jsonl-Datei, aber das werden wir gleich Schritt für Schritt mit euch durchgehen.
- Was ist Finetuning überhaupt?
- Voraussetzungen: Was braucht man für das Finetuning eines GPT-Modells?
- Erstellen von Trainingsdaten und Beispielen
- So erstellt man eine .jsonl Datei für das Modelltraining aus reinem Text
- So erstellt man einen neuen Finetuning-Job bei OpenAI
- Testen des eigenen abgestimmten Modells nach dem Training
- Markdown-Format korrekt darstellen
- Überblick über die Kosten für Anfragen und Finetuning von GPT-4o
- Für wen ist das Finetuning sinnvoll? Was sind gute Anwendungen?
Was ist Finetuning überhaupt?
Aber was ist das Finetuning überhaupt: Was bringt das und für wen eignet sich das? Entgegen einem relativ verbreiteten Irrglauben trainieren wir beim Finetuning einem KI-Modell nicht zwangsläufig unser Wissen an, also geben der KI zum Beispiel alle unsere Dokumente und dann weiß der Bot später darüber Bescheid.
Das Finetuning besteht eigentlich darin, dass wir einem bestehenden, allgemein gut aufgestellten Modell, wie eben beispielsweise GPT-4o oder der Mini-Version viele verschiedene Beispiele von Prompts, inklusive der von uns gewünschten Antworten geben und so das Modell in eine Richtung trainieren, dass es immer so antwortet, wie wir das eben möchten.
Man kann es sich ein bisschen vorstellen, wie einen extrem umfangreichen Systemprompt oder benutzerdefinierte Anweisungen an das Modell. Aber im Gegensatz dazu, wird diese Anweisung eben direkt in ein “neues” Modell, das wir sozusagen trainieren integriert und je nachdem, wie viele und wie gute Beispiele wir bei diesem Training verwenden, entstehen so KI-Modelle bei denen man sich sehr stark darauf verlassen kann, dass sie genau so antworten wie man es gerne haben will.
Ganz grundlegend sind gute Anwendungsfälle unter anderem den Ton, Stil oder das Format einer Antwort vorzugeben oder die Zuverlässigkeit zu erhöhen, dass die gewünschten Ergebnisse produziert werden.
Voraussetzungen: Was braucht man für das Finetuning eines GPT-Modells?
Die gute Nachricht zuerst: Eigentlich ist es mittlerweile wirklich unglaublich einfach mithilfe von Finetuning ein eigenes Modell bei OpenAI zu trainieren. Im Prinzip braucht man dazu nur die folgenden Dinge:
- Einen OpenAI-Account
- Trainingsdaten in Form einer .jsonl-Datei
OpenAI selbst hat auch einen englischsprachigen Artikel in der eigenen Dokumentation, der den gesamten Prozess erklärt, diesen findet man hier. Aber auch hier werden wir jetzt alle Schritte gemeinsam durchgehen.
Streng genommen müssen im OpenAI Account Zahlungsinformationen hinterlegt sein, bzw. man kann auch einfach in einem Pre-Paid-Verfahren ein bisschen Geld in den Account einzahlen. Bis zum 23. September 2024 ist das Training mit bis zu 2.000.000 Token pro Tag kostenlos (ein mehr als ausreichendes Kontingent), und auch danach sind die Kosten, die wir hier dargestellt haben, überschaubar. Mit wenigen Cents kann man hier ein Modell trainieren.
Der eigentliche Punkt, an dem wir ein bisschen Guthaben benötigen kommt beim Ausprobieren und Verwenden der trainierten Modelle – auch hier ist aber nur mit Cent-Beträgen für die Anfragen zu rechnen.
Erstellen von Trainingsdaten und Beispielen
Die Trainingsdaten, die wir für das Finetuning benötigen müssen in einem ganz bestimmten Format hochgeladen werden. das sieht dabei am Ende für ein Beispiel so aus:
{"messages": [{"role": "system", "content": "Marvin ist ein sarkastischer Chatbot."}, {"role": "user", "content": "Was ist die Hauptstadt von Frankreich?"}, {"role": "assistant", "content": "Paris, als ob das nicht sowieso jeder wüsste..."}]}
Auf den ersten Blick komplex, aber eigentlich ganz einfach aufgeschlüsselt. Jedes Beispiel für das Training ist ein sogenanntes „Messages“-Objekt, also eine Nachricht. Diese beinhaltet drei Teile:
- Einen Systemprompt: „Marvin ist ein sarkastischer Chatbot.“
- Eine User-Anfrage: „Was ist die Haupstadt von Frankreich?“
- Eine Antwort der KI: „Paris, als ob das nicht sowieso jeder wüsste…“
Wir zeigen dem KI-Modell dabei alles genauso, wie wir es am Ende haben wollen. Für diesen Systemprompt, mit dieser Anfrage eines Users, erwarten wir genau diese Antwort. Und jetzt nehmen wir nicht nur ein solches Beispiel, sondern erstellen jede Menge davon und das sind dann die Daten, aufgrund derer das allgemeine, schon existierende Modell angepasst wird.
OpenAI gibt an, dass man mindestens 10 Beispiele verwenden sollte und für die meisten Anwendungen zwischen 50 und 100 Beispielen schon gute Ergebnisse und deutliche Verbesserungen des allgemeinen Modells zu erreichen sind.
Hier kommt auch der eigentlich aufwendige Part des Finetunings ins Spiel, denn diese Beispiele müssen wir natürlich selbst und vor allem auch gewissenhaft erstellen. Die Qualität eines feinabgestimmten Modells hängt zu einem sehr großen Teil von der Qualität der übergebenen Trainingsdaten ab, dieser Schritt ist also extrem wichtig.
Man kann natürlich die Trainingsdaten direkt im jsonl-Format schreiben, aber wir arbeiten gerne zunächst einfach mit einem Textdokument, um ein bisschen mehr Übersicht zu haben. Das sieht dann zum Beispiel so aus.
In diesem Dokument stehen einfach unsere Beispiele als reiner Text. So können wir das aber für das Finetuning nicht nutzen und deshalb müssen wir daraus jetzt eine .jsonl-Datei erstellen.
So erstellt man eine .jsonl Datei für das Modelltraining aus reinem Text
Um unsere Trainingsdaten in das von OpenAI benötigte .jsonl-Format zu bekommen gibt es im Prinzip zwei Möglichkeiten. Möglichkeit eins ist es das ganze manuell zu machen. Wir kennen das benötigte Format:
{"messages": [{"role": "system", "content": "..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
{"messages": [{"role": "system", "content": "..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
{"messages": [{"role": "system", "content": "..."}, {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
...
Hier müssten wir dann einfach jeweils die Informationen eintragen und das am Ende mit der Dateiendung .jsonl abspeichern.
Alternativ können wir uns aber KI zunutze machen, wir haben sehr gute Ergebnisse mit dem Claude-Chatbot erzielen können. Dafür haben wir, genau auf unser Beispiel zugeschnitten den folgenden Prompt verwendet, den man hier einfach kopieren kann:
Prompt zum Kopieren
Bitte konvertiere diesen Plaintext in ein JSONL-Format (JSON Lines). Jeder Eintrag sollte ein JSON-Objekt in einer einzigen Zeile sein. Das JSON-Objekt sollte ein ‚messages‘ Array enthalten mit drei Objekten: eines für ’system‘, eines für ‚user‘ und eines für ‚assistant‘. Jedes dieser Objekte sollte ‚role‘ und ‚content‘ Felder haben. Der ‚content‘ des assistant-Objekts sollte die Vor- und Nachteile als Markdown-formatierter Text enthalten, mit ‚# [Thema]‘ als Überschrift der ersten Ebene und ‚## Vorteile‘ und ‚## Nachteile‘ als Überschriften der zweiten Ebene. Die Listeneinträge sollten mit Ziffern und Punkten formatiert sein. Bitte stelle sicher, dass jede JSON-Zeile gültig ist und keine Zeilenumbrüche innerhalb eines JSON-Objekts vorkommen.
Der grundlegende Teil kann für alle Daten genauso übernommen werden. Danach haben wir hier natürlich ein bisschen auf unsere Inhalte zugeschnittene Formulierungen, da wir noch ein bisschen Markdown-Formatierung mit den Überschriften und Listen wollten. Das ist aber rein optional.
Auch hier bekommen wir dann die Beispiele im gewünschten Format und können diese mit einem geeigneten Text-Editor – wir verwenden dafür gerne die kostenlose Software Sublime Text – im .jsonl-Format abspeichern und dann sind wir eigentlich schon startklar.
So erstellt man einen neuen Finetuning-Job bei OpenAI
Jetzt haben wir alles um loszulegen und können dazu auf der Plattform-Seite von OpenAI zum Dashboard wechseln und in der linken Seitenleiste Finetuning auswählen. Alternativ ist hier der direkte Link.
Auf der Seite können wir dann „Create“ auswählen. Das öffnet ein Popup, in dem wir alle Informationen für das Training unseres eigenen Modells, inklusive Basismodell und Trainingsdaten eintragen können.
Zunächst müssen wir das Basismodell auswählen. Hier stehen alle verfügbaren Modelle von OpenAI zur Verfügung, am besten eignen sich aktuell natürlich die GPT-4o und GPT-4o Mini Modelle – in der Zukunft dann auch aktuellere Versionen davon.
Nach dem Modell können wir die Trainingsdaten hochladen, das ist einfach unsere .jsonl-Datei und danach ein Suffix vergeben, mit diesem Kürzel können wir das entsprechende Modell später in der Modellauswahl finden.
Im zweiten Teil des Popups würde ich zuerst einmal alle Parameter auf dem Standardwert bzw. auto belassen. Es wird beim Hovern mit der Maus alles erklärt, aber wir haben die Erfahrung gemacht, dass bei nicht zufriedenstellenden Ergebnissen das Verbessern der Trainingsdaten effektiver ist, als langes Manipulieren der Trainingsparameter.
Wenn alles eingetragen ist, klicken wir unten im Popup auf „Create“ und schon wird unser Modell trainiert. Zunächst prüft OpenAI die Datei, wenn es keine Fehler gibt startet das Modelltraining und wenn das fertige Modell nicht gegen allgemeine Nutzungsbedingungen verstößt wird es als abgeschlossen im Finetuning-Bereich in unserem Dashboard angezeigt.
Testen des eigenen abgestimmten Modells nach dem Training
Unser Modell ist fertig und jetzt können wir es direkt im Playground auf der Plattform-Seite von OpenAI testen. Am besten klicken wir direkt bei unserem trainierten Modell unten auf den Button mit der Aufschrift Playground und werden dann direkt zu diesem Chat-Bereich gebracht.
Hier wird standardmäßig das nicht bearbeitete Grundlagenmodell als Vergleich ausgewählt, sodass man ein und denselben Prompt schnell und einfach mit beiden Varianten testen kann. So findet man schnell heraus, wie erfolgreich das Finetuning war und ob sich die neue Variante wirklich so verhält, wie man es gerne hätte.
Markdown-Format korrekt darstellen
Wenn wir das Modell im OpenAI Playground testen, werden alle Antworten immer nur als reiner Text dargestellt. Für den Fall, dass wir auch mit Markdown Formatierungen für beispielsweise Überschriften oder fetten Text verwenden, wie im hier gezeigten Beispiel gibt es einfache Editoren online, mit denen wir den erzeugten Output prüfen können.
Unsere Empfehlung dafür ist die Website Stackedit. Hier können wir einfach die vom Modell erzeugte Antwort einfügen und sehen dann in der rechten Spalte direkt, wie der Text korrekt formatiert aussehen würde.
Wenn wir das Modell dann über die API ansprechen müssen wir lediglich dafür sorgen, dass unsere Ausgaben entsprechend behandelt werden und die Symbole für Markdown Formatierungen korrekt erkannt werden. Das liegt dann aber wiederum in der Implementation einer eigenen Lösung. In vielen Fällen braucht man die direkte Formatierung aber auch nicht und kann das beim Weiterverwenden der KI-Antworten manuell erledigen.
Überblick über die Kosten für Anfragen und Finetuning von GPT-4o
Die Kosten für das Training und Finetuning von Modellen können sich natürlich jederzeit ändern, die aktuelle Übersicht findet man immer auf der Preis-Seite von OpenAI direkt.
Aktuell ist das Training mit bis zu 2.000.000 Token pro Tag umsonst, aber auch ohne diese Gratistokens ist es nicht wirklich teuer ein Modell zu trainieren. Hier ein Auszug aus der aktuellen Preisgestaltung:
Für unser Training mit zugegeben nur 14 Beispielen haben wir gerade einmal 20.000 Tokens verbraucht, was für das große GPT-4o Modell Kosten von ca. 50 Cent entsprechen würde.
Für wen ist das Finetuning sinnvoll? Was sind gute Anwendungen?
An sich kann man das neue, eigene Modell nur im Playground und über die API verwenden, genau so, wie man beispielsweise auch das normale GPT-4o Modell in einer eigenen Anwendung oder im Unternehmen verwenden würde.
Und in diesem Bereich macht es für uns auch den meisten Sinn. Natürlich kann ich mir als Privatperson ein Modell feinabstimmen und dann im Playground nutzen, aber in der Regel wird es so sein, dass ich eine eigene Implementierung habe, die über die API Anfragen an OpenAI sendet und hier kann ich mir eben genau für meine Bedürfnisse zugeschnittene Modelle erstellen. Das spart mir wiederum viele Tokens bei meinen Anfragen, wir haben gerade im Beispiel den Extremfall gesehen, bei dem ich eigentlich nur noch ein Wort als Prompt eingebe und die gewünschte Antwort erhalte.
Man kann so den eigenen Modellen einfach genau beibringen, was man erwartet und macht damit komplexe Prompts eigentlich überflüssig.
Ein einfaches Beispiel wäre ein Chatbot für Kundenanfragen. Durch das Training mit existierenden Kundenfragen und den entsprechenden Antworten im richtigen Stil, Ton und Format kann ein Modell ganz genau auf diesen Einsatzzweck spezialisiert werden.
Oder man trainiert ein Modell, das interne Dokumentationen aktualisiert und daraus Schulungsmaterialien für Mitarbeitende erstellen kann.