ショーケースに戻る

🎧 音声版記事

0:000:00
再生速度:

記事の内容を音声でお聞きいただけます

軽量日本語LLMをカスタマイズ

~Qwen2.5ファインチューニングで領域特化型AIエージェント構築の可能性を検証した記録報告~

2025年8月3日実証検証記録15分で読める

はじめに

「ChatGPTは便利だが、自社の業務知識を学習させたい」という要望は多い。しかし、APIコストやデータプライバシーの懸念から導入を躊躇する企業も少なくない。

本記事では、無料のGoogle Colabで、日本語対応の業務特化LLMを構築した実証結果を報告する。題材として仮想の日本料理店「花月」の接客AIを作成し、ベースモデルとの性能比較まで行った。

本記事の意図・目的

LLMカスタマイズのEnd to Endプロセスを記録に残すこと

  • GPUが必要な学習(ローカルでは不可なプロセス): Google Colab(無料GPU)で実施
  • その他すべての作業: ローカルノートPCで完結
  • 完全なワークフロー: データ作成→学習→統合→評価まで一貫した手順

高性能GPUを持たない個人・中小企業でも、LLMのモデルカスタマイズが可能であることを実証し、そのプロセスをできるだけ再現可能な形で記録した。

1. 技術選定:なぜQwen2.5-0.5Bを選んだか

ベースモデルの要件

  • 日本語対応されている
  • 軽量(ローカル環境で実用的)
  • ファインチューニングを行うことができる
  • Ollama対応可能

選定結果

model_name = "Qwen/Qwen2.5-0.5B"
# パラメータ数: 494,032,768 (約494M)
# メモリ使用量: 約1GB(量子化後)

Qwen2.5-0.5Bは中国Alibaba製だが、日本語対応可能で、かつ軽量で扱いやすい。

2. 環境構築と技術スタック

実行環境

学習環境:
  プラットフォーム: Google Colab(無料版)
  GPU: Tesla T4 (14GB)
  Python: 3.11.13
  
推論環境:
  OS: WSL2 Ubuntu on Windows 11
  CPU: AMD Ryzen 7 8840U
  メモリ: 16GB
  ツール: Ollama v0.9.2

必要ライブラリ(再現性のため明記)

Google Colab環境
# Google Colab環境
torch==2.6.0+cu124
transformers==4.54.1
peft==0.17.0  # LoRA用
accelerate
datasets
ローカル環境(マージ用)
# ローカル環境(マージ用)
torch==2.7.1
transformers==4.54.1
peft==0.17.0

3. 学習データの作成

データセット設計

日本料理店「花月」の情報を25項目のQ&A形式で作成した。

学習データサンプル
[
  {
    "instruction": "花月の営業時間を教えてください",
    "output": "花月の営業時間は、昼の部が11:30~14:30(ラストオーダー14:00)、夜の部が17:30~22:30(ラストオーダー21:30)でございます。日曜・祝日は定休日とさせていただいております。"
  },
  {
    "instruction": "花月の場所はどこですか?",
    "output": "日本料理店「花月」は東京都花月区桜町3-12-7 桜花月ビル2階にございます。桜見橋駅から徒歩3分、花月中央駅から徒歩5分の好立地でございます。"
  },
  {
    "instruction": "花月のおすすめ料理を教えて",
    "output": "花月の名物料理は「季節の会席膳」(5,800円)でございます。旬の食材を使った前菜、お造り、焼き物、煮物、ご飯物、水菓子の全7品構成です。特に、毎朝築地から仕入れる新鮮な魚介のお造りと、京都から取り寄せる季節の野菜を使った煮物が好評でございます。"
  }
  // ... 全25項目
]

ポイント

  • 丁寧語・敬語で統一し、接客品質を担保
  • 具体的な数値(価格、時間、人数)を含める
  • 自然な日本語表現を心がける

4. Google ColabでのLoRA学習

LoRA設定(最適化版)

LoRA設定
from peft import LoraConfig, get_peft_model, TaskType

lora_config = LoraConfig(
    r=16,                           # ランク(表現力)
    lora_alpha=32,                  # 学習強度  
    target_modules=[                # 全Attention層を対象
        "q_proj", "k_proj", "v_proj", "o_proj",
        "gate_proj", "up_proj", "down_proj"
    ],
    lora_dropout=0.05,
    bias="none",
    task_type=TaskType.CAUSAL_LM
)

