Finetuning von OpenAIs GPT-Modell – Vorteile und Coding-Anleitung

Finetuning ermöglicht, dass ein Sprachmodell eigene Daten dazuzulernt. Dies verbessert die Antwortqualität enorm. Hier zeigen wir, wie man OpenAIs GPT-3.5 Turbo mit Finetuning deutlich verbessert. Dies geht via OpenAI-API oder Microsoft Azure. Highlight: Das komplette Jupyter-Notebook haben wir euch verlinkt.

Updates:

  • 11/2023: Fine-tuning für GPT-4 ist über ein "experimental access program" für ausgewählte Kunden möglich
  • 22.8.2023: GPT-3.5 Turbo unterstützt jetzt Finetuning Zur Mitteilung von OpenAI
  • 22.8.2023: OpenAI kündigt an, dass GPT-4 ab Herbst 2023 Finetuning unterstützt

Was ist Finetuning?

Ein großes Sprachmodell (LLM) wie GPT-3.5 Turbo von OpenAI kann bereits viele Fragen umfassend beantworten. Jedoch liefert es ungenügende Antworten, wenn man spezielles Wissen abfragen will. Beispiele: Produkte eines Unternehmens, typische Hotline-Anfragen beantworten und mehr. Hier hilft Finetuning, denn man kann fehlendes Wissen für Aufgaben oder Branchen einfach nachtrainieren, ohne dass man sich ein eigenes Basismodell trainieren muss. Dies würde auch sehr schwierig werden, denn dies erfordert oft Highend-GPU-Hardware, Trainingsdaten und Spezialwissen. Finetuning ist genau dafür gemacht, ein Sprachmodell nachträglich noch präziser und zuverlässiger zu machen.

OpenAI nennt folgende Verbesserungen durch Finetuning:

  • Steuerbarkeit: Durch Finetuning reagiert das Modell genauer auf Anweisungen, wie etwa die festgelegte Sprache. Dies verhindert, dass Chatbots abschweifen, was gelegentlich passieren kann.
  • Konsistente Formatierung: Das finegetunete Modell liefert bessere Antworten im beliebigen Format, ideal für technische Anwendungen wie Code-Generierung (Beispiel: eine Python- oder JSON-Datei erzeugen)
  • Markentonalität: Das Chat-Modell spricht in der speziellen Tonalität eines Unternehmens, was die Markenidentität stärkt (z.B. siezen vs. duzen, locker vs. seriös, inspirierend vs. faktenbasiert etc)
  • Prompt-Einsparung: Durch Finetuning kann man auch API-Kosten und Aufwände für Prompts sparen. Denn wenn das Finetuning-Modell genau weiss, was es machen soll, können "bis zu 90% der Token-Kosten eingespart werden" (Beispiel von OpenAI genannt, frei übersetzt).

Kosten für Finetuning-Modelle

Die Kosten für das Training und die Nutzung der Finetuning-Modelle von OpenAI sind hier aufgelistet. Die Kosten werden nach Tokens berechnet, wobei 1000 Tokens ca. 750 englischen Wörtern entsprechen. Im Vergleich zum normalen Basismodell kostet das Finetuning-Modell ca. 3x mehr bei der Eingabe, 4x mehr bei der Ausgabe. Das Training kostet extra.

Kosten für Finetuning-Modelle von OpenAI - Stand 08/2023
Kosten für Finetuning-Modelle von OpenAI - Stand 08/2023

Beispiele: So hilft Finetuning

