Fine-tuningって何? AIを「うちの会社仕様」にカスタマイズする方法

ミドリ: タツヤさん、ChatGPTを業務で使ってるんですけど、うちの業界の専門用語がうまく出なかったり、文体がブランドと合わなかったりするんですよね……。

タツヤ: あるあるだね。プロンプトで毎回「この文体で」って指示するの、正直面倒じゃない?

ミドリ: めちゃくちゃ面倒です。しかも指示しても安定しないし。

タツヤ: そういう課題を解決するのがFine-tuning(ファインチューニング)。大量のテキストで事前学習済みのAIモデルに、自社のデータで追加学習させて特定のタスクやドメインに最適化する技術のこと。

ミドリ: ゼロからAIを作るのとは違うんですか?

タツヤ: 全然違う。ゼロから作る場合と比べて、必要なデータ量は100分の1以下、計算コストも大幅に抑えられる。既に賢いモデルを「微調整」するだけだからね。

Fine-tuningの立ち位置を理解しよう

ミドリ: AIをカスタマイズする方法って、Fine-tuning以外にもありますよね?

タツヤ(nodding): いい質問。AI活用の深度に応じて4段階ある。

段階手法コスト効果適したケース
1プロンプトエンジニアリングまず最初に試すべき手法
2RAG(検索拡張生成)最新情報や社内データの参照
3Fine-tuning中〜高タスク特化、トーン・スタイルの統一
4フルスクラッチ学習極高最高独自の基盤モデルが必要な場合

ミドリ: いきなりFine-tuningに飛びつかないほうがいい、ってことですか?

タツヤ(nodding): その通り。段階1〜2で十分な成果が出るケースも多い。Fine-tuningはそれらで限界に達したときの次のステップとして位置づけるのが合理的。

どんなときにFine-tuningが効くの?

ミドリ: Fine-tuningが特に有効な場面を教えてください。

1. 一貫したトーンとスタイルの再現

タツヤ: ブランドガイドラインに沿った文章を毎回安定して出したいとき。あるメディア企業では、Fine-tuningでスタイルガイドへの準拠率が58%から94%に向上した。

ミドリ: 58%が94%に! プロンプトだけじゃ限界ですもんね。

2. 専門ドメインの用語理解

タツヤ: 医療、法律、金融みたいな専門分野では、業界固有の用語や表現の正確な理解が不可欠。ドメイン特化のデータでFine-tuningすれば、専門用語の使用精度が大幅に上がる。

3. 構造化された出力の安定化

タツヤ: 特定のJSON形式やXML形式で安定して出力したい場合。Fine-tuningで出力フォーマットの一貫性が向上する。Function Callingと組み合わせるとさらに信頼性が高まる。

4. コスト削減

タツヤ: ここが実は一番インパクトがある。Fine-tuningした小型モデルで大型モデルと同等の精度を出せれば、推論コストを大幅に削減できる。あるケースでは、Fine-tuned GPT-4o-miniがGPT-4oと同等の精度を達成して、APIコストを85%削減した。

ミドリ: 85%削減! それは経営判断に直結しますね。

データ準備が勝負の8割

ミドリ: 実際にFine-tuningを始めるとして、まず何をすればいいんですか?

タツヤ: データの準備。これがFine-tuning成功の80%を決める。「Garbage In, Garbage Out」の原則は例外なし。

データ形式

タツヤ: OpenAIのFine-tuning APIだと、こういうJSONL形式でデータを用意する。

{"messages": [{"role": "system", "content": "あなたは金融アドバイザーです"}, {"role": "user", "content": "投資信託のリスクについて教えてください"}, {"role": "assistant", "content": "投資信託には主に以下のリスクがあります..."}]}
{"messages": [{"role": "system", "content": "あなたは金融アドバイザーです"}, {"role": "user", "content": "NISAの非課税枠はいくらですか?"}, {"role": "assistant", "content": "2024年以降の新NISA制度では..."}]}

