データセットキュレーション は何をしますか?
このスキルは、finetuning-method-selection が既にここにルーティングされていることを前提とします — 次のステップはデータの準備であり、手法の選択ではありません。以下では、ターゲット手法によるフォーマット選択、最も一般的なサイレントトレーニング障害の背後にあるテンプレート/パッキングの仕組み、崩壊を起こさずに合成データを混ぜるためのルール、そして実行開始前にフェーズ2を締めくくるデータセットカードについて説明します。
入力: 生のサンプル(デモ、選好判断、またはタスクプロンプト)と、finetuning-method-selection からのルーティング決定。
出力形式: フォーマットされ、パックされ、検証されたJSONLデータセットと、完成したデータセットカード — /finetune がトレーニング開始前にチェックするフェーズ2のアーティファクト。
フォーマット選択
| 手法 | 形状 | 行数 |
|---|---|---|
| SFT、シングルターン | Instruct(instruction/response または prompt/completion) | ~1,000+ 最低ライン |
| SFT、マルチターン | 会話 / ChatML messages リスト | ~1,000+ 最低ライン |
| DPO / ORPO | 選好ペア(prompt、chosen、rejected) | 手法依存、preference-optimization を参照 |
| KTO | 非ペア(prompt、completion、label) | 手法依存、preference-optimization を参照 |
| GRPO / RLVR | プロンプトのみ(prompt + ベリファイアメタデータ) | 手法依存、grpo-rlvr-training を参照 |
-
~1,000行以上がSFTの推奨最低ラインであり、目標ではありません。それ以下の場合、少数の低品質または重複したサンプルが勾配を支配する可能性があります。それ以上の場合、質が量に勝ります — 検証され重複除去された小さなセットが、大規模でノイズの多いセットよりも優れています。
-
ChatML形状の参考例です。他の4つのフォーマットとShareGPT変換に関するメモは
references/formats-and-templates.mdにあります:{"messages": [ {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."} ]}
チャットテンプレートと損失マスキング
ターゲットモデルのチャットテンプレートは、連結やパッキングの前に適用してください。後で適用してはいけません — 生テキストをパッキングしてからパックされたブロブにテンプレートを適用すると、ターン境界が壊れ、各サンプルに対してロールマーカーが間違った位置に配置されます。
-
アシスタント応答のみでトレーニングします。 システム/ユーザーターンとテンプレート自身のロールマーカーに対して損失をマスクします(ラベルテンソル内で
-100)。アシスタントターンのコンテンツトークンのみが損失に貢献します。 -
テンプレート/トークナイザーの不一致は、トップレベルのサイレント障害モードです。 あるチャットテンプレートでトレーニングされたモデルが、異なるテンプレートで提供または評価されると、エラーを出さずに劣化します。トレーニングで使用されたのと同じテンプレート文字列が、推論時と評価時に適用されていることを確認してください。
-
データセットを
messages形状のままにし、トレーナーにテンプレート適用とマスキングを任せてください(現在のTRLではassistant_only_loss=True)。フラットなテキストフィールドに事前レンダリングすると、マスキングに必要なターン境界が破壊されます。完全なコードスケッチ:references/formats-and-templates.md。トレーニング前にサニティチェックを行ってください — マスクされていない位置のみをデコードし、アシスタントテキストのみが表示されることを期待します:keep = batch["labels"][0] != -100 print(tokenizer.decode(batch["input_ids"][0][keep]))
パッキング
パッキングがない場合、計算リソースの40~70%をパディングに費やします — 可変長サンプルを固定シーケンス長でバッチ処理すると、各サンプルの長さとバッチの最大値との間のギャップが無駄になります。パッキングは複数のサンプルを最大長まで連結して1つのシーケンスにし、その無駄のほとんどを削減します。
-
パッキングはバッチセマンティクスを変更します。 パックされたシーケンスには複数の元のサンプルが含まれる可能性があるため、「エポックあたりのステップ数」やサンプル数に依存するLRスケジュールは、パッキングがオンになると変化します — スケジュールのマイルストーンをパックされたシーケンス数に基づいて再計算してください。
-
必須: 本格的な実行にスケールする前に、5~10個のパックされたシーケンスをデコードして手動で検査してください。 サンプル境界が期待通りに配置されていること、テンプレートマーカーが各サブサンプル内で無傷であること、損失マスクが各パックシーケンス内でもアシスタントのみであることを確認します。これはオプションではありません — パッキングのバグはサイレントであり(損失曲線は正常に見えます)、数時間後の評価品質でのみ表面化します:
for seq in packed_dataset.select(range(10)): print(tokenizer.decode(seq["input_ids"]))
合成データのルール
- 崩壊防止のために最低25%の実データを維持します。 実データの下限なしにモデル生成データの割合を増やしてトレーニングすると、世代を重ねるごとに測定可能な品質崩壊が発生します — 25%の実データはそのラインを維持する最低限です。汎用ドメインのリプレイ行はこの下限にカウントされます — 「実データ」とは「このタスクのためにこの生徒モデルから生成されたものではない」という意味であり、「人間が作成した」という意味ではありません。完全に合成で構築されたデータセットでも、リプレイだけで25%以上の下限を満たすことができます(
references/synthetic-data.mdのリプレイミックス構築レシピを参照)。どの行を「実データ」とみなすかをデータセットカードに明記し、下限を構造的に達成不可能なままにしないでください。 - マグパイ法とリジェクションサンプリングが主力です。 マグパイ法はモデル自身のテンプレート事前分布からプロンプトを抽出します。リジェクションサンプリングはプロンプトごとに複数の候補を生成し、フィルターを通過したものだけを保持します。どちらも単純な単発生成よりも優れています。
- ターゲットを絞った生徒認識型生成は、静的生成よりも1.3~2倍のサンプル効率を実現します — 生徒の実際の障害モードを狙うことで、より少ないフィルタリング済みサンプルで品質基準に達します。
- フィルタリング後の典型的な受理率は10~30%です。 それに応じてボリュームを計画してください — 15%の受理率で10,000行を目標とする場合、約65,000以上の生生成が必要です。
- 生成手法のランキング、フィルターファネル、リプレイミックス構築、蒸留パターン:
references/synthetic-data.md。
データセットカード
トレーニングに到達するすべてのデータセットにはカードが必要です — /finetune が起動前にチェックする必須のフェーズ2アーティファクトです。カードは自由形式のドキュメントではなく、以下のフィールドを必ず含める必要があります:
- 出典 — 各行の出所(実データソース、合成手法、またはその両方)。
trace-to-training-dataの出力にトレース可能であること。 - 行数 — 総行数、および分割されている場合は分割(train/eval/held-out)ごとの行数。
- 合成/実データ比率 — 測定された比率。上記の25%以上の実データ下限と照合すること。
- 重複除去方法 — 完全一致、意味的(埋め込みしきい値)、またはその両方。
references/synthetic-data.mdのフィルターファネルを参照。 - 使用テンプレート — 正確なチャットテンプレート文字列/識別子。推論と評価を通じて一貫性を保つ — これにより
eval-harness-first実行をチェックポイントに結び付けます。 - パッキング設定 — パッキングを使用したかどうか、最大シーケンス長、および上記の5~10シーケンスの手動検査が行われたことの確認。
これらの6つのフィールドのいずれかが欠けているデータセットは /finetune の準備ができていません — カードはゲートであり、事後的に書かれた要約ではありません。
フェーズ2 出口チェックリスト
/finetune に引き継ぐ前に、以下を確認してください:
- フォーマットが手法と一致していること(上の表)。
- テンプレートが連結前に適用されていること。
- 損失がアシスタントターンのみにマスクされていること。
- 5~10個のパックされたシーケンスをデコードして読んだこと。
- 最終ミックスに最低25%の実データが含まれていること。
- データセットカードが完全であること — 6つのフィールドすべて。
参考資料
references/formats-and-templates.md— フォーマットごとのJSONLサンプル、現在のTRLマスキングコード、ShareGPT変換メモ。references/synthetic-data.md— 生成手法ランキング、フィルターファネル、リプレイミックス構築、教師→生徒蒸留パターン。
関連スキル: finetuning-method-selection がここにルーティングします。lora-qlora-recipes、vision-sft、preference-optimization はこのスキルが生成するデータセットを消費します。trace-to-training-data はグレード付き軌跡データセットの出典源です。eval-harness-first は結果のチェックポイントを評価します。