ローカルLLMのファインチューニング入門|自社データで精度を高める方法

kento_morota 11分で読めます

「ローカルLLMを導入してみたけれど、自社特有の業務用語や専門知識への対応が不十分」——こうした声は中小企業のAI活用現場でよく聞かれます。汎用モデルはあくまで一般的な知識をベースにしているため、特定の業務領域で高い精度を求めるには、自社データでの追加学習が欠かせません。

この追加学習のことを「ファインチューニング」と呼びます。本記事では、ローカルLLMのファインチューニングについて、初心者にもわかりやすく基礎から実践手順まで解説します。

ファインチューニングとは何か

ファインチューニング(Fine-tuning)とは、すでに大量のデータで事前学習されたAIモデルに対して、特定の目的や領域に合わせた追加学習を行うことです。ゼロからモデルを作るのではなく、既存のモデルの知識を活かしながら、自社の業務に特化した能力を追加するイメージです。

なぜファインチューニングが必要なのか

汎用的なLLMは、インターネット上の膨大なテキストで学習されているため、一般的な質問には的確に答えられます。しかし、以下のような場面では精度が不足することがあります。

  • 業界特有の専門用語:自社固有の製品名、社内用語、業界ジャーゴン
  • 回答スタイルの統一:自社のトーン&マナーに合った文章生成
  • 特定タスクの最適化:見積書作成、議事録要約など、特定の業務フォーマット
  • 最新情報への対応:モデルの学習データに含まれない自社製品の新情報

なお、最新情報の参照が主目的であれば、RAG(検索拡張生成)の方が適している場合もあります。ファインチューニングとRAGは目的に応じて使い分けましょう。

ファインチューニングとRAGの違い

比較項目 ファインチューニング RAG
目的 モデルの振る舞い・知識を変更 外部データを参照して回答
データ更新 再学習が必要 ドキュメントの追加・更新で即反映
適している場面 回答スタイルの変更、専門用語の習得 最新情報の参照、社内文書の検索
必要リソース GPU・学習時間が必要 比較的少ないリソースで実現可能
難易度 中〜高 低〜中

ファインチューニングの主な手法

LLMのファインチューニングにはいくつかの手法があります。中小企業の限られたリソースで実行できる方法を中心に解説します。

フルファインチューニング

モデルの全パラメータを更新する手法です。最も精度が高くなる可能性がありますが、膨大なGPUメモリと計算時間が必要です。7Bパラメータのモデルでも、フルファインチューニングにはVRAM 40GB以上が必要になるため、中小企業には現実的ではありません。

LoRA(Low-Rank Adaptation)

現在最も広く使われている効率的なファインチューニング手法です。モデルの全パラメータを更新するのではなく、低ランクの行列を追加して少数のパラメータだけを学習させます。

LoRAのメリット:

  • 必要なVRAMが大幅に削減(8Bモデルで16GB程度から実行可能)
  • 学習時間がフルファインチューニングの数分の一
  • 元のモデルを壊さず、アダプターとして追加できる
  • 複数のLoRAアダプターを切り替えて使用可能

QLoRA(Quantized LoRA)

LoRAをさらに効率化した手法で、量子化されたモデルに対してLoRAを適用します。4bit量子化と組み合わせることで、8Bモデルのファインチューニングを8GB程度のVRAMで実行できます。コンシューマーGPUでも十分に試せるため、中小企業に最もおすすめの手法です。

ファインチューニングに必要な環境

QLoRAを使ったファインチューニングを前提に、必要な環境を解説します。

ハードウェア要件

ローカルLLM向けPCスペックの中でも、ファインチューニングには推論時より高いスペックが求められます。

モデルサイズ 推奨GPU 最低VRAM 推奨メモリ
3B以下 RTX 4060 8GB 16GB
7B〜8B RTX 4070 Ti 12GB 32GB
13B RTX 4090 24GB 64GB
30B以上 A100 / H100 40GB以上 128GB以上

中小企業では、8Bクラスのモデル+QLoRAが最もコストパフォーマンスの高い選択肢です。

ソフトウェア環境

ファインチューニングに必要な主なソフトウェアは以下の通りです。

  • Python 3.10以上
  • PyTorch 2.x:ディープラーニングフレームワーク
  • Transformers:Hugging Faceのモデル管理ライブラリ
  • PEFT:LoRA/QLoRAを簡単に適用するためのライブラリ
  • bitsandbytes:量子化処理用ライブラリ
  • datasets:学習データの読み込み用
# 必要ライブラリのインストール
pip install torch transformers peft bitsandbytes datasets accelerate trl

学習データの準備

ファインチューニングの成否を決める最も重要な要素は、学習データの品質です。

データ形式

一般的に、指示応答形式(Instruction format)のJSONデータを準備します。

