Was macht Datensatz-Kuration?
Dieses Skill setzt voraus, dass finetuning-method-selection bereits ausgeführt wurde – der nächste Schritt ist die Datenaufbereitung, nicht die Methodenauswahl. Im Folgenden: Formatwahl nach Zielmethode, die Template/Packing-Mechanik hinter den häufigsten stillen Trainingsfehlern, Regeln für die Beimischung synthetischer Daten ohne Kollaps, sowie die Dataset-Card, die Phase 2 abschließt, bevor ein Training startet.
Eingabe: rohe Beispiele (Demonstrationen, Präferenzurteile oder Aufgaben-Prompts) plus eine Routing-Entscheidung von finetuning-method-selection.
Ausgabeformat: ein formatierter, gepackter, validierter JSONL-Datensatz plus eine vollständige Dataset-Card – das Phase-2-Artefakt, das /finetune prüft, bevor das Training gestartet wird.
Formatwahl
| Methode | Form | Zeilen |
|---|---|---|
| SFT, Einzelgespräch | Instruct (instruction/response oder prompt/completion) | ~1.000+ Minimum |
| SFT, Mehrfachgespräch | Conversation / ChatML messages-Liste | ~1.000+ Minimum |
| DPO / ORPO | Präferenzpaar (prompt, chosen, rejected) | Methodenabhängig, siehe preference-optimization |
| KTO | Ungepaart (prompt, completion, label) | Methodenabhängig, siehe preference-optimization |
| GRPO / RLVR | Nur-Prompt (prompt + Verifier-Metadaten) | Methodenabhängig, siehe grpo-rlvr-training |
-
~1.000+ Zeilen ist das empfohlene Minimum für SFT, nicht ein Ziel. Darunter können wenige qualitativ minderwertige oder doppelte Beispiele den Gradienten dominieren; darüber gilt Qualität vor Quantität – ein kleinerer, verifizierter und deduplizierter Satz schlägt einen größeren verrauschten.
-
Die ChatML-Form zur Orientierung; die anderen vier Formate sowie ein ShareGPT-Konversionshinweis befinden sich in
references/formats-and-templates.md:{"messages": [ {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."} ]}
Chat-Templates und Loss-Masking
Wende das Chat-Template des Zielmodells vor jeder Verkettung oder Packing an, niemals danach – das Packen von Rohtext und das anschließende Templaten des gepackten Blocks zerstört die Gesprächsgrenzen, sodass Rollenmarker an der falschen Stelle relativ zu jedem Beispiel landen.
-
Nur auf Assistentenantworten trainieren. Maskiere den Loss (
-100im Labels-Tensor) über System-/User-Turns und die Rollenmarker des Templates – nur die Tokens des Assistenten-Turns tragen zum Loss bei. -
Template/Tokenizer-Inkonsistenzen gehören zu den häufigsten stillen Fehlermodi. Ein Modell, das mit einem Chat-Template trainiert, aber mit einem anderen ausgeliefert oder evaluiert wird, verschlechtert sich ohne Fehlermeldung. Stelle sicher, dass dasselbe Template in Training, Inferenz und Evaluation verwendet wird.
-
Behalte den Datensatz im
messages-Format und lass den Trainer das Template anwenden und maskieren (assistant_only_loss=Trueim aktuellen TRL) – vorab in ein flaches Textfeld zu rendern zerstört die für das Masking benötigten Gesprächsgrenzen. Vollständiger Codeskizze:references/formats-and-templates.md. Führe vor dem Training einen Integrationstest durch – dekodiere nur ungemaskierte Positionen; erwarte nur Assistententext:keep = batch["labels"][0] != -100 print(tokenizer.decode(batch["input_ids"][0][keep]))
Packing
Ohne Packing werden 40–70 % der Rechenleistung für Padding verschwendet – variablel lange Beispiele, die auf eine feste Sequenzlänge gebündelt werden, vergeuden die Lücke zwischen der Länge jedes Beispiels und dem Batch-Maximum. Packing verkettet mehrere Beispiele zu einer Sequenz bis zur maximalen Länge und reduziert diesen Abfall drastisch.
-
Packing ändert die Batch-Semantik. Eine gepackte Sequenz kann mehrere ursprüngliche Beispiele enthalten, daher verschieben sich „Schritte pro Epoche“ und jeder auf die Beispielanzahl bezogene LR-Plan, sobald Packing aktiviert ist – berechne die Plan-Meilensteine neu auf Basis der gepackten Sequenzanzahl.
-
PFLICHT: Dekodiere und inspiziere manuell 5–10 gepackte Sequenzen, bevor du auf einen vollständigen Lauf skalierst. Bestätige, dass die Beispielegrenzen an den erwarteten Stellen liegen, die Templatemarker pro Teilbeispiel intakt sind und der Loss-Mask innerhalb jeder gepackten Sequenz assistentenbezogen bleibt. Nicht optional – Packing-Fehler sind still (die Loss-Kurve sieht normal aus) und zeigen sich erst in der Evaluationsqualität, Stunden später:
for seq in packed_dataset.select(range(10)): print(tokenizer.decode(seq["input_ids"]))
Regeln für synthetische Daten
- Halte mindestens 25 % echte Daten als Kollaps-Schutz. Das Training auf einem wachsenden Anteil modellgenerierter Daten ohne echte Daten-Boden führt über aufeinanderfolgende Generationen zu messbarem Qualitätskollaps – 25 % echte Daten sind das Minimum, das die Linie hält. Allgemeine Domänen-Wiederholungszeilen zählen zu diesem Boden – „echt“ bedeutet „nicht für diese Aufgabe von diesem Schüler generiert“, nicht „von Menschen erstellt.“ Ein synthetischer Datensatz von Grund auf kann die ≥25%-Regel allein durch Wiederholung erfüllen (siehe das Replay-Mix-Konstruktionsrezept in
references/synthetic-data.md); gebe in der Dataset-Card an, welche Zeilen als „echt“ zählen, anstatt den Boden strukturell unerreichbar zu machen. - Magpie und Rejection Sampling sind die Arbeitspferde. Magpie extrahiert Prompts aus dem eigenen Template-Prior des Modells; Rejection Sampling generiert mehrere Kandidaten pro Prompt und behält nur diejenigen, die einen Filter passieren. Beide schlagen naives einmaliges Generieren.
- Gezielte, schülerbewusste Generierung schlägt statische Generierung um das 1,3- bis 2-fache an Stichprobeneffizienz – das Anvisieren der tatsächlichen Fehlermodi des Schülers erreicht ein Qualitätsniveau mit weniger gefilterten Beispielen.
- Typische Akzeptanzraten nach Filterung liegen bei 10–30 %. Plane die Menge entsprechend – ein Ziel von 10.000 Zeilen bei 15 % Akzeptanz erfordert ~65.000+ Rohgenerationen.
- Rangfolge der Generierungsmethoden, Filter-Trichter, Replay-Mix-Konstruktion und Destillationsmuster:
references/synthetic-data.md.
Die Dataset-Card
Jeder Datensatz, der zum Training gelangt, erhält eine Card – das erforderliche Phase-2-Artefakt, das /finetune vor dem Start prüft. Die Card ist keine freie Dokumentation; sie MUSS die folgenden Felder enthalten:
- Herkunft – woher jede Zeile stammt (echte Quelle(n), synthetische Methode(n) oder beides), nachvollziehbar auf
trace-to-training-data-Ausgabe. - Anzahl – Gesamtzeilen und Zeilen pro Split (Train/Evaluation/Zurückgehalten), falls gesplittet.
- Synthetisch/Echt-Verhältnis – das gemessene Verhältnis, überprüft gegen den ≥25%-Echt-Boden oben.
- Deduplizierungsmethode – exakte Übereinstimmung, semantisch (Embedding-Schwellwert) oder beides; siehe den Filtertrichter in
references/synthetic-data.md. - Verwendetes Template – die exakte Chat-Template-Zeichenfolge/Kennung, konsistent über Inferenz und Evaluation gehalten – dies verbindet einen
eval-harness-first-Lauf mit dem Checkpoint. - Packing-Konfiguration – ob Packing verwendet wurde, maximale Sequenzlänge und Bestätigung, dass die manuelle Inspektion von 5–10 Sequenzen oben durchgeführt wurde.
Ein Datensatz, dem eines dieser sechs Felder fehlt, ist nicht bereit für /finetune – die Card ist ein Gate, keine Zusammenfassung, die nachträglich geschrieben wird.
Phase-2-Exit-Checkliste
Bevor an /finetune übergeben wird, bestätige:
- Format entspricht der Methode (Tabelle oben).
- Template vor der Verkettung angewendet.
- Loss nur auf Assistenten-Turns gemaskiert.
- 5–10 gepackte Sequenzen dekodiert und gelesen.
- ≥25 % echte Daten im endgültigen Mix.
- Dataset-Card vollständig – alle sechs Felder.
Referenzen
references/formats-and-templates.md– JSONL-Beispiele pro Format, aktuelles TRL-Masking-Code und ShareGPT-Konversionshinweis.references/synthetic-data.md– Rangfolge der Generierungsmethoden, Filtertrichter, Replay-Mix-Konstruktion und Lehrer→Schüler-Destillationsmuster.
Verwandte Skills: finetuning-method-selection leitet hierher; lora-qlora-recipes, vision-sft und preference-optimization konsumieren die von diesem Skill erstellten Datensätze; trace-to-training-data ist die Herkunftsquelle für bewertete Trajektorien-Datensätze; eval-harness-first bewertet den resultierenden Checkpoint.