LLM・RAG

ファインチューニング用データセットの作り方|サンプル形式・必要件数・品質要件【2026年10月】

ファインチューニング用データセットの作り方|サンプル形式・必要件数・品質要件【2026年10月】

ファインチューニング用データセットは、「この入力にはこう答える」という入出力の組を、学習先が指定する形式のJSONL(1行に1件のJSON)で並べたものです。必要な件数は、OpenAIが最小10件で推奨は50件から、GoogleのGemini教師ありチューニングのデータ準備ガイドは100件からの開始を勧めています。どの学習先でも、件数より品質の影響のほうが大きくなります。

この記事では、学習先ごとのサンプル形式、件数の目安、データの作り方と品質要件を順に説明します。あわせて、公開データセット15,015件を手元で変換し、形式チェックとトークン数を実測した結果も載せます。注意点が1つあります。OpenAIのセルフサービス型ファインチューニングは、2026年5月7日以降、実行歴のない組織では使えません。これからChatGPT系のモデルで始める前提の手順は、もう成り立ちません。

まとめ:データセット作成の要点

  • 形式:基本はJSONLで、1行に1件の会話を書きます。キー名は学習先ごとに違います。OpenAIとMicrosoft Foundryはmessages、Geminiはcontentsとpartsで、応答側のroleはmodelです。Amazon NovaはschemaVersionが必須です。
  • 件数:最小件数はOpenAIが10件、Amazon Novaが8件です。推奨の開始点は、OpenAIが丁寧に作った50件、Geminiが100件です。まず50〜100件で学習と評価を回し、足りない挙動を見つけてから増やします。
  • 品質:応答の書式と口調をそろえ、本番で実際に来る入力を使い、重複を除いてから検証用を分けます。公開データにも重複や訳の崩れが残っています。
  • 投入前の検査:形式チェックに加えて、トークン数も数えます。TRLのSFTTrainerは既定で1,024トークンを超えた分を切り捨て、会話データでは既定でユーザー発話にも損失をかけます。
  • 学習先:OpenAIで新しく始めることはできません。オープンなモデルをTRLやPEFTで学習するか、Gemini Enterprise Agent Platform(旧Vertex AI)、Amazon Bedrock、Microsoft Foundryを使います。

ファインチューニング用データセットの中身:入力と理想の出力の組

データセットの1件は、本番で来る入力と、モデルに返してほしい出力の組です。問い合わせへの自動応答なら、実際の問い合わせと模範回答の組になります。決まった書式の要約なら、元の文と理想の要約の組です。モデルが学ぶのは知識そのものより、書式や口調、分類の基準といった振る舞いです。社内文書の最新の中身を答えさせたい場合は、検索結果をプロンプトに入れるRAGのほうが向いています。使い分けの基準はRAGとファインチューニングの違いと使い分け|判断基準とコストで選ぶ2026年の実装方針にまとめています。

データセットのサンプル形式:学習先ごとのJSONLの書き方

JSONLでは、ファイルの1行が1件で、各行がそれだけで完結したJSONになっていなければなりません。全体を配列で囲んだり、1件を複数行に分けて書いたりすると読み込めません。どの学習先もこの規則は同じで、違うのはキー名とroleの名前です。

学習先 会話を入れるキー 応答側のrole 最小件数 推奨の開始点
OpenAI(既存利用者のみ) messages assistant 10件 50件
Microsoft Foundry messages assistant モデルごとに異なる モデルごとに異なる
Hugging Face TRL messages/prompt・completion assistant 制限なし なし
Gemini Enterprise Agent Platform contents(本文はparts) model モデル別の表で確認 100件
Amazon Bedrock(Nova Micro・Lite・Pro) messages(本文はcontent配列) assistant 8件 タスクごとに100件以上(上限2万件)

OpenAI・Microsoft Foundryのmessages形式

OpenAIの教師ありファインチューニングのガイドでは、Chat Completionsと同じmessages配列を1行に1件ずつ並べます。Microsoft Foundryの手順も同じ形式で、学習用のtraining.jsonlと検証用のvalidation.jsonlを分けて保存するよう指示しています。