ミドリ: チャットの会話形式で用意するんですね。

必要なデータ量

タツヤ(thinking): タスクの複雑さによって変わる。

ミドリ: 数百件でいいなら、意外とハードル低いですね。

データ品質のチェックリスト

タツヤ: 量よりも質が大事。準備するときはこの6つをチェック。

  1. 正確性 — すべての回答が事実に基づいて間違いがないか
  2. 一貫性 — トーン、フォーマット、スタイルが統一されてるか
  3. 多様性 — 様々なパターンの質問と回答が含まれてるか
  4. 代表性 — 実際の利用シーンを反映した内容か
  5. 適切な長さ — 回答が短すぎず、冗長すぎないか
  6. バイアスの排除 — 偏った情報や不適切な表現が含まれてないか

実装手順を見てみよう

ミドリ: 実際のコードも見たいです。

タツヤ: OpenAIのFine-tuning APIを使った手順を4ステップで紹介しよう。

ステップ1:データのアップロード

from openai import OpenAI

client = OpenAI()

# 学習データファイルのアップロード
training_file = client.files.create(
    file=open("training_data.jsonl", "rb"),
    purpose="fine-tune"
)

# 検証データファイルのアップロード(推奨)
validation_file = client.files.create(
    file=open("validation_data.jsonl", "rb"),
    purpose="fine-tune"
)

print(f"Training file ID: {training_file.id}")
print(f"Validation file ID: {validation_file.id}")

ステップ2:Fine-tuningジョブの作成

fine_tune_job = client.fine_tuning.jobs.create(
    training_file=training_file.id,
    validation_file=validation_file.id,
    model="gpt-4o-mini-2024-07-18",
    hyperparameters={
        "n_epochs": 3,                # 学習エポック数
        "learning_rate_multiplier": 1.8,  # 学習率の倍率
        "batch_size": 4               # バッチサイズ
    },
    suffix="my-custom-model"  # モデル名のサフィックス
)

print(f"Job ID: {fine_tune_job.id}")
print(f"Status: {fine_tune_job.status}")

ステップ3:進捗の監視

import time

while True:
    job = client.fine_tuning.jobs.retrieve(fine_tune_job.id)
    print(f"Status: {job.status}")

    if job.status in ["succeeded", "failed", "cancelled"]:
        break

    time.sleep(60)

if job.status == "succeeded":
    print(f"Fine-tuned model: {job.fine_tuned_model}")

ステップ4:Fine-tunedモデルの利用

response = client.chat.completions.create(
    model=job.fine_tuned_model,  # Fine-tunedモデルのID
    messages=[
        {"role": "system", "content": "あなたは金融アドバイザーです"},
        {"role": "user", "content": "ETFとインデックスファンドの違いを教えてください"}
    ],
    temperature=0.3
)

print(response.choices[0].message.content)

ミドリ(surprised): 意外とシンプルですね。データさえ準備できれば、コード自体はそんなに複雑じゃない。

タツヤ(thinking): そう。難しいのはコーディングじゃなくてデータ準備。だからさっきデータの話を重点的にしたんだよ。

ハイパーパラメータの調整

ミドリ: コードの中に「エポック数」とか「学習率」とかありましたけど、あれは何ですか?

エポック数(n_epochs)

タツヤ: データセット全体を何回学習するかの設定。少なすぎるとモデルが十分に学習しない(アンダーフィッティング)。多すぎると学習データに過度に適合して汎化性能が下がる(オーバーフィッティング)。2〜4エポックが推奨

学習率(learning_rate_multiplier)

タツヤ: パラメータをどの程度更新するかの制御。小さい値(0.5〜1.0)だと安定だけど収束が遅い。大きい値(1.5〜2.0)だと速いけど不安定になるリスクがある。まず1.0で試して結果を見て調整するのがセオリー。

バッチサイズ

