ファインチューニングとは?意味・仕組みとデータセットの作り方、RAGとの使い分けをわかりやすく解説
ファインチューニング(fine-tuning)とは、すでに大量のデータで学習済みのAIモデルに、自分の用途に合わせた少量のデータを追加で学習させて、モデルの重み(パラメータ)を微調整することです。生成AIでは「質問と模範回答の組」を数十〜数百件用意し、決まった形式・口調・分類のしかたを安定して守らせたいときに使います。
この記事では、ファインチューニングの意味と仕組み、プロンプトやRAGとの使い分け、学習用データセットの作り方(Pythonで作成・チェックする例つき)、2026年10月時点で使える主なサービスを、各社の公式ドキュメントで確認した内容をもとに解説します。画像認識などで使われる転移学習との関係は転移学習とは?ファインチューニングとの違いで、PyTorchの実装例とあわせて詳しく説明しています。
ファインチューニングの意味と仕組み
大規模言語モデル(LLM)は、まずインターネット上の文章などで「事前学習」され、言葉の使い方や一般的な知識を身につけます。ファインチューニングは、その事前学習済みのモデルを出発点にして、特定のタスクの例だけを使ってもう一度学習させる工程です。ゼロから学習するのに比べて、必要なデータも計算量もずっと少なく済みます。
Google Cloudのドキュメントは、ファインチューニングを「自分のラベル付きデータセットでベースモデルを再学習し、重みをタスクとデータに適応させること」と説明しています(Introduction to tuning)。OpenAIの説明でも、用意した例をもとにモデルの重みを更新し、例と同じような出力をするモデルを作るものとされています(Supervised fine-tuning)。
フルファインチューニングとLoRA(パラメータ効率のよいチューニング)
ファインチューニングには、モデルのすべてのパラメータを更新する「フルファインチューニング」と、一部だけを更新する「パラメータ効率のよいチューニング(PEFT)」があります。Google Cloudのドキュメントでは、後者は計算資源が大幅に少なく、より小さいデータセットで速く適応できる一方、フルファインチューニングは複雑なタスクで高い品質を出せる可能性があるが学習と運用の費用が高くなる、と整理されています(出典)。
PEFTの代表がLoRA(Low-Rank Adaptation)です。元の重みは固定したまま、小さな行列を2つ追加してそこだけを学習します。LoRAの論文では、GPT-3 175Bを通常の方法でファインチューニングする場合と比べ、学習するパラメータ数を1万分の1、GPUメモリを3分の1にできたと報告されています(LoRA: Low-Rank Adaptation of Large Language Models)。重み行列1つで、学習するパラメータの数を比べてみます。
# LoRAで学習するパラメータ数の比較(4096×4096 の重み行列1つの場合)
d = 4096
full = d * d
print(f"全体を更新: {full:,} 個")
for r in (4, 8, 16):
lora = 2 * d * r # d×r と r×d の2つの小さな行列
print(f"LoRA r={r:2d}: {lora:,} 個(全体の {lora / full:.2%})")
実行結果:
全体を更新: 16,777,216 個
LoRA r= 4: 32,768 個(全体の 0.20%)
LoRA r= 8: 65,536 個(全体の 0.39%)
LoRA r=16: 131,072 個(全体の 0.78%)
ランク(r)が16でも、更新するのは元の行列の1%未満です。オープンなモデルを自分でファインチューニングする場合は、Hugging FaceのPEFTライブラリでLoRAを使うのが一般的です。
転移学習との違い
転移学習は「あるタスクで学んだ知識を別のタスクに生かす」という広い考え方で、ファインチューニングはその代表的なやり方の1つです。画像分類で、学習済みモデルの最後の層だけを付け替えて学習する方法も、モデル全体を少しずつ学習し直す方法も、転移学習に含まれます。
プロンプト・RAG・ファインチューニングの使い分け
生成AIを自分の用途に合わせる方法は、ファインチューニングだけではありません。Google Cloudのドキュメントは、まずプロンプトで最適な指示を探し、必要な場合にファインチューニングへ進むことを勧めています(出典)。
| 方法 | やること | 向いているケース | 向いていないケース |
|---|---|---|---|
| プロンプトの工夫 | 指示文や例をプロンプトに書く | まず試すとき、データが少ないとき | 指示が長くなりすぎる、毎回同じ失敗をする |
| RAG(検索拡張生成) | 社内文書などを検索し、その内容をプロンプトに入れて答えさせる | 最新の情報や社内の知識を答えさせたい | 口調や出力形式そのものを変えたい |
| ファインチューニング | 例を学習させてモデルの重みを変える | 決まった形式・口調・分類を安定させたい、短いプロンプトで動かしたい | 頻繁に変わる知識を覚えさせたい |
OpenAIのガイドは、ファインチューニングが向いている例として、分類、ニュアンスを含む翻訳、決まった形式での生成、指示に従えない失敗の修正を挙げています(出典)。逆に「社内の規程を覚えさせたい」「最新の商品情報を答えさせたい」といった知識の追加は、情報が変わるたびに学習し直す必要があるため、RAGのほうが扱いやすいことが多いです。Google Cloudのドキュメントは、ファインチューニングの利点の1つに、プロンプトから長い指示や例を省けることによる推論コストの削減を挙げています(出典)。
ファインチューニング用データセットの作り方
何件必要か
必要な件数はタスクによって大きく変わります。OpenAIのガイドでは、最低10件から学習でき、50〜100件で改善が見られることが多いとして、まずよく練った50件で試して評価することを勧めています。50件で効果がなければ、データを増やす前にタスクやプロンプトを見直すべきだとも書かれています(出典)。Google Cloudのドキュメントは、ファインチューニングが最も効果的なのはラベル付きデータがある程度ある場合だとして、目安に「100件以上」を挙げています(出典)。
よいデータの条件
- 本番と同じ形の入力にする:実際にユーザーが送る質問の長さ・言い回し・形式に近づけます。Google Cloudのドキュメントも、学習データは本番で受け取るプロンプトの分布・形式・文脈を反映すべきだとしています。
- 回答は「そのまま出してほしい完成形」にする:モデルは回答の書き方をまねるので、表記ゆれや誤りがあるとそれも学習します。
- 量より質:両社のドキュメントとも、ラベルが正確な高品質のデータが量より重要だとしています。
- 評価用のデータを分けておく:学習に使っていない例で、元のモデルと比べて本当によくなったかを確かめます。OpenAIは、ファインチューニングに投資する前に評価の仕組みを用意するよう強調しています。
- 個人情報や権利のあるデータに注意する:問い合わせ履歴などを使う場合は、個人情報を取り除き、社内のルールと各サービスの規約を確認します。
JSONL形式でデータを作る
多くのサービスやライブラリでは、1行に1件の例をJSONで書く「JSONL」形式を使います。会話形式の場合は、system(役割の指示)・user(質問)・assistant(模範回答)の発言を並べます。次のコードは、架空のパン屋の問い合わせ対応を例に、学習用ファイルを作るものです。
import json
SYSTEM = "あなたは架空のパン屋「こむぎ堂」の問い合わせ窓口です。丁寧に、2文以内で答えます。"
# 実際の問い合わせと、模範となる回答の組(説明用の架空の例を3件だけ)
pairs = [
("予約はできますか?", "はい、前日の17時までお電話で承ります。当日のご予約はお受けしていません。"),
("駐車場はありますか?", "申し訳ありません、専用の駐車場はございません。近くのコインパーキングをご利用ください。"),
("アレルギー表示はありますか?", "はい、すべての商品に特定原材料の表示をしています。ご不明な点は店頭でお尋ねください。"),
]
with open("train.jsonl", "w", encoding="utf-8") as f:
for q, a in pairs:
row = {"messages": [
{"role": "system", "content": SYSTEM},
{"role": "user", "content": q},
{"role": "assistant", "content": a},
]}
f.write(json.dumps(row, ensure_ascii=False) + "\n")
print(open("train.jsonl", encoding="utf-8").readline())
実行結果:
{"messages": [{"role": "system", "content": "あなたは架空のパン屋「こむぎ堂」の問い合わせ窓口です。丁寧に、2文以内で答えます。"}, {"role": "user", "content": "予約はできますか?"}, {"role": "assistant", "content": "はい、前日の17時までお電話で承ります。当日のご予約はお受けしていません。"}]}
データをチェックしてから学習に回す
学習ジョブは時間も費用もかかるので、ファイルの段階で形式の誤りや件数不足を見つけておきます。次のコードは、JSONとして読めるか、最後が模範回答になっているか、空の発言や重複がないか、件数が足りているかを確認し、学習用と評価用に分けるものです。
import json, random
def check_dataset(path, min_lines=10):
rows, problems = [], []
with open(path, encoding="utf-8") as f:
for i, line in enumerate(f, 1):
try:
row = json.loads(line)
except json.JSONDecodeError:
problems.append(f"{i}行目: JSONとして読めません")
continue
roles = [m.get("role") for m in row.get("messages", [])]
if not roles or roles[-1] != "assistant":
problems.append(f"{i}行目: 最後が assistant の発言ではありません")
if any(not m.get("content") for m in row.get("messages", [])):
problems.append(f"{i}行目: 空の発言があります")
rows.append(row)
if len(rows) < min_lines:
problems.append(f"件数が{len(rows)}件です(最低{min_lines}件)")
users = [r["messages"][-2]["content"] for r in rows if len(r.get("messages", [])) >= 2]
dup = len(users) - len(set(users))
if dup:
problems.append(f"同じ質問が{dup}件重複しています")
return rows, problems
rows, problems = check_dataset("train.jsonl")
print("件数:", len(rows))
for p in problems:
print("要確認:", p)
# 学習用と評価用に分ける(評価用は学習に使わない)
random.seed(0)
random.shuffle(rows)
n_valid = max(1, len(rows) // 5)
valid, train = rows[:n_valid], rows[n_valid:]
print("学習用:", len(train), "件 / 評価用:", len(valid), "件")
実行結果:
件数: 3
要確認: 件数が3件です(最低10件)
学習用: 2 件 / 評価用: 1 件
3件しかないので「最低10件」の警告が出ています。実際には、本番の問い合わせから代表的なものを集め、まず50件程度を目標に作るとよいでしょう。サービスごとに必要な形式は少しずつ違うため、使うサービスのドキュメントで最終的な形式を確認してください。
ファインチューニングができる主なサービス(2026年10月14日確認)
| サービス | 状況・できること |
|---|---|
| OpenAI API | 2026年5月7日以降、過去に使ったことのない組織は新しくファインチューニングできません。既存の利用者も2027年1月6日に新しい学習ジョブを作れなくなる予定で、作成済みのモデルは元のモデルが廃止されるまで使えます(Deprecations)。 |
| Google Cloud(Gemini Enterprise Agent Platform) | Geminiモデルの教師ありファインチューニングに対応。対応モデルとしてGemini 3.5 Flash、Gemini 3.1 Flash-Lite、Gemini 2.5 Pro/Flash/Flash-Liteが挙げられています(Tune Gemini models with supervised fine-tuning)。 |
| Amazon Bedrock | 教師ありファインチューニング、強化学習によるファインチューニング、大きなモデルの知識を小さなモデルに移す蒸留(Distillation)などのカスタマイズ方法を提供(Customize your model)。対応モデルは方法ごとに異なります。 |
| オープンなモデル+Hugging Face | 公開されているモデルを自分のGPU環境やクラウドで学習。TRLのSFTTrainerとPEFT(LoRA)を組み合わせるのが代表的です。 |
なお、Googleの生成AI開発基盤は、以前の「Vertex AI」の名前で紹介されていることが多いですが、2026年10月時点の公式ドキュメントでは「Gemini Enterprise Agent Platform」の名前で案内されています。古い記事の手順やURLは変わっている可能性があるので、公式ドキュメントで確認してください。OpenAI APIの全体像はOpenAI APIの使い方にまとめています。
ファインチューニングの注意点
- 知識は「覚えさせる」より「渡す」ほうが確実:ファインチューニングで新しい事実を覚えさせても、正確に答えるとは限りません。事実を答えさせたいならRAGを検討します。
- 元のモデルの廃止に引きずられる:クラウドのファインチューニング済みモデルは、元のモデルが廃止されると使えなくなることがあります(OpenAIは元のモデルの廃止まで推論可能と明記)。作り直しに備えて、データと評価の手順を残しておきます。
- 学習しすぎ(過学習):同じ例ばかりを何度も学習させると、学習データにない質問への答えが悪くなることがあります。評価用データで確かめながら、エポック数(データを何周させるか)を調整します。
- 安全性のチェック:OpenAIでは、ファインチューニング済みモデルに安全性の評価が行われ、基準を満たさないと利用できない仕組みがあります(出典)。
国内の企業がLLMを「ゼロから作る」のか「既存モデルを追加学習する」のかの違いは、国産LLM・基盤モデルの開発企業でも整理しています。
よくある質問
Q. ファインチューニングとは簡単に言うと何ですか?
学習済みのAIモデルに、自分の用途に合わせた少量のデータを追加で学習させ、モデルの重みを微調整することです。ゼロから学習するよりも少ないデータと計算量で、決まった形式や口調を安定して守らせられます。
Q. ファインチューニングにはデータが何件必要ですか?
タスクによって大きく変わります。OpenAIのガイドは最低10件、50〜100件で改善が見られることが多いとして、まず50件で試すことを勧めています。Google Cloudのドキュメントは目安として100件以上を挙げています。
Q. ファインチューニングとRAGはどちらを使えばいいですか?
最新の情報や社内の知識を答えさせたいならRAG、出力の形式・口調・分類のしかたを安定させたいならファインチューニングが向いています。どちらの場合も、まずプロンプトの工夫で足りるかを試すのがおすすめです。
Q. OpenAIのAPIでファインチューニングはできますか?
2026年10月14日時点では、過去に使ったことのない組織は新しく利用できません。既存の利用者も2027年1月6日に新しい学習ジョブを作れなくなる予定です。新しく始める場合は、Google CloudやAmazon Bedrock、オープンなモデルの利用を検討します。
Q. ファインチューニング用のデータセットはどう作りますか?
本番に近い質問と、そのまま出してほしい模範回答の組を集め、1行に1件ずつJSONで書いたJSONL形式にするのが一般的です。学習に使わない評価用のデータも分けておき、学習の前に形式の誤りや重複をチェックします。
まとめ
ファインチューニングは、学習済みモデルを少量の例で微調整し、決まった形式や口調を安定させるための方法です。始める前にプロンプトとRAGで足りないかを確かめ、使うと決めたら、本番に近い質問と完成形の回答を50件ほど丁寧に作り、評価用のデータで効果を測ります。提供状況はサービスによって大きく変わっており、OpenAIは新規受付を終えているため、Google Cloud・Amazon Bedrock・オープンなモデルのどれを使うかを最初に決めておきましょう。
AI開発・エージェントの関連記事
同じテーマの記事をまとめています。あわせて読むと理解が早くなります。
- 競馬予想AIエージェントの作り方完全ガイド:初心者でも分かる開発手順とポイント
- Word2Vec完全ガイド:機械学習による単語ベクトル化の仕組みと活用法
- アポドリの評判・口コミは?営業AIエージェントの料金や特徴を徹底解説
- タスク管理ツール連動AIエージェントの作り方 – 完全開発ガイド
- 機械学習におけるベクトル演算完全ガイド:基礎から応用まで徹底解説
機械学習の全体像は機械学習とは?初心者でもわかる完全ガイドにまとめています。