{"messages":[{"role":"system","content":"あなたは通販サイトのサポート担当です。丁寧語で3文以内に答えます。"},{"role":"user","content":"注文をキャンセルしたいです"},{"role":"assistant","content":"マイページの注文履歴から該当の注文を開き、「キャンセル」を押してください。発送準備に入った注文はキャンセルできません。"}]}
{"messages":[{"role":"system","content":"あなたは通販サイトのサポート担当です。丁寧語で3文以内に答えます。"},{"role":"user","content":"送料はいくらですか"},{"role":"assistant","content":"全国一律550円です。5,000円以上のご注文で送料は無料になります。"}]}

systemは省略できます。この例のように1つの役割と応答方針を覚えさせる場合は、全件で同じ文言にそろえてください。推論時にも同じsystemを渡すと、学習した振る舞いが再現されやすくなります。複数ターンの会話をそのまま1件にすることもできます。

OpenAIのセルフサービス型ファインチューニングは縮小が進んでいます。OpenAIの廃止予定ページによると、2026年5月7日から、ファインチューニングの実行歴がない組織はジョブを作れなくなりました。7月2日からは、直近60日にファインチューニング済みモデルで推論していない組織も作れません。2027年1月6日には既存の利用者も新しいジョブを作れなくなります。学習済みモデルでの推論は、元になったモデルが廃止されるまで続きます。ChatGPT側の事情はChatGPTのファインチューニング|GPTsとの違い・やり方・料金と新規受付終了【2026年10月】で詳しく扱っています。

Hugging Face TRLのmessages・prompt/completion・preference形式

オープンなモデルを自分で学習させるなら、Hugging FaceのTRL(2026年10月15日公開の1.16.0が最新)が標準的な選択肢です。SFTTrainerは、messages列の会話形式、prompt列とcompletion列に分けた形式、text列の素の文章の3種類を受け付けます。1行目はSFT用のprompt/completion形式、2行目はDPOTrainer用の好み比較(preference)形式です。2つの形式は別々のファイルに分けます。

{"prompt":[{"role":"user","content":"送料はいくらですか"}],"completion":[{"role":"assistant","content":"全国一律550円です。5,000円以上のご注文で送料は無料になります。"}]}
{"prompt":[{"role":"user","content":"送料はいくらですか"}],"chosen":[{"role":"assistant","content":"全国一律550円です。5,000円以上のご注文で送料は無料になります。"}],"rejected":[{"role":"assistant","content":"地域によって異なります。"}]}

preference形式では、同じ質問への良い回答(chosen)と悪い回答(rejected)を対にします。SFTで書式を覚えさせた後、言い回しの好みを寄せたい段階で使う形式で、最初の1本として作る必要はありません。

Gemini Enterprise Agent Platform(旧Vertex AI)のcontents形式

GoogleのGeminiの教師ありチューニングでは、会話をcontentsに入れ、本文はpartsの中のtextに書きます。応答側のroleはassistantではなくmodelです。OpenAI形式のデータを流用するなら、ここを書き換える必要があります。

{"systemInstruction":{"role":"system","parts":[{"text":"あなたは通販サイトのサポート担当です。丁寧語で3文以内に答えます。"}]},"contents":[{"role":"user","parts":[{"text":"送料はいくらですか"}]},{"role":"model","parts":[{"text":"全国一律550円です。5,000円以上のご注文で送料は無料になります。"}]}]}

Gemini 2.5 FlashとFlash-Liteの場合、1件あたりの入出力の上限は131,072トークンで、学習用JSONLの上限は1GBです。データはCloud Storageのバケットに置いてから学習を始めます。

Amazon Bedrock(Nova)のschemaVersion付き形式

Amazon Novaでは、各行の先頭に"schemaVersion":"bedrock-conversation-2024"を書きます。systemは配列で、本文はcontent配列の中のtextに入れます。Novaのデータ準備ガイドの制限表では、Nova Micro・Lite・Proのいずれも最小8件、最大2万件で、コンテキスト長は32kです。同じガイドは、覚えさせたいタスクごとに少なくとも100件を推奨しています。

{"schemaVersion":"bedrock-conversation-2024","system":[{"text":"あなたは通販サイトのサポート担当です。丁寧語で3文以内に答えます。"}],"messages":[{"role":"user","content":[{"text":"送料はいくらですか"}]},{"role":"assistant","content":[{"text":"全国一律550円です。5,000円以上のご注文で送料は無料になります。"}]}]}