# 適用結果
model = get_peft_model(model, lora_config)
# trainable params: 8,798,208 || all params: 502,830,976 || trainable%: 1.7497

学習パラメータ

学習パラメータ設定
optimizer = AdamW(
    model.parameters(),
    lr=2e-4,                # 学習率
    weight_decay=0.01,      # 重み減衰
)

epochs = 8                  # エポック数
batch_size = 1              # バッチサイズ(メモリ制約)
max_length = 512            # 最大トークン長

学習実行と結果

学習ログ
🚀 最適化学習開始 - 8エポック
📊 総ステップ数: 200

Epoch 1/8, Loss: 14.7339 → 1.3636
Epoch 2/8, Loss: 0.2531
Epoch 3/8, Loss: 0.1461
Epoch 4/8, Loss: 0.0788
Epoch 5/8, Loss: 0.0439
Epoch 6/8, Loss: 0.0225
Epoch 7/8, Loss: 0.0149
Epoch 8/8, Loss: 0.0135

🎉 最適化学習完了!
⏱️ 総学習時間: 62.4秒 (1.0分)
📊 最終Loss: 0.0245
📈 Loss改善: 14.7339 → 0.0245 (99.8%改善)

わずか62.4秒で99.8%のLoss改善を達成した。

5. ローカル環境への統合

LoRAアダプターのマージ

Google Colabで学習したLoRAアダプター(35MB)をベースモデルにマージする。

LoRAの仕組み

LoRAアダプターは、ベースモデルに着脱可能な「差分情報」として機能する。これにより:

  • ベースモデル(494M)は変更せず、アダプター(35MB)のみで専門知識を追加
  • 異なる業務用途ごとにアダプターを差し替え可能
  • 軽量な学習と効率的な運用を両立
環境準備
# 環境準備
$ source ~/venv_llm/bin/activate
$ python3 merge_lora_to_gguf.py
merge_lora_to_gguf.py の核心部分
# merge_lora_to_gguf.py の核心部分
from peft import PeftModel

# ベースモデル読み込み
base_model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-0.5B",
    torch_dtype=torch.float16,
    device_map="cpu"
)

# LoRAアダプター適用
peft_model = PeftModel.from_pretrained(base_model, "./kagetsu_optimized_extracted")

# マージして単一モデル化
merged_model = peft_model.merge_and_unload()
merged_model.save_pretrained("./kagetsu_merged_model")

実行結果:

🤖 LoRA → マージ → GGUF → Ollama 変換パイプライン
============================================================
ベースモデル: Qwen/Qwen2.5-0.5B
LoRAアダプター: kagetsu_optimized_extracted
出力先: kagetsu_merged_model

📥 ベースモデル読み込み中...
🔧 LoRAアダプター適用中...
🔄 モデルマージ中...
💾 マージ済みモデル保存中...
✅ LoRAマージ完了!

🚀 Ollamaモデル作成中: kagetsu-optimized
✅ Ollamaモデル作成完了!

Ollama統合

Ollama統合
# Modelfile作成
$ cat > Modelfile.kagetsu-optimized << EOF
FROM ./kagetsu_merged_model
SYSTEM "あなたは日本料理店「花月」の専門AIアシスタントです。"
EOF

# Ollamaモデル作成
$ ollama create kagetsu-optimized -f Modelfile.kagetsu-optimized

# 確認
$ ollama list | grep kagetsu
kagetsu-optimized:latest    22acd1c84e63    994 MB    14 minutes ago

6. 性能評価:ベースモデル vs ファインチューニング版

テスト1:営業時間の質問

ベースモデル

質問

花月の営業時間を教えてください

Qwen2.5-0.5B

AIの回答

申し訳ございませんが、「花月」という具体的な店舗についての情報は持っておりません。一般的な日本料理店の営業時間は...

ファインチューニング版

質問

花月の営業時間を教えてください

kagetsu-optimized

AIの回答

花月の営業時間は、昼の部が11:30~14:30(ラストオーダー14:00)、夜の部が17:30~22:30(ラストオーダー21:30)でございます。日曜・祝日は定休日とさせていただいております。

テスト2:おすすめ料理

ベースモデル

質問

花月のおすすめ料理は何ですか?

Qwen2.5-0.5B

AIの回答

申し訳ございません、花月という店舗の情報を持っておりません...

ファインチューニング版

質問

花月のおすすめ料理は何ですか?

kagetsu-optimized

AIの回答

