🌿
🌿 MidoriPhotoArt.
大規模言語モデルGemma3 その2 日本語データセットのAIプロンプト化・データ加工とLoRAファインチューニング実践
Midori 290 シリーズ

Gemma3 日本語データ加工 & LoRA ファインチューニング

midori290〜293 フォルダでは、日本語データセットを活用した Gemma3-1b-it モデルのファインチューニング手法と 推論ワークフローを段階的に整理しています。本ページでは、同梱している 2 つのノートブックを 最終成果物としてまとめ、すぐにダウンロード・参照できるよう整備しました。

最終成果物ノートブック(共通コピー)

midori290〜293 の各ディレクトリに同じ最新版ノートブックを配置しています。ここから直接ダウンロードするか、 ブラウザ上で内容を確認して Google Colab などにアップロードしてご利用ください。

  • Gemma31bit_LoRAファインチューニング PyTorch形式 .ipynb

    データ加工〜学習〜保存までを一貫して実行できるファインチューニングノートブックです。 GPU/TPU いずれのランタイムにも対応し、途中再開や量子化保存もサポートしています。

  • PyTorch形式のモデルを利用して推論.ipynb

    ファインチューニング済みモデルをロードし、日本語チャット推論を行うためのフロントエンド付きノートブックです。 モデルの検出・選択、チャット UI、推論ログなどが自動化されています。

【重要】このノートブックで作成される学習モデルは高精度なものではありません。
あくまでLoRAファインチューニング手法の学習・実験を目的としたサンプルです。
実運用や高精度なAIモデルを求める場合は、より大規模なデータ・パラメータ調整・追加検証が必要です。
【前提条件】
本ページで紹介しているノートブックおよび手順は、Google Colab(GPU環境推奨)での実行と検証を前提としています。
無料枠では GPU 利用時間・割り当てが制限されるため、長時間の学習や繰り返し実験には Colab Pro 等の利用も検討してください。
Colab 以外の環境で利用する場合は、必要なライブラリの導入や GPU 設定を各自で整えてください。

データセットと加工方法の解説

【データセット具体例】
1. 論文3行まとめデータセット
オリジナル(生データ)例:
{
  "ja_title_provisional_translate": "日本産キノコの新種発見",
  "tags": "新種, キノコ, 日本",
  "R3summary_1": "本研究では日本産の新種キノコを発見した。",
  "R3summary_2": "形態学的特徴を詳細に記載した。",
  "R3summary_3": "DNA解析により分類学的位置づけを行った。"
}
AI用プロンプト例:
<bos><start_of_turn>user
タイトル: 日本産キノコの新種発見
タグ: 新種, キノコ, 日本<end_of_turn>
<start_of_turn>model
本研究では日本産の新種キノコを発見した。
形態学的特徴を詳細に記載した。
DNA解析により分類学的位置づけを行った。<end_of_turn><eos>

2. 識別形質比較データセット
オリジナル(生データ)例:
{
  "comparison_source": "Candida tanticharoeniae",
  "comparison_target": "Candida savonica",
  "sentence": "D1/D2領域に基づく分子系統解析で近縁",
  "label": "分子系統解析/molecular_phylogenetic_analysis",
  "common_or_different": 1
}
AI用プロンプト例:
<bos><start_of_turn>user
Candida tanticharoeniaeとCandida savonicaの共通点を教えてください(カテゴリ: 分子系統解析/molecular_phylogenetic_analysis)<end_of_turn>
<start_of_turn>model
D1/D2領域に基づく分子系統解析で近縁<end_of_turn><eos>
フィールド更新に関する注意
2024年末以降、上記データセットには補助フィールド(例:metadatasource_url)が追加されています。
実際に datasets.load_dataset(...) で取得し、利用したいカラムが存在するか文字列型で取得できるかを必ず確認してから加工処理を適用してください。
【データ加工の法則(ルール)】
  • 論文3行まとめデータセット:
    タイトルとタグを「質問」とし、3行の要約(R3summary_1~3)を「回答」として組み合わせます。
    それぞれを
    <bos><start_of_turn>user ... <end_of_turn><start_of_turn>model ... <end_of_turn><eos>
    の形式でまとめます。
  • 識別形質比較データセット:
    「comparison_source」と「comparison_target」を使い、
    common_or_differentが1なら「共通点」、0なら「違い」を質問文にします。
    「sentence」を回答として、同じく
    <bos><start_of_turn>user ... <end_of_turn><start_of_turn>model ... <end_of_turn><eos>
    の形式でまとめます。
※ どちらも「誰が質問し、誰が答えるか」が明確になるように、user/modelの区切りを明示しています。

本プロジェクトでは、2種類の日本語データセットを使い、AI(大規模言語モデル)が「質問→回答」の形で学習できるようにデータを整えています。