必要な件数の目安:最小10件と推奨50〜100件の根拠

最小件数はOpenAIで10件、Novaで8件です。ただし、これは学習ジョブが動き出すための下限にすぎません。改善が見込める開始点として、OpenAIは丁寧に作った50件、Googleは100件を挙げています。GoogleのTuning APIリファレンスには、良い結果のために100〜500件以上という記述もあります。どちらの公式も、件数を増やすのは結果を評価して不足がわかってからにするよう書いています。

量より質を裏づける研究としてよく引かれるのが、LIMA論文(Zhouほか、2023年)です。650億パラメーターのLLaMaを、厳選した1,000組の質問と回答だけで教師ありファインチューニングしました。強化学習も人間の好みのモデル化も使っていません。人手の比較では、43%のケースでGPT-4と同等かそれ以上と評価されています。この結果は650億パラメーターのモデルでの1件の研究なので、そのまま自社の件数の目安にはできません。実務では、まず模範回答の書式と正確さを点検し、検証用データで足りない挙動を確かめてから件数を足す、という順番で進めてください。

データセットの作り方:収集・公開データ・変換と分割

データ収集:本番の問い合わせ履歴と模範回答

OpenAIのガイドは、丁寧に作った50件から始めて結果を評価するよう勧めています。この50件の元にするのは、本番で実際に来る入力です。問い合わせ履歴、過去に人が書いた回答、社内で決めた書式の見本などが元になります。入力が想像で作った「きれいな質問」ばかりだと、本番の誤字や言葉足らずの質問で崩れます。模範回答は、最終的に返してほしい形そのものを書いてください。箇条書きで返させたいなら全件を箇条書きに、3文以内なら全件を3文以内にそろえます。個人情報や社外秘の情報は、学習の前にマスクします。

公開データセットのサンプル:日本語の指示データとライセンス

形式の確認や練習には、日本語の公開データセットが使えます。商用で使えるかどうかはライセンスで決まるため、件数よりも先にライセンスを確認してください。件数は2026年10月27日にHugging Faceの表示と配布元で確認した値です。

データセット 件数 ライセンス 会話の列名
kunishou/databricks-dolly-15k-ja 15,015 CC BY-SA 3.0 instruction・input・output
llm-jp/oasst2-33k-ja 32,702 Apache-2.0 conversations
llm-jp/magpie-sft-v1.0 132,476 Apache-2.0 conversations
llm-jp/llm-jp-instructions v1.0 1,000(うちtrain 300) CC BY 4.0 text・output
ichikara-instruction(研究機関の公開版) 配布元で確認 CC BY-NC-SA 商用は有償の別ライセンス

dolly-15k-jaのCC BY-SA 3.0は、表示と継承の条件を守れば商用でも使えます。magpie-sft-v1.0のデータカードによると、指示はcyberagent/calm3-22b-chatで、回答はQwen2.5-32B-Instructで生成した合成データです。ichikara-instructionは、研究機関が公開している版がCC BY-NC-SAで、商用では使えません。商用で使うには、株式会社いちからの有償ライセンスが要ります。

列名にも注意が必要です。oasst2-33k-jaとmagpie-sft-v1.0は会話をconversations列に入れています。TRL 1.16.0のis_conversationalが会話形式とみなす列名は、prompt・chosen・rejected・completion・messagesの5つだけです。conversationsのままでは会話データとして扱われないため、ds.rename_column("conversations", "messages")で列名を変えてから渡します(32,702件で実行し、列名が変わることを確認しました)。

変換と分割:dolly-15k-jaで見つかった重複の混入

dolly-15k-jaのinstruction・input・outputをmessages形式に変換し、9対1で分割するコードです。macOS上のPython 3.11.15とdatasets 5.1.0で実行しました。

from datasets import load_dataset

ds = load_dataset("kunishou/databricks-dolly-15k-ja", split="train")

def to_messages(ex):
    user = ex["instruction"] if not ex["input"] else f'{ex["instruction"]}\n\n{ex["input"]}'
    return {"messages": [
        {"role": "user", "content": user},
        {"role": "assistant", "content": ex["output"]},
    ]}