タツヤ: 一度に処理するデータの件数。データ量が少ない場合は小さめ(1〜4)、多い場合は大きめ(8〜16)で。

ミドリ: 正解が1つじゃないんですね。試しながら調整していく感じですか。

タツヤ: まさにその通り。

評価と改善のサイクル

ミドリ(thinking): Fine-tuningしたモデルが良いかどうか、どうやって判断するんですか?

タツヤ: 定量評価と定性評価の両方をやる。

定量評価

タツヤ: テストデータ(学習に使ってないデータ)で以下を測定。

定性評価

タツヤ: 数値だけじゃ捉えきれない品質面もチェック。

反復的な改善

タツヤ: 初回で完璧なモデルが得られることは稀。このサイクルで改善していく。

  1. 評価結果の分析 — どのタイプの質問で精度が低いか特定
  2. データの追加・修正 — 弱点に対応するデータを追加
  3. 再Fine-tuning — 改善したデータセットで再学習
  4. A/Bテスト — 新旧モデルを並行稼働させて実運用での差を検証

ミドリ: 一発で終わりじゃなくて、育てていくものなんですね。

コストと期間の目安

ミドリ: 気になるのはお金と時間です。

タツヤ: OpenAIのFine-tuning料金(GPT-4o-miniの場合)はこう。

タツヤ(thinking): たとえば500件の学習データ(1件平均500トークン)で3エポック学習する場合、学習コストは約$2.25。推論コストがベースモデルの2倍になる点は注意だけど、大型モデルから小型のFine-tunedモデルに移行すればトータルコストは削減。

期間の目安

タツヤ: トータルの期間はこう。

ミドリ: データ準備が一番長いんですね。やっぱりデータが命だと。

よくある質問

ミドリ: 最後に、みんなが気になりそうな質問をまとめて聞いていいですか?

RAGとFine-tuning、どっちが先?

タツヤ: ほとんどの場合、RAGが先。最新情報への対応が容易で導入コストも低い。Fine-tuningはトーン・スタイルの統一や特定フォーマットでの出力が必要な場合に検討。両方組み合わせて最大効果を発揮するケースも多い。

最低何件のデータが必要?

タツヤ(thinking): OpenAI公式の最低要件は10件だけど、実用的には50件以上。タスクの複雑さに応じて200〜1,000件あると安定した性能向上が期待できる。

セキュリティは大丈夫?

タツヤ: OpenAIのAPIを使う場合、学習データはOpenAIのインフラ上で処理される。機密性が高いデータを扱うなら、データの匿名化・仮名化を検討するか、オンプレミスでHugging Faceのオープンソースモデルを使ってFine-tuningする選択肢もある。

まとめ:データさえ揃えば、AIは「うちの会社仕様」になる

ミドリ: 今日のポイントをまとめてもらえますか?

タツヤ: Fine-tuningは、汎用AIモデルを自社専用の高精度ツールに変換するための強力な技術。覚えておいてほしいのは4つ。

ミドリ: 「AIがうちの会社を理解してくれない」は、Fine-tuningで解決できる時代なんですね。

タツヤ: そう。ただし闇雲にやるんじゃなくて、まずプロンプトとRAGを試して、それで足りないときにFine-tuning。この順番を守ることが、コストを抑えて最大効果を出す秘訣だよ。


次のアクション

ミドリ: 何から始めればいいですか?

タツヤ: 3ステップで。

  1. まずはプロンプトエンジニアリングとRAGを十分に試す — Fine-tuningの前に、これらで目標精度を達成できるか検証しよう
  2. Fine-tuningが必要と判断したら — 最低50件の高品質な学習データを準備して、小規模な実験から始めよう
  3. データ設計から評価まで一貫したサポートが必要な場合は、Shimanto AI Solutionsにご相談ください。業種別のFine-tuning実績をもとに、データ設計、ハイパーパラメータの最適化、継続的な品質改善までトータルでサポートいたします