0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Hugging Face Datasetsで使うSFTフォーマットまとめ

Posted at

🎯 対象読者

  • LLMを 教師あり微調整 (SFT: Supervised Fine-Tuning) したい人
  • Hugging Face の datasets を使ってデータを管理したい人
  • どんなカラム構造でデータを持てばいいか整理したい人

🔹 SFTとは?

SFT(教師あり微調整)とは、入力と出力のペアを使ってLLMを追加学習させる手法です。
ChatGPTのような「指示応答モデル」を作るときの基本となります。

このとき重要なのが データフォーマット
SFTでよく使われるデータ構造は大きく分けて3種類あります。


🔹 データのカラム構造(3パターン)

① Alpaca形式(instruction / input / output)

古典的な標準形式。研究用データセットに多い。

{
  "instruction": "次の英文を日本語に翻訳してください。",
  "input": "I love programming.",
  "output": "私はプログラミングが大好きです。"
}
  • instruction : ユーザーの指示
  • input : 補足情報(空のこともある)
  • output : モデルに期待する答え

👉 学習前に instruction + input を結合して「prompt列」を作るのが一般的です。


② input / output 形式(簡易型)

最小限のシンプル構造。

{
  "input": "Translate to Japanese: I love programming.",
  "output": "私はプログラミングが大好きです。"
}
  • 「入力 → 出力」のペアのみ。
  • 事前にプロンプト加工を済ませておきたい場合に便利。

③ Chat形式(messages)

最近の LLaMA-2 / Mistral / ChatGLM 系で推奨される形式。
会話履歴をそのまま保持できるのが特徴です。

{
  "messages": [
    {"role": "user", "content": "次の英文を日本語に翻訳してください: I love programming."},
    {"role": "assistant", "content": "私はプログラミングが大好きです。"}
  ]
}
  • messages : 会話の履歴をリストで保持
  • role : "user" | "assistant" | "system"
  • content : 発話内容

👉 複数ターンの会話データを作れるので、チャットボット学習に最適。


🔹 Hugging Face datasets での扱い方

Pythonで作成してDataset化

from datasets import Dataset

data = [
    {
        "instruction": "日本語に翻訳してください。",
        "input": "I love programming.",
        "output": "私はプログラミングが大好きです。"
    }
]

dataset = Dataset.from_list(data)
print(dataset[0])

出力:

{
  'instruction': '日本語に翻訳してください。',
  'input': 'I love programming.',
  'output': '私はプログラミングが大好きです。'
}

🔹 推奨補足

① JSONL形式での保存

データは JSONL(1行1JSON) 形式で保存するのが一般的です。

{"instruction": "日本語に翻訳してください。", "input": "I love programming.", "output": "私はプログラミングが大好きです。"}
{"instruction": "フランス語に翻訳してください。", "input": "Good morning.", "output": "Bonjour."}

保存例:

data.jsonl

② datasetsの読み込み方法

from datasets import load_dataset

dataset = load_dataset("json", data_files="data.jsonl")

print(dataset["train"][0])

③ 前処理(プロンプト組み立て)

Alpaca形式をそのまま学習に使うより、instructioninput を結合して prompt を作るのがおすすめです。

def format_prompt(example):
    if example["input"]:
        example["prompt"] = f"{example['instruction']}\n\n{example['input']}"
    else:
        example["prompt"] = example["instruction"]
    return example

dataset = dataset.map(format_prompt)
print(dataset["train"][0]["prompt"])

出力例:

日本語に翻訳してください。

I love programming.

👉 こうして prompt + output をセットで学習データにできます。


🔹 SFTTrainerでの利用例

Hugging Face の trl ライブラリを使うと、datasetsをそのままSFTに利用できます。

from transformers import AutoModelForCausalLM, AutoTokenizer
from trl import SFTTrainer

model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")

trainer = SFTTrainer(
    model=model,
    train_dataset=dataset["train"],
    dataset_text_field="prompt",  # instruction+inputをまとめた列
    tokenizer=tokenizer,
)
trainer.train()

🔹 まとめ

  • Alpaca形式instruction / input / output、古くからの標準
  • input / output形式 → シンプルで前処理済みに便利
  • Chat形式 → 複数ターン会話や最近のLLM学習に推奨

そして実運用では:

  1. JSONLで保存
  2. datasetsで読み込み
  3. プロンプト前処理してprompt列を追加
  4. SFTTrainerに渡す

👉 これが一番スムーズで再現性も高い流れです。


🚀 参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?