chat = ds.map(to_messages, remove_columns=ds.column_names)
split = chat.train_test_split(test_size=0.1, seed=42)
split["train"].to_json("train.jsonl", force_ascii=False)
split["test"].to_json("valid.jsonl", force_ascii=False)
print(len(split["train"]), len(split["test"]))

出力は学習用13,513件、検証用1,502件でした。このコードは重複を除いていません。学習用と検証用を合わせて数えると、完全に同じ会話の重複が12件あり、そのうち1件は学習用と検証用の両方に入っていました。検証用に学習済みの問題が混ざると、検証の損失が実際より良く見えます。分割する前に重複を除いてください。

投入前の検査:形式チェックとトークン数の実測

形式チェックのスクリプトと検出例

学習先に送ってから不備に気づくと、アップロードからやり直しになります。投入前に手元で、JSONとして読めるか、最後がassistantか、空の発話や重複がないかを確かめます。標準ライブラリだけで動くスクリプトで、python3 check_jsonl.py train.jsonlのようにファイルを渡して実行します。対象は本文が文字列のmessages形式(OpenAI・Foundry・TRL)で、GeminiやNovaの形式には使えません。

import codecs, json, sys
from collections import Counter

ROLES = {"system", "user", "assistant"}

def check(path):
    errors, seen, rows = [], Counter(), 0
    with open(path, encoding="utf-8") as f:
        raw = f.read()
    if raw.startswith(codecs.BOM_UTF8.decode()):
        errors.append("ファイル先頭にBOMがある")
        raw = raw[1:]
    for no, line in enumerate(raw.splitlines(), 1):
        if not line.strip():
            errors.append(f"{no}行目: 空行")
            continue
        try:
            row = json.loads(line)
        except json.JSONDecodeError as e:
            errors.append(f"{no}行目: JSONとして読めない ({e.msg})")
            continue
        rows += 1
        msgs = row.get("messages") if isinstance(row, dict) else None
        if not isinstance(msgs, list) or not msgs:
            errors.append(f"{no}行目: messages配列が無い")
            continue
        if not all(isinstance(m, dict) and isinstance(m.get("role"), str) for m in msgs):
            errors.append(f"{no}行目: roleを持たないメッセージがある")
            continue
        roles = [m["role"] for m in msgs]
        if set(roles) - ROLES:
            errors.append(f"{no}行目: 想定外のrole {sorted(set(roles) - ROLES)}")
        if roles[-1] != "assistant":
            errors.append(f"{no}行目: 最後がassistantでない")
        if any(not isinstance(m.get("content"), str) or not m["content"].strip() for m in msgs):
            errors.append(f"{no}行目: 中身が空か文字列でないメッセージがある")
        seen[json.dumps(msgs, ensure_ascii=False, sort_keys=True)] += 1
    if rows == 0:
        errors.append("学習例が1件も無い")
    dup = sum(c - 1 for c in seen.values() if c > 1)
    if dup:
        errors.append(f"完全一致の重複が{dup}件")
    return errors

for e in check(sys.argv[1]) or ["問題なし"]:
    print(e)

わざと不備を混ぜたファイルに実行した結果です。先頭のBOM、配列で囲んだ行、assistantで終わらない行、空の回答、末尾の余分なカンマ、重複の6種類をすべて検出しました。このほか、空のファイル、roleが無いメッセージ、contentがnullのメッセージも検出することを確認しています。

ファイル先頭にBOMがある
3行目: messages配列が無い
4行目: 最後がassistantでない
5行目: 中身が空か文字列でないメッセージがある
7行目: JSONとして読めない (Illegal trailing comma before end of object)
完全一致の重複が1件

末尾カンマのエラー文は、Pythonの版で変わります。Python 3.14.6では「Illegal trailing comma before end of object」と原因が出ますが、3.11.15では「Expecting property name enclosed in double quotes」となり、原因が読み取りにくくなります。

トークン数と切り詰め:TRLの既定max_lengthは1,024

変換した学習用13,513件を、Qwen2.5-0.5B-Instructのチャットテンプレートに通してトークン数を数えました(transformers 5.21.0)。