Insgesamt verbessert Feintuning die KI-Modelle, indem diese damit ihre Aufgaben zuverlässiger und genauer erfüllen können. Es geht nicht nur darum, KI schlauer zu machen, sondern sie auch relevanter und wertvoller für den Endnutzer zu machen. Hier einige Beispiele aus der Praxis.

  1. Besserer Chatbot-Kundensupport: Durch Feintuning kann ein Chatbot firmenspezifische Informationen in seine Antworten einbeziehen. Zum Beispiel könnte er sagen: "Bitte sehen Sie nach, welche Produkt-ID auf der Originalverpackung des T-301-Mobiltelefons aufgedruckt ist", um Kunden effektiv zu helfen.
  2. Bessere Inhalte: Redaktionsteams können ihren Chatbot wie z.B. GPT-3.5 so trainieren, dass es den spezifischen Ton und Stil ihres Publikums trifft. Das bedeutet, dass Inhalte, die von der KI generiert werden, besser zur Zielgruppe passen und authentischer wirken.
  3. Verbesserte Übersetzungen: Für Unternehmen, die in bestimmten geografischen Regionen tätig sind, kann das Modell so angepasst werden, dass es regionale Sprachnuancen oder branchenspezifischen Jargon besser erfasst und übersetzt. Beispiel: Januar heisst in Österreich "Jänner".
  4. Optimierter Kundenservice: Ein feinabgestimmtes Modell kann Kundenanfragen besser verstehen und genauer darauf reagieren. Dies kann dazu führen, dass Kunden schneller und zufriedenstellender Antworten erhalten, was die Kundenzufriedenheit erhöht.
  5. Datenschutz und Compliance: Durch Feintuning kann das Modell so trainiert werden, dass es bestimmte Informationen oder Daten vermeidet, die für ein Unternehmen heikel sein könnten. Dies ist besonders wichtig für Branchen, die strenge Datenschutzbestimmungen einhalten müssen.

Möglichkeiten der Umsetzung

Man kann das GPT-Modell über die OpenAI-API oder über Microsoft Azure OpenAI Service nutzen.

Zunächst zeigen wir, wie dies mit der OpenAI-API funktioniert. Am einfachsten kann man das Fine-tuning a) über die das Frontend des OpenAI Playgrounds nutzen, was schnell und einfach geht. Alternativ könnt ihr dies auch b) per Python-Code erreichen, was den Vorteil hat, dass ihr das Fine-tuning in eure eigenen Build-Prozesse einklinken könnt.

Danach skizzieren wir kurz den Weg via Microsoft Azure OpenAI.

Variante 1: Fine-tuning von GPT via OpenAI Playground

Dauer: 15 Minuten, Empfohlen für: Nicht-Coder, schnelle Versuche

Die einfachste Variante für das Fine-tuning von OpenAIs GPT ist der Weg über den OpenAI Playground.

Schritte zum Fine-tuning via Playground:

  • OpenAI Playground aufrufen: https://platform.openai.com/playground
  • Zum Fine-tuning-Bereich navigieren: https://platform.openai.com/finetune
  • Click auf "Create" rechts oben
  • Basis-Modell wählen (z.B.: gpt-3.5-turbo-1106, höhere Modelle erst möglich, sobald OpenAI dies veröffentlicht hat)
  • Trainingsdaten hochladen (unter "Variante 2" lest ihr mehr dazu, wie man diese erstellt)
  • Validierungsdaten hochladen (optional, ermöglicht messen der Verbesserung durch Fine-tuning)
  • Click auf "Create"
  • Warten (ca. 10 min, abhängig von Trainingsdatenmenge)
  • Click auf "Playground" links
  • Das Fine-getunete Modell steht nun dauerhaft im Playground zur Verfügung und ihr könnt es dort im Chat direkt nutzen oder alternativ per API ansprechen.

 

Konfiguration des Fine-tuning-Modells:

Trainieren: Man sieht, wie weit das Modell bereits trainiert ist und kann Fehler erkennen

Ergebnis: Fertig trainiertes Modell

Fine-tuning-Modell nutzen: Im Playground oder per API

 

Variante 2:  Fine-tuning von GPT via Python und OpenAI-API

Dauer: 30 Minuten (je nach Erfahrung), Empfohlen für: Python-Coder

Fine-tuning kann mit OpenAIs GPT-Modell (Beispiel: GPT 3.5 Turbo) mit wenigen Code-Zeilen umgesetzt werden. Die OpenAI-API kann man per curl oder Python aufrufen. Da LLM-Developer überwiegend mit Python arbeiten zeigen wir hier ein Beispiel, wie man Fine-tuning per Jupyter-Notebook ausführt.

Schritte zum Fine-tuning via Python-Code:

  1. Daten vorbereiten
  2. Daten zu OpenAI hochladen
  3. Finetuning-Job starten
  4. Finetuning-Modell abfragen