[
  {
    "instruction": "当社の製品Aの特徴を説明してください",
    "input": "",
    "output": "製品Aは中小企業向けの在庫管理システムで、クラウドとオンプレミスのハイブリッド運用に対応しています。主な特徴は、バーコードスキャン連携、リアルタイム在庫表示、自動発注機能の3点です。"
  },
  {
    "instruction": "以下のお客様の問い合わせに回答してください",
    "input": "製品Aのライセンス料金を教えてください",
    "output": "製品Aのライセンス料金は、基本プランが月額30,000円(5ユーザーまで)、スタンダードプランが月額50,000円(20ユーザーまで)です。年間契約の場合は10%割引が適用されます。"
  }
]

データ量の目安

目的によって必要なデータ量は異なりますが、以下が目安です。

  • 回答スタイルの調整:100〜500件程度
  • 専門用語・知識の習得:500〜2,000件程度
  • 高精度な業務特化:2,000〜10,000件程度

データの量よりも質が重要です。誤った情報や低品質なデータを含めると、モデルの性能がかえって低下してしまいます。

自社データの収集方法

中小企業が学習データを効率的に収集する方法を紹介します。

  • FAQ・ヘルプデスクの過去の対応履歴:質問と回答のペアが自然に蓄積されている
  • マニュアル・仕様書:内容をQ&A形式に変換する
  • 営業資料:製品説明や提案内容をベースに作成
  • メール・チャットの対応例:個人情報を除去して活用

QLoRAによるファインチューニングの実践手順

ここからは、実際にQLoRAを使ってローカルLLMをファインチューニングする手順を解説します。ベースモデルとしてLlama 4の8Bモデルを使用する例を示します。

基本的なスクリプト

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from trl import SFTTrainer, SFTConfig
from datasets import load_dataset
import torch

# 4bit量子化設定
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=True,
)

# モデルとトークナイザーの読み込み
model_name = "meta-llama/Llama-4-Scout-8B"
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# LoRA設定
lora_config = LoraConfig(
    r=16,                # LoRAのランク
    lora_alpha=32,       # スケーリング係数
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)

# モデルにLoRAを適用
model = prepare_model_for_kbit_training(model)
model = get_peft_model(model, lora_config)

# 学習データの読み込み
dataset = load_dataset("json", data_files="training_data.json")

# トレーニング設定
training_config = SFTConfig(
    output_dir="./output",
    num_train_epochs=3,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    learning_rate=2e-4,
    logging_steps=10,
    save_steps=100,
    bf16=True,
)

# トレーニング実行
trainer = SFTTrainer(
    model=model,
    train_dataset=dataset["train"],
    args=training_config,
    tokenizer=tokenizer,
)
trainer.train()

# アダプターの保存
model.save_pretrained("./my-lora-adapter")

学習後のモデルを使う

学習が完了したLoRAアダプターは、Ollamaで使用できる形式に変換することも可能です。これにより、ファインチューニング済みモデルを普段の業務環境でそのまま利用できます。

ファインチューニング時の注意点とトラブルシューティング

実際にファインチューニングを行う際によく遭遇する問題と対処法をまとめます。

過学習(Overfitting)の防止

少量のデータで長時間学習させると、学習データを丸暗記してしまい、未知の入力に対する応答品質が低下します。以下の対策を講じましょう。

  • 学習データの一部(10〜20%)をバリデーション用に確保
  • エポック数は2〜5程度に抑える
  • 学習率を低めに設定(1e-4〜3e-4)
  • LoRAのドロップアウト率を0.05〜0.1に設定

メモリ不足(OOM)への対処

GPUメモリが不足する場合は、以下の設定を調整します。

  • バッチサイズを小さくする(per_device_train_batch_size=1)
  • gradient_accumulation_stepsを増やして実効バッチサイズを維持
  • LoRAのランク(r)を8に下げる
  • 最大シーケンス長を短くする

学習データの品質チェック

ファインチューニング前に、以下の点を必ず確認しましょう。

  • 誤字脱字や事実誤認がないか
  • 個人情報が含まれていないか
  • 回答のフォーマットが統一されているか
  • 重複データが含まれていないか

まとめ:自社に最適化されたAIを手に入れる

ファインチューニングは、ローカルLLMを自社業務に最適化するための強力な手法です。特にQLoRAの登場により、中小企業でもコンシューマーGPUで実行可能になりました。

本記事のポイント:

  • ファインチューニングはモデルの振る舞いや知識を追加・修正する手法
  • QLoRAを使えば8GB程度のVRAMからでも実行可能
  • 学習データの品質がファインチューニングの成否を決める
  • RAGとの使い分けを意識することが重要
  • 過学習の防止やメモリ管理に注意が必要

まずは少量のデータ(100件程度)から試してみることをおすすめします。おすすめモデルの中から自社の用途に合ったものを選び、段階的に精度を向上させていきましょう。セキュリティ面の配慮も忘れずに、安全なAI活用を実現してください。

#ファインチューニング#ローカルLLM#カスタマイズ
共有:
無料メルマガ

週1回、最新の技術記事をお届け

AI・クラウド・開発の最新記事を毎週月曜にメールでお届けします。登録は無料、いつでも解除できます。

プライバシーポリシーに基づき管理します

AI活用のヒントをお探しですか?お気軽にご相談ください。

まずは話だけ聞いてもらう