なぜこのようなプロンプト形式に加工するのか?
  • AIは「誰が質問し、誰が答えるか」がはっきり分かるデータで学習すると、会話の流れや役割を正しく理解できるようになります。
  • 「user」「model」などの区切りを入れることで、ユーザーの質問に対してAIがどう返答すべきかを学習できます。
  • この形式は、学習時だけでなく実際の利用時にもそのまま使えるので、一貫した入出力が可能です。
  • 将来的に複数ターンの会話や、より複雑な対話にも拡張しやすいメリットがあります。

データ加工の流れ(例)

1. 論文3行まとめデータセット
ステップ内容例
元のデータ
{
  "ja_title_provisional_translate": "日本産キノコの新種発見",
  "tags": "新種, キノコ, 日本",
  "R3summary_1": "本研究では日本産の新種キノコを発見した。",
  "R3summary_2": "形態学的特徴を詳細に記載した。",
  "R3summary_3": "DNA解析により分類学的位置づけを行った。"
}
加工後(QAペア)
質問: タイトル: 日本産キノコの新種発見\nタグ: 新種, キノコ, 日本
回答: 本研究では日本産の新種キノコを発見した。\n形態学的特徴を詳細に記載した。\nDNA解析により分類学的位置づけを行った。
AI用プロンプト
<bos><start_of_turn>user
タイトル: 日本産キノコの新種発見
タグ: 新種, キノコ, 日本<end_of_turn>
<start_of_turn>model
本研究では日本産の新種キノコを発見した。
形態学的特徴を詳細に記載した。
DNA解析により分類学的位置づけを行った。<end_of_turn><eos>
2. 識別形質比較データセット
ステップ内容例
元のデータ
{
  "comparison_source": "Candida tanticharoeniae",
  "comparison_target": "Candida savonica",
  "sentence": "D1/D2領域に基づく分子系統解析で近縁",
  "label": "分子系統解析/molecular_phylogenetic_analysis",
  "common_or_different": 1
}
加工後(QAペア)
質問: Candida tanticharoeniaeとCandida savonicaの共通点を教えてください(カテゴリ: 分子系統解析/molecular_phylogenetic_analysis)
回答: D1/D2領域に基づく分子系統解析で近縁
AI用プロンプト
<bos><start_of_turn>user
Candida tanticharoeniaeとCandida savonicaの共通点を教えてください(カテゴリ: 分子系統解析/molecular_phylogenetic_analysis)<end_of_turn>
<start_of_turn>model
D1/D2領域に基づく分子系統解析で近縁<end_of_turn><eos>
この加工のメリット
  • AIが「質問→回答」のパターンを正しく学び、現実の会話に近い応答を生成できるようになります。
  • データ内容そのものには触れず、「どう整列・加工するか」に重点を置いています。

データ結合後のシャッフルとサンプリング処理について

なぜシャッフルやサンプリングを行うのか?
  • 2種類のデータセットを結合した直後に シャッフル(ランダム並び替え)を行うことで、train/test分割時に偏りなく両方のデータが混ざるようにします。
  • データ件数が非常に多い場合は、計算量削減のためにサンプリング(ランダム抽出)を行い、学習や検証を高速化します。
技術的なポイント:
  • シャッフルは all_dataset = all_dataset.shuffle(seed=SEED) のように、結合直後に実施します(SEEDで再現性も確保)。
    解説: .shuffle(seed=SEED) はデータセットの順番をランダムに並び替える処理です。
    これにより、異なるデータソースを結合した場合でも、train/test分割時に偏りなくデータが混ざるようになります。
    seed=SEED を指定することで、毎回同じシャッフル結果となり、実験の再現性も保てます。
  • サンプリングは train_dataset = train_dataset.select(range(N)) のように、指定件数だけを抽出します。
    (N=Noneなら全件、数値ならその件数だけ)
    解説: .select(range(N)) はデータセットの先頭からN件だけを選び出す処理です。
    データ件数が多すぎると学習や検証に時間がかかるため、一部だけ使って高速化したいときに便利です。
  • これにより、計算リソースを節約しつつ、データの偏りも防げます
まとめ: シャッフルで偏りを防ぎ、サンプリングで計算量を調整することで、効率的かつバランスの良いAI学習が可能になります。
【関連ノートブック】
gemma3LoRA複数データセット (2).ipynb(LoRA学習用サンプルコード)
※本ノートブックの再配布は禁止です。学習・研究目的でのみご利用ください。
📚 データセット引用・感謝・ライセンス
本プロジェクトで利用しているデータセットの引用元は以下の通りです。
利用目的: 本ページでは、これらのデータを「データの加工や扱い方の例」として利用しています。
※ データ内容そのものには触れず、データの整列方法やAI学習で利用するための加工方法に重点を置いて活用しています。

🙏 データを公開・整備してくださった Atsushi Nakajima 様に心より感謝申し上げます。
📝 ライセンス: これらのデータセットは CC-BY-4.0 ライセンスで公開されています。