Los gehts.

Schritt 0: Vorbereitung des Jupyter-Notebooks und der Imports

Wir nutzen JupyterLab als IDE. Man kann den Code jedoch auch in Google Colab nutzen, muss dann jedoch die Datei mit den Trainingsdaten per Google Drive hochladen und Colab mit Google Drive verbinden.

JupyterLab: Python-Notebook für das GPT-Finetuning im Überblick
JupyterLab: Python-Notebook für das GPT-Finetuning im Überblick

Zuerst werden notwendige Libraries installiert. Danach sollte man den Jupyter-Kernel neu starten (via Menü unter Kernel > Restart Kernel). Die Libraries werden importiert und API-Variablen gesetzt. Ihr braucht euren OpenAI-API-Key und die Organisations-ID. Diese findet man im OpenAI-Account.

# upgrade openai library, restart kernel 
pip install --upgrade openai 

# imports and settings 
import os 
import openai 
import json 
import datetime 

OPENAI_API_KEY = "sk-12345" # TODO: Enter API key 
ORG_ID = "org-12345" # TODO: Enter Org ID 
TRAINING_FILE_NAME = "data-finetuning-10examples.jsonl" # training file in JSONL format 

# set API key 
openai.api_key = OPENAI_API_KEY

Schritt 1: Finetuning-Daten vorbereiten

Finetuning-Trainingsdaten bereitet man in Frage/Antwort-Form auf, damit das GPT-Modell diese klar lernen kann. Als Beispiel verbessern wir einen Kundenservice-Chatbot. Dafür haben wir uns Dummy-Kundenservice-Daten per ChatGPT mit GPT-4 im benötigten Format generiert (Prompt: siehe Notebook).

Dummy-Daten für das Finetuning mit ChatGPT generieren
Dummy-Daten für das Finetuning mit ChatGPT generieren

Wie sollten die Finetuning-Trainingsdaten aufbereitet sein?

Die OpenAI-API erfordert mindestens 10 Beispiele für das Finetuning. Im wirklichen Einsatz braucht man deutlich mehr Trainings-Daten. Als Fausregel könnten hier 50-100 Beispiele eine gute Orientierung sein, empfiehlt OpenAI:

"We typically see clear improvements from fine-tuning on 50 to 100 training examples with gpt-3.5-turbo but the right number varies greatly based on the exact use case." Quelle: OpenAI

Generell ist bei Trainingsdaten zu beachten, dass man Trainingsdaten mit guter Qualität nutzt, die also möglichst korrekt, klar, widerspruchsfrei, vollständig und gut maschinenlesbar sind. Dies ist wichtiger, als möglichst viele Trainingsdaten einzuspielen. Die OpenAI-API kann die Daten im JSONL-Format einlesen.

Finetuning-Daten bestehen aus Frage/Antwort-Beispielen
Finetuning-Daten bestehen aus Frage/Antwort-Beispielen

Der Python-Code zum Definieren der Finetuning-Trainingsdaten (Ausschnitt):

system_prompt = "Du chattest jetzt mit dem Kundenservice für den Hochleistungs-Staubsauger T-1000."

data = [
    {"messages": [{"role": "system", "content": system_prompt}, {"role": "user", "content": "Warum saugt mein T-1000 nicht mehr richtig?"}, 
        {"role": "assistant", "content": "Es könnte ein verstopfter Filter sein. Bitte überprüfen Sie den Filter und reinigen Sie ihn gegebenenfalls."}]},
    {"messages": [{"role": "system", "content": system_prompt}, {"role": "user", "content": "Warum ist dieser Staubsauger so laut? Ich kann kaum denken, wenn er läuft!"}, 
        {"role": "assistant", "content": "Entschuldigung für die Unannehmlichkeiten. Die Lautstärke kann aufgrund von Fremdkörpern in der Bürste steigen. Bitte überprüfen Sie diese."}]},
    {"messages": [{"role": "system", "content": system_prompt}, {"role": "user", "content": "Warum hält der Akku nicht so lange, wie in der Werbung versprochen?"}, 
        {"role": "assistant", "content": "Es könnte viele Gründe geben. Zum Beispiel könnte ein häufiges und langes Saugen den Akku schneller entladen. Stellen Sie sicher, dass Sie den Staubsauger nach jedem Gebrauch aufladen."}]},
    {"messages": [{"role": "system", "content": system_prompt}, {"role": "user", "content": "Kann ich kein normales Reinigungsmittel für meinen T-1000 verwenden?"}, 
        {"role": "assistant", "content": "Wir empfehlen spezielle Reinigungsmittel, um die Lebensdauer zu verlängern und Beschädigungen zu vermeiden."}]}
]

