dataset-curation について
dataset-curation は、ファインチューニング用データを準備するチーム向けに、形式選択、テンプレート処理、パッキング、合成データの混合、データセットカード作成を案内します。検証とカードの完成をトレーニング開始前の条件にしています。
主な機能
- 01手法に応じたデータ形式の選択
- 02チャットテンプレートと損失マスクの適用
- 03サンプルのパッキングと境界確認
- 04合成データと実データの比率管理
- 05出所や設定を記すデータセットカード
活用シーン
- 01指示や会話例を学習用 JSONL に整形
- 02選好最適化やプロンプトのみのデータを準備
- 03学習前にパック列とテンプレートを確認
- 04データの出所を記録し準備状況を検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ wshobson/ agents --skill dataset-curationインストール後、Claude Code で/dataset-curationを入力して読み込まれたか確認します。
同梱ファイルreferences/formats-and-templates.mdreferences/synthetic-data.md
詳細
データセットのキュレーション
このスキルは、finetuning-method-selection がすでにここへルーティングしたことを前提としています — 次のステップは手法の選択ではなく、データの準備です。以下で扱う内容は、対象手法ごとのフォーマット選択、最もよくある「サイレントな学習失敗」の背後にあるテンプレート/パッキングの仕組み、崩壊を起こさずに合成データを混ぜるためのルール、そして実行開始前にフェーズ 2 を締めくくるデータセットカードです。
入力: 生のサンプル(デモンストレーション、選好判断、またはタスクプロンプト)と、finetuning-method-selection からのルーティング判断。
出力形式: フォーマット済みで、パッキング済み、検証済みの JSONL データセットと、記入済みのデータセットカード — /finetune が学習を起動する前にチェックするフェーズ 2 の成果物です。
フォーマット選択
| 手法 | 形状 | 行数 |
|---|---|---|
| SFT、単一ターン | Instruct(instruction/response または prompt/completion) | 目安として約 1,000 行以上 |
| SFT、マルチターン | Conversation / 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": "..."} ]}
チャットテンプレートと損失マスキング
対象モデルのチャットテンプレートは、連結やパッキングの前に適用してください。決して後にしてはいけません — 生のテキストをパッキングしてから、そのパッキング済みの塊にテンプレートを適用すると、ターン境界が壊れ、各サンプルに対するロールマーカーが誤った位置に置かれてしまいます。
-
アシスタントの応答のみで学習させる。 system/user ターンとテンプレート自身のロールマーカーに対して損失をマスクし(ラベルテンソルで
-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 つのシーケンスに連結し、その無駄の大部分を削減します。
-
パッキングはバッチの意味論を変えます。 パッキングされた 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の リプレイミックス構築レシピを参照)。 どの行を「実データ」として カウントするかをデータセットカードに明記し、 下限が構造的に 満たせないままにならないようにしてください。 - Magpie と棄却サンプリングが 主力です。 Magpie はモデル自身の テンプレート事前分布からプロンプトを抽出し、棄却サンプリングは プロンプトごとに複数の候補を生成し、 フィルターを通過したものだけを残します。どちらも素朴な 単発生成を上回ります。
- 対象を絞った、生徒モデルを意識した生成は、静的な 生成よりもサンプル効率が 1.3~2 倍優れています — 生徒モデルの実際の失敗モードを狙うことで、 より少ないフィルタリング済み例で品質基準に到達します。
- フィルタリング後の典型的な採用率は 10~30% です。 それに応じて量を計画してください — 採用率 15% で 10,000 行を目標とする場合、約 65,000 件以上の生の生成が必要です。
- 生成手法のランキング、フィルターファネル、リプレイ
ミックスの構築、蒸留パターン:
references/synthetic-data.md。
データセットカード
学習に到達するすべてのデータセットにはカードが付与されます —
これは必須のフェーズ 2 成果物であり、/finetune が
起動前にチェックします。カードは自由形式の
ドキュメントではありません。以下のフィールドを必ず備えなければなりません (MUST):
- 来歴 (Provenance) — すべての行の出所 (実データ
ソース、合成手法、またはその両方)、
trace-to-training-dataの出力まで追跡可能であること。 - 件数 (Counts) — 総行数、および分割されている場合は 各分割 (train/eval/held-out) ごとの行数。
- 合成/実データ比 — 測定された比率。 上記の ≥25% の実データ下限と照合して確認すること。
- 重複排除手法 (Dedup method) — 完全一致、
意味的 (埋め込みしきい値)、またはその両方。
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— 生成手法の ランキング、フィルターファネル、リプレイミックスの構築、 および teacher→student 蒸留パターン。
関連スキル: finetuning-method-selection は
ここにルーティングします; lora-qlora-recipes、vision-sft、および
preference-optimization はこのスキルが生成するデータセットを消費します;
trace-to-training-data は採点済みトラジェクトリデータセットの
来歴ソースです;
eval-harness-first は結果として得られるチェックポイントを評価します。