🎯 対象読者
- 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形式をそのまま学習に使うより、instruction と input を結合して 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学習に推奨
そして実運用では:
- JSONLで保存
- datasetsで読み込み
- プロンプト前処理して
prompt列を追加 - SFTTrainerに渡す
👉 これが一番スムーズで再現性も高い流れです。