# Save data to a file in JSONL format
with open(TRAINING_FILE_NAME, 'w') as file:
    for item in data:
        file.write(json.dumps(item) + '\n')

Schritt 2: Trainingsdaten hochladen

Als nächstes laden wir die Trainingsdaten als Datei über die OpenAI API hoch. Wichtig: Keine sensiblen Daten hochladen. Die TRAINING_FILE_ID brauchen wir, um damit im nächsten Schritt das Finetuning zu starten.

response_upload = openai.File.create(
    file=open(TRAINING_FILE_NAME, "rb"), purpose='fine-tune'
)

TRAINING_FILE_ID = response_upload.id

# print upload response to check if successful
response_upload

Schritt 3: Finetuning-Job starten

Nun wird der Finetuning-Job gestartet und das Modell wird trainiert.

job = openai.FineTuningJob.create(training_file=TRAINING_FILE_ID, model="gpt-3.5-turbo-0613")

Dieser Vorgang dauert bei unseren 10 Dummy-Einträgen ca. 12 Minuten. Man kann jederzeit prüfen, wie weit der Vorgang bereits fortgeschritten ist. Dazu kann man sich die alle laufenden Fine-Tuning-Jobs mit ihren Job-Events auflisten lassen.

# List fine-tuning jobs and show status

jobs = openai.FineTuningJob.list(limit=10)

for job in jobs.data:
    print("*** job-id: " + job.id + " ***")
    print("Status: " + openai.FineTuningJob.retrieve(job.id).status )

job_events = openai.FineTuningJob.list_events(id=job.id, limit=20)
for e in job_events.data:
    timestamp = formatted_date = datetime.datetime.fromtimestamp(e["created_at"]).strftime('%H:%M:%S')
    print(timestamp + " - " + e.message)

Das Ergebnis nach einem erfolgreich durchgeführtem Finetuning sieht wie folgt aus:

Finetuning mit GPT: Job-Status nach erfolgreichem Finetuning
Finetuning mit GPT: Job-Status nach erfolgreichem Finetuning

Schritt 4: Finetuning-Modell abfragen

Nach erfolgreich abgeschlossenem Finetuning steht euch euer eigenes Modell zur Verfügung. Dies hat den Namen "ft:" wie "finetuning", gefolgt vom verwendeten Basismodell (hier "gpt-3.5-turbo-0613") und dem Organisationsnamen aus eurem OpenAI-Account, sowie einer 8-stelligen ID.

MODEL = "ft:gpt-3.5-turbo-0613:YOURORGNAME::7rAKrrlF"

completion = openai.ChatCompletion.create(
    model=MODEL,
    messages=[
        {"role": "system", "content": "Du chattest jetzt mit dem Kundenservice für den Hochleistungs-Staubsauger T-1000."},
        {"role": "user", "content": "Ich will meinen T-1000 mit Pril reinigen. Geht das?"}
    ]
)

print(completion.choices[0].message)

Das Ergebnis: Der Kundenservice-Chatbot antwortet präziser

Wir fragen unseren Kundenservice-Chatbot nun, ob wir unseren Staubsauger mit Pril reinigen können. Diese Anfrage sollte er entsprechend den Trainingsdaten so beantworten, dass er eher ein spezielles Reinigungsmittel empfiehlt. Wir haben die Anfrage bewusst so formuliert, dass GPT diese nicht 1:1 aus den Trainingsdaten ablesen kann.