import json, statistics, sys
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct")
lens, ans = [], []
for line in open(sys.argv[1], encoding="utf-8"):
    m = json.loads(line)["messages"]
    full = tok.apply_chat_template(m, tokenize=True, return_dict=False)
    prompt = tok.apply_chat_template(m[:-1], tokenize=True, add_generation_prompt=True, return_dict=False)
    lens.append(len(full)); ans.append(len(full) - len(prompt))
lens_sorted = sorted(lens)
print("件数", len(lens), "合計トークン", sum(lens))
print("中央値", statistics.median(lens), "95%点", lens_sorted[int(len(lens)*0.95)], "最大", max(lens))
print("1024超", sum(l > 1024 for l in lens), "件")
print("assistant部分の割合", round(sum(ans) / sum(lens) * 100, 1), "%")
項目 値
合計トークン 3,717,570
1件の中央値 173
95パーセンタイル 804
最大 9,143
1,024トークン超 384件(2.8%)
assistant部分の割合 40.7%

TRL 1.16.0のSFTConfigはmax_lengthの既定が1,024で、超えた分は末尾から切り捨てます(truncation_mode="keep_start")。会話は回答が後ろにあるため、長い384件は回答の途中や全体が欠けたまま学習に使われます。長い入力を扱うならmax_lengthを上げるか、該当する行を分割または除外してください。この数はQwen2.5のトークナイザーとチャットテンプレートで数えた値です。同じ文章でも、モデルが変わればトークン数は変わります。学習先の費用を見積もるときは、そのモデルのトークナイザーで数え直してください。

損失がかかる範囲:assistant_only_lossは既定でFalse

TRL 1.16.0では、messages形式のデータを渡すと、既定でsystemとuserの発話にも損失がかかります。上の13,513件では、トークンのうち回答部分は40.7%で、残りの59.3%は、ユーザーの質問、Qwenが自動で差し込んだ既定のsystem、テンプレートの記号でした。回答だけを学習させるにはSFTConfig(assistant_only_loss=True)を指定します。一方、prompt/completion形式なら、既定で回答部分にしか損失がかかりません。

もう1つ見落としやすいのがsystemの扱いです。Qwen2.5のテンプレートは、systemを書かない会話に「You are Qwen, created by Alibaba Cloud. You are a helpful assistant.」という英文のsystemを自動で差し込みます。systemを書いた2件のサンプルでは、キャンセルの例が80トークン中42トークン、送料の例が65トークン中39トークンを回答より前の部分が占めました。全件に同じsystemを書くと、その分のトークンが毎回かかります。入れるか省くかは、推論時の呼び方と合わせて決めてください。

品質の要件:件数より結果を左右する4つの条件

データを点検するときの観点は次の4つです。重要な順に並べます。問題が見つかった観点に応じて、回答の修正、例の追加、偏りの調整を行います。

  • 正しさ:模範回答の誤りもそのまま学習されます。上で変換・分割したtrain.jsonlの1件目は、指示が「これらは国なのか大陸なのか、教えてください」なのに、回答は国名と大陸名を並べただけで分類していません。翻訳データや合成データは、全件ではなくても抜き取りで人が読んでください。
  • 一貫性:同じ種類の入力には同じ書式と口調で答えます。回答の長さや敬語がばらつくと、モデルも本番でばらつきます。
  • 本番との近さ:入力の長さ、誤字、話題の割合を本番に寄せます。返品の問い合わせが多い窓口なら、学習データでも返品の割合を高くします。
  • 多様性:言い換えや例外のケースを入れます。同じ質問を語尾だけ変えて増やしても多様性にはなりません。

ファインチューニングに向かないデータと場面

データを作り込んでも効果が出ないケースがあります。次のような場合は、データセットを作る前に方針を見直してください。

  • 頻繁に変わる情報を覚えさせたい:料金表や在庫、社内規程のように更新される情報は、学習した時点の値で固まります。参照させるならRAGを使います。
  • プロンプトで直せる:指示を具体的にする、例を数件見せるといった方法で目的の出力が出るなら、学習は要りません。ファインチューニングは、長い指示を毎回送る費用を減らしたいときや、指示では守られない書式を固定したいときに使います。
  • 評価の基準がない:何を正解とするかを決めないまま件数を集めても、良くなったかどうか判断できません。検証用データと採点基準を先に作ります。
  • 回答の正しさを確かめる人がいない:誤った模範回答もそのまま学習されます。人が書く場合も、強いモデルの出力を使う場合も、業務を知る担当者が正誤を確認できる体制がなければ、効果は見込みにくくなります。