花月の名物料理は「季節の会席膳」(5,800円)でございます。旬の食材を使った前菜、お造り、焼き物、煮物、ご飯物、水菓子の全7品構成です。特に、毎朝築地から仕入れる新鮮な魚介のお造りと、京都から取り寄せる季節の野菜を使った煮物が好評でございます。

定量評価結果

指標ベースモデルファインチューニング版
花月認識率0%100%
正確性-87.5% (7/8)
応答品質スコア-3.88/5
推論時間約3秒約6秒
モデルサイズ397MB994MB

7. 考察と改善点

成功要因

  1. 適切なLoRAパラメータ設定(r=16, alpha=32)
  2. 十分な学習エポック数(8エポック)
  3. 高品質な日本語データ(敬語・丁寧語統一)
  4. 全Attention層への適用

課題と改善余地

現在の課題

  • 学習時の質問と表現を変えると的外れな回答を出力することを確認
  • 25項目では網羅性が不足
  • 推論速度がやや遅い

改善案

  1. データ拡張(25→100項目)
  2. 同一内容の異なる表現を追加
  3. 量子化による軽量化(4bit/8bit)

実用性評価

💰 コスト面

  • 学習コスト: 0円(Google Colab無料枠)
  • 学習時間: 約1分
  • 運用コスト: 電気代のみ(ローカル推論)

🔒 セキュリティ面

  • プライバシー: 完全ローカル処理
  • データ主権: 社内データの外部流出なし
  • カスタマイズ: 企業固有要件に完全対応

8. 実装のポイント(つまずきやすい箇所)

1. Colab上のライブラリ互換性問題

Google ColabとローカルPC間でのPEFTライブラリバージョン不整合により、モデル読み込みエラーが発生することがある。

# 対策: バージョン統一
# Colab環境とローカル環境で同一バージョンを使用
peft==0.17.0
transformers==4.54.1
torch (適切なCUDAバージョンに対忝)

2. PEFT互換性問題

エラー例:

LoraConfig.__init__() got an unexpected keyword argument 'corda_config'

解決策:

# Colabとローカル両方で統一
peft==0.17.0

3. メモリ不足対策

# GPU OOM対策
torch.cuda.empty_cache()  # 各エポック後
batch_size = 1             # 最小化
gradient_accumulation_steps = 4  # 仮想的にバッチサイズ増

4. Ollama統合の注意点

# GGUFが無くてもHuggingFace形式で動作
FROM ./kagetsu_merged_model  # ディレクトリ指定でOK

9. まとめ

本実証により、以下を確認した:

  1. ローカルのCPUでの学習と比べて劇的な改善を確認したファインチューニングが可能
  2. 日本語特化モデルとして検証用に耐えうる品質の応答を実現
  3. 完全ローカル運用が可能でプライバシー・コスト面で優位
  4. 再現可能な手順とパラメータを明示

End to Endプロセスの実行確認を完了

  • 学習フェーズ: Google Colab(無料GPU)で効率的に実施
  • 統合・運用フェーズ: 一般的なローカルPCで完結
  • 完全なワークフロー: データ設計→モデル学習→マージ統合→性能評価→実運用まで一貫して記録

これにより、高性能な計算リソースを持たない環境でも、業務特化AIエージェントの構築が現実的であることを実証した。

10. 今後の展望

🎯 技術拡張

  • マルチドメイン対応
  • 継続学習機能
  • 多言語展開

📱 展開拡大

  • エッジデバイス展開
  • スマートフォン対応
  • IoT連携

🏢 業務応用

  • 領域特化型モデル生成
  • 医療・法務・製造業応用
  • 業務プロセスカスタマイズ

🎨 体験向上

  • 企業固有AIの実現
  • 独自知識の完全活用
  • 競合優位性の構築

付録:Google Colabノートブック

完全な実装コード

本記事で使用したGoogle Colabの完全な実装ノートブックをダウンロードできます。実際に動作確認済みのコードで、すぐに再現実験が可能です。

Google Colabノートブックをダウンロード

ファイル名:kagetsu_colab_optimized_goodResult_20250803.ipynb

ノートブックの内容:

  • 環境セットアップ(ライブラリインストール)
  • データセット準備(花月の学習データ)
  • LoRA設定とモデル準備
  • 学習ループの実装
  • モデル保存とエクスポート
  • 推論テストコード

お問い合わせ

導入にご興味をお持ちの方は、ぜひお気軽にご相談ください。貴社の要件に合わせた最適な構成のご提案から、構築、運用支援まで一貫してサポートいたします。