Finetuning-Trainingsdaten:

  • Kunde: "Kann ich kein normales Reinigungsmittel für meinen T-1000 verwenden?"
  • Service: "Wir empfehlen spezielle Reinigungsmittel, um die Lebensdauer zu verlängern und Beschädigungen zu vermeiden."

Antwort des Finetuning-Modells:

  • Kunde: Ich will meinen T-1000 mit Pril reinigen. Geht das?
  • Service: Wir empfehlen nur spezielle Reinigungsmittel, um Beschädigungen zu vermeiden.

 

So wird das finale fine-getunete Modell via Python befragt:

Finetuning mit GPT: Ergebnis
Finetuning mit GPT: Das Ergebnis: Der Kundenservice-Chat empfiehlt analog der Trainingsdaten

 

 

Variante 3: Fine-tuning von GPT via Microsoft Azure OpenAI

Wer die für viele Unternehmen datenschutzkonformere Lösung über Microsoft Azure nutzt, kann sein GPT-Modell ebenfalls komfortabel fine-tunen. Auch hier gibt es beiden Methoden: entweder einfach über das Web-Frontend des Azure OpenAI Studios oder per Python-Code über die Azure-OpenAI-API.

 

Fertiges Modell im Azure OpenAI Studio:

 

Grenzen und Probleme beim Finetuning

Finetuning macht Sprachmodelle genauer und lässt sich sehr einfach nachträglich Modelle anwenden, die diese Technik unterstützen (z.B. GPT). Jedoch können - so wie bei allen Trainingsprozessen - auch Probleme auftauchen, die man daher kennen sollte.

  1. Datenqualität und -vielfalt: Das Modell ist nur so gut wie die Daten, mit denen es trainiert wird. Unzureichende, verzerrte oder nicht repräsentative Finetuning-Trainingsdaten können zu schlechter Leistung führen. Man sollte also einen Mix guter Antworten in den Finetuning-Daten kombinieren und sicherstellen.
  2. Overfitting: Fine-Tuning mit einer zu spezifischen oder begrenzten Datenmenge kann dazu führen, dass das Modell zu stark auf diese speziellen Daten ausgerichtet ist ("overfitting") und darum dann schlechter auf allgemeinere oder neue Daten reagiert.
  3. Catastrophic Forgetting: Ein interessantes Phänomen beim Finetuning ist das komplette Vergessen eigentlich bekannter Informationen und Antwortfähigkeiten. Dies kann auftreten, wenn das neuronale Netzwerk seine Gewichte anpasst, um neue Daten zu lernen, dabei jedoch die Anpassungen verliert, die für die Vorhersage der zuvor gelernten Daten wichtig waren. So kann selbst GPT-4 dann einige der beeindruckenden Fähigkeiten verlernen.
  4. Ethik und Verzerrung: Sprachmodelle können bestehende soziale und kulturelle Vorurteile widerspiegeln. Dies kann zu Rassismus, Sexismus und andere Formen von Diskriminierung führen. Darum sollte man umfangreiche Finetuning-Daten und das neu trainierte Modell daraufhin abprüfen.

Fazit

  • Finetuning verbessert die Leistung des eh schon mächtigen GPT-Modells noch weiter und ist sehr leicht umsetzbar.
  • Finetuning ist mit OpenAIs ChatGPT 3.5 seit August 2023 möglich, Version GPT-4 wird ab Herbst 2023 unterstützt.
  • Es gibt auch mit Finetuning keine absolute Kontrolle über die Ausgabe eines Frage/Antwort-Systems wie einen Chatbot. Doch verbessert das Finetuning die Qualität deutlich und bietet viel mehr Stabilität. Die Ergebnisse des Finetunings sollten darum vor dem Einsatz sauber per Qualitätssicherung und Modell-Evaluation abgetestet werden.
  • Beim Training sollte man zudem berücksichtigen, keine sensiblen Daten an die OpenAI-API zu senden.

Bonus: Jupyter-Notebook zum Finetuning des GPT-Modells

Hier der Link zum Notebook inklusive Dummy-Trainingsdaten:

https://github.com/RalfSchukay/finetuning-gpt-openai/blob/main/README.md

Mehr zu Finetuning erfahren