Tokenwerk · Das LLM-Lehrbuch

Kapitel 28 · V · Moderne Sprachmodelle · 4 Minuten

Vom Textmodell zum Antwortmodell

Instruction-Tuning trainiert ein Format und ein Verhalten. Die entscheidende Übung ist eine saubere Maske für die Antwort.

Ein Base-Modell ergänzt Text

Ein Base-Modell ist auf Fortsetzungen seiner Textverteilung trainiert. Auf „Warum ist Eis kalt?“ kann es eine weitere Frage, einen Dialogmarker oder eine Erklärung erzeugen. Dass wir eine hilfreiche Antwort erwarten, ist eine zusätzliche Verhaltensanforderung. Supervised Fine-Tuning, kurz SFT, trainiert Beispiele mit Eingaben und gewünschten Antworten.

SFT kann Format, Ton, Kürze und Aufgabenverhalten vermitteln. Ein kleines Modell mit wenig Vortraining wird aber nicht durch hundert Frage-Antwort-Paare zu einem allgemeinen Wissenssystem. Es kann Antworten memorisieren, statt ihre Inhalte zu übertragen. Für den Kurs prüfen wir darum eng begrenzte Aufgaben und neue Frageformulierungen.

Die Chatvorlage

Unser Projekt benutzt reservierte IDs. Eine einzelne Unterhaltung sieht schematisch so aus:

Code
BOS USER Frage EOS ASSISTANT Antwort EOS

Ein optionaler Systemtext lautet SYSTEM Text EOS nach BOS. Mehrere Nachrichten können dieselbe Struktur fortsetzen. Rolle und Ende werden in der Datenaufbereitung explizit eingefügt, nicht aus beliebigen Textfragmenten erraten.

Beim Generieren einer Antwort endet der Prompt nach ASSISTANT. Das nächste Token soll das erste Antworttoken sein. Benutzt du bei Training und Inferenz verschiedene Vorlagen, erzeugst du einen Verteilungswechsel, der besonders kleine Modelle stark stören kann.

Loss nur auf die Antwort

Für dieses Lehrprojekt ignorieren wir System- und User-Targets sowie Rollenmarker. Antworttokens und das abschließende EOS sind aktive Ziele. Kontexttokens dürfen weiterhin von Attention gelesen werden; sie verursachen nur an ihren eigenen Targetpositionen keinen Loss.

Wichtig ist die Verschiebung: Wenn mask[j] beschreibt, ob der Token an Position j ein zu lernendes Ziel ist, dann gilt beim Input ids[:-1]:

python
targets = ids[1:].copy()
active = mask[1:]
targets[~active] = -100

Die Maske wird also wie das Target um eine Position verschoben. Die Ausgabe auf dem ASSISTANT-Marker sagt das erste Antworttoken voraus und muss dafür einen aktiven Target haben.

Ein konkretes Format

json
{"messages":[{"role":"user","content":"Warum schmilzt Eis?"},{"role":"assistant","content":"Eis schmilzt, wenn ihm genügend Wärme zugeführt wird."}]}

Das Projekt enthält kleine sft_train.jsonl- und sft_valid.jsonl-Beispiele. Sie prüfen den Ablauf. Für belastbare Antwortqualität brauchst du deutlich mehr abwechslungsreiche, richtige Beispiele und eine separate Prüfung. Der gespeicherte Pretraining-Tokenizer bleibt unverändert.

bash
python sft.py --checkpoint runs/base/best.pt \
  --input data/sft_train.jsonl --valid data/sft_valid.jsonl \
  --out runs/chat --steps 300 --lr 0.0001
python sample.py --checkpoint runs/chat/best.pt \
  --chat --prompt "Warum schmilzt Eis?" --tokens 100

Der SFT-Trainer passt sämtliche Modellgewichte an. Er verwendet keine LoRA-Adapter. Das ist bei kleinen Modellen verständlich und günstig genug; die Absicht ist, den gesamten Lernweg nachzuvollziehen.

Lange Beispiele nicht blind abschneiden

Wenn du nur die ersten T+1 Tokens behältst, kann die gesamte Antwort verloren gehen. Dann enthält das Beispiel keinen aktiven Target. Ein gemittelter Cross-Entropy-Loss über ausschließlich ignorierte Ziele kann undefiniert werden.

Unser Projekt verwirft Beispiele, die nicht in das Kontextfenster passen, statt still ihre Antworten abzuschneiden. Es meldet die verworfene Zahl und stoppt, wenn keine gültigen Beispiele übrig sind. Für eine große Pipeline könntest du Nachrichten intelligent kürzen oder passende Antwortabschnitte wählen; das muss mit der Vorlage und dem Lernziel zusammenpassen.

Padding und Tokengewichtung

SFT-Beispiele sind unterschiedlich lang. Der Batch füllt rechts mit PAD auf, die entsprechenden Targets sind -100. Wegen Kausalität lesen aktive Positionen kein späteres Padding. Der Loss mittelt über tatsächlich aktive Antworttargets.

Bei der Validierung summiert das Projekt Einzelverluste und zählt aktive Targets über alle Beispiele. Sonst würde eine kurze Antwort genauso viel Gewicht bekommen wie eine lange, obwohl wir einen Tokenmittelwert berichten. Eine andere Beispielgewichtung kann absichtlich sinnvoll sein, ist aber eine andere Metrik.

Was die Beispiele abdecken müssen

Wenn du kurze deutsche Antworten willst, müssen die Beispiele kurze deutsche Antworten zeigen. Füge verschiedene Frageformulierungen, Erklärungswünsche, einfache Textbearbeitung und Situationen ohne ausreichende Informationen hinzu. Prüfe die gewünschten Antworten selbst. Widersprüchliche Muster können bei kleinen Datenmengen stark wirken.

Die Auswahl ist kein Ersatz für breite Sprachdaten. Du kannst das Vortraining und SFT auf einen engen Themenbereich zuschneiden; dann beschreibe das Modell auch als enges Themenmodell und prüfe, wie es außerhalb dieses Bereichs reagiert.

Vergleiche vor und nach SFT

Benutze dieselben zuvor festgelegten Fragen mit dem Base- und dem SFT-Checkpoint. Bewerte Format, Verständlichkeit, Korrektheit und angemessenes Nichtwissen. Ein besseres Antwortformat bei gleichbleibenden Faktenfehlern ist ein echter, aber begrenzter Fortschritt. Halte diese zwei Ergebnisse getrennt fest.