作成したデータセットで学習を回す先

オープンなモデルを手元やクラウドのGPUで学習させる場合は、TRLとPEFT(LoRA)の組み合わせが一般的です。必要なGPUと学習コードはファインチューニングの実行環境と実装|必要GPUと学習コード、LoRAの設定はPEFTとLoRAの違いとは?peftライブラリの使い方とQLoRA・DoRAの比較【2026年10月】、VRAMが足りないときの4bit学習はQLoRAとは?4bit量子化+LoRAの仕組み・VRAM目安・実装手順と採用判断を解説【2026年版】で説明しています。学習を速く回したいならUnslothとは?読み方とDesktopの使い方、Studio・Coreとの違い【2026年10月】も選択肢になります。

マネージドサービスを使う場合、GoogleのGeminiならGemini Enterprise Agent Platform、Amazon NovaならAmazon Bedrock、OpenAIのGPT系モデルならMicrosoft Foundryです。前の章で見たとおり、形式は学習先ごとに違います。データはまず手元で正本の形式(たとえばmessages形式)にそろえ、学習先に合わせて変換するのが手戻りの少ない進め方です。業務データの整理から学習先の選定までまとめて相談したい場合は、生成AI導入支援で対応しています。

よくある質問

ファインチューニングのデータセットは何件必要ですか?

最小件数はOpenAIが10件、Amazon Novaが8件です。改善を見込める開始点は、OpenAIが50件、Googleが100件を勧めています。まず50〜100件の質の高いデータで学習と評価を行い、足りない挙動がわかってから増やしてください。

データセットのサンプルはどんな形式で用意しますか?

1行に1件のJSONを書くJSONLで用意します。OpenAIとMicrosoft FoundryとTRLはmessages配列、Geminiはcontents配列(応答側のroleはmodel)、Amazon NovaはschemaVersion付きのmessagesを使います。

データセットは質と量のどちらが重要ですか?

質です。Googleのデータ準備ガイドも、データセットの質は量よりはるかに重要だと書いています。LIMA論文では、厳選した1,000件だけの学習で、43%のケースでGPT-4と同等以上と評価されました。

ChatGPTのファインチューニングにはどんなデータが必要ですか?

形式はmessages配列のJSONLで、本番の入力と模範回答の組を最低10件用意します。ただし、OpenAIは2026年5月7日以降、ファインチューニングの実行歴がない組織のジョブ作成を止めています。新しく始めるならMicrosoft FoundryのGPT系モデルか、オープンなモデルを使います。

音声データでファインチューニングするときのサンプリングレートは?

Whisperを微調整する場合、Hugging Faceの解説のとおり、特徴抽出器は16kHzの音声を前提にしています。48kHzなどで録った音声は、事前に16kHzへリサンプリングしてください。Whisperの動かし方はWhisperをPyTorchで動かす手順|openai-whisper・faster-whisper・Transformersと日本語・GPU設定で説明しています。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

ほか 4 件の記事からもリンクされています。

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2025.02.27 コラム トラッキングビーコン(Webビーコン)とは?仕組み・用途・確認と対策を徹底解説
  2. 2026.10.27 テックブログ Brotli 脆弱性:CVE-2026-111497の影響確認とNode.js・Python・.NETの更新手順
  3. 2026.10.27 テックブログ Joshin(ジョーシン)不正アクセス:最大600万件の対象とサブスク初期パスワードの対処
  4. 2026.10.23 テックブログ Renta!はいつ再開?不正アクセスでメールアドレス等が流出したおそれ・再開時のパスワード再設定と運営側の対応
  5. 2026.07.09 テックブログ Muse Imageとは?Metaの画像生成AIの使い方・API料金(1枚0.01ドル)と日本での提供状況【2026年10月】

RELATED POSTS 関連記事

目次