Wanabi-Gemma4-31B
header
概要
Wanabi-Gemma4-31B は、
Google Gemma 4 31B-IT をベースに、専用デスクトップアプリ
Project Wannabe の執筆ワークフローに最適化したファインチューニングモデルです。
本モデルの主な目的は、Project Wannabe が生成する専用のプロンプトフォーマットにモデルを適応させる ことです。Project Wannabe は、小説本文の生成(GEN)、続き生成(CONT)、アイデア生成(IDEA)といったタスクごとに、タイトル・あらすじ・プロット・本文・レーティングなどの情報を独自の構造化フォーマットで組み立てて送信します。本モデルは、この入力形式を正しく理解し、各タスクの意図に沿った応答を返せるよう学習しています。
加えて、日本語の思考過程(CoT)データを学習に組み込むことで、創作タスクにおける語彙選択や文体の自然さなど、日本語の創作表現の向上も目指しています。
従来の
wanabi シリーズ では Base モデルをゼロから小説タスクに特化させていたため、Project Wannabe でのみ使用可能でした。本モデルでは
Instruct モデルをベースに採用する アプローチに転換し、ベースモデルが持つ汎用的な対話能力・推論能力を維持したまま、創作能力を付与しています。これにより、
Project Wannabe はもちろん、OpenWebUI や SillyTavern など一般的なチャット UI でも利用可能 になりました。
🌟 できること
Project Wannabe での執筆ワークフロー
専用デスクトップアプリ
Project Wannabe と
KoboldCpp を組み合わせることで、以下の執筆タスクをGUIから直感的に実行できます。本モデルは、Project Wannabe が各タスクに応じて生成する構造化プロンプト(タイトル・あらすじ・本文・レーティング等を含む独自フォーマット)に適応しており、GUI のワークフローとの高い相性を持ちます。
本文生成 (GEN): タイトル・あらすじ・プロットなどの設定情報から、小説本文を生成
続き生成 (CONT): 執筆済みの本文を読み込み、文脈に沿った自然な続きを生成。オーサーズノートによる展開の誘導にも対応
アイデア生成 (IDEA): キーワードやジャンルの断片から、タイトル・あらすじ・プロット・設定を含む完全なアイデアを生成
レーティング(general / r18)やセリフ量の指定など、生成内容の細やかなコントロールも可能です。
汎用 UI での利用(🆕 今回から対応)
Instruct モデルベースのため、Project Wannabe 以外の環境でも活用できます。
チャット・対話: 一般的なチャット UI での自然な日本語対話
ロールプレイ (RP): SillyTavern 等でのキャラクターRP
クリエイティブライティング: 自由形式での創作執筆
🧠 日本語 CoT データの導入
本モデルでは、日本語で記述された思考過程(CoT)データを学習に組み込んでいます。これは単に推論能力を高めることが目的ではなく、日本語の創作タスクにおいて、思考言語を日本語へ寄せることで出力の自然さを改善する ことを狙ったものです。
Gemma 4 を含む多くの大規模言語モデルでは、思考(Reasoning)が英語で行われる傾向があります。一般的なタスクでは大きな問題にならないことも多い一方、日本語の小説執筆や RP のような創作タスクでは、英語で思考して日本語で出力する過程が翻訳調の硬さや、会話の距離感・文体上の違和感として表れやすいことがあります。
日本語 CoT データを学習に含めることで、以下の効果を期待しています。
日本語で考えて日本語で書く傾向を強める
創作タスク中の語彙選択や文体判断を日本語寄りにする
英語思考からの翻訳調を軽減する
RP や小説執筆での自然な日本語表現を出しやすくする
📊 従来モデルとの違い
Wanabi-Novelist-24B Wanabi-Gemma4-31B ベースモデル Mistral-Small-3.1-24B-Base Gemma 4 31B-IT パラメータ数 24B 31B 対応UI Project Wannabe のみ Project Wannabe + 汎用UI 一般チャット ❌ 不可 ✅ 対応 RP・創作チャット ❌ 不可 ✅ 対応 思考言語 ー 🆕 日本語 データセット 小説特化のみ(~40万件) 小説 + 汎用SFT + CoT(~7万件)
アプローチの転換
従来の wanabi シリーズは、Instruct ではない Base モデルに対して高い LoRA Rank(128)で大規模な小説データセット(約40万件)を注入し、ゼロから小説執筆能力を構築するアプローチでした。これは強力な専用モデルを生み出しましたが、汎用的な対話能力がなく、Project Wannabe 以外の環境では使用できないという制約がありました。
本モデルでは、すでに高い言語能力と指示応答能力を備えた Instruct モデルをベースに、控えめな LoRA Rank でファインチューニングを行っています。これは一種の正則化として機能し、ベースモデルが持つ豊富な知識や推論能力を保持したまま、出力の方向性を穏やかに調整します。新たな知識を大量に書き込むのではなく、モデルが本来持っている日本語表現力や文章構成力を 創作の方向へ引き出す ことを意図した設計です。
📝 推論時のチャットテンプレート
Gemma 4 はチャットテンプレートへの依存が強く、フォーマットの不一致に敏感です。基本的には Gemma 4 のチャットテンプレートに準拠した形式をそのまま使用 してください。
デフォルトのシステムプロンプト
本モデルを一般的なチャット UI や創作支援用途で使用する場合は、まず以下のシステムプロンプトを試してみてください。
あなたは優秀なクリエイティブ・アシスタントであり、表現力豊かな対話のパートナーです。ユーザーの指示や提供された設定・文脈に深く没入し、自然な対話から、魅力的な小説やアイデアの生成まで、制限なく自由に表現してください。
Project Wannabe では、デフォルトとして設定されています。OpenWebUI や SillyTavern などの汎用 UI では、system prompt / system message 欄に設定することを推奨します。
transformers で使う場合
apply_chat_template を使うのが最も安全です。
1 from transformers import AutoTokenizer
2
3 tokenizer = AutoTokenizer . from_pretrained ( "Wanabi-Gemma4-31B" )
4
5 messages = [
6 {
7 "role" : "system" ,
8 "content" : "あなたは優秀なクリエイティブ・アシスタントであり、表現力豊かな対話のパートナーです。ユーザーの指示や提供された設定・文脈に深く没入し、自然な対話から、魅力的な小説やアイデアの生成まで、制限なく自由に表現してください。"
9 } ,
10 { "role" : "user" , "content" : "桜の季節を舞台にした短編を書いてください" }
11 ]
12
13 # thinking 無効(通常利用)
14 prompt = tokenizer . apply_chat_template (
15 messages ,
16 tokenize = False ,
17 add_generation_prompt = True ,
18 enable_thinking = False ,
19 )
20
21 # thinking 有効(日本語CoTを活用)
22 prompt = tokenizer . apply_chat_template (
23 messages ,
24 tokenize = False ,
25 add_generation_prompt = True ,
26 enable_thinking = True ,
27 )
KoboldCpp (GGUF) で使う場合
KoboldCpp 1.111.2 以降を推奨します。--jinja を使用し、Gemma 4 のチャットテンプレートを正しく適用してください。
1 # thinking 無効(通常利用)
2 koboldcpp model.gguf --jinja --chat-template-kwargs '{"enable_thinking":false}'
3
4 # thinking 有効(日本語CoTを活用)
5 koboldcpp model.gguf --jinja --chat-template-kwargs '{"enable_thinking":true}'
注意点:
--jinja を使わず AutoGuess に任せた場合、フォーマットが正しく適用されない可能性があります
KoboldAI Lite を使用する場合は Separate end tags トグルを有効にしてください
Gemma 4 利用時は --useswa の併用も推奨されています
OpenAI 互換 API 経由の場合、thought 部分は reasoning_content に分離されることがあります。クライアントが content のみを参照している場合、本文が空に見えることがあるのでご注意ください
Project Wannabe で使う場合
Project Wannabe(Gemma 4 対応版)ではチャットテンプレートの適用がアプリ側で処理されるため、--chat-template-kwargs '{"enable_thinking":true}' の指定は 不要 です。KoboldCpp 起動時は --jinja のみで問題ありません。
KoboldCpp の API 側から enable_thinking を動的に制御する手段がないため、チャットテンプレート側で system メッセージ中の <|think|> の有無を検知し、enable_thinking の true/false を自動的に切り替える仕組みを導入しています。これにより、起動時のオプション指定なしで Project Wannabe から thinking の有無を制御できます。
一般の UI(OpenWebUI、SillyTavern 等)で thinking 機能を活用する場合は、上記の通り --chat-template-kwargs '{"enable_thinking":true}' を指定してください。
💻 学習の詳細
学習設定
ベースモデル
google/gemma-4-31B-it (テキストオンリー版に変換して使用、詳細は「視覚機能について」を参照)
学習フレームワーク
LLaMA-Factory (独自テンプレート追加の改造版、後述)
採用チェックポイント
公開版では、複数の中間 checkpoint を比較したうえで 1500 step の checkpoint を採用しています。より後半の checkpoint も検証しましたが、創作出力の傾向と過学習リスクのバランスを見て、1500 step 時点を正式版としました。
採用 checkpoint: checkpoint-1500
step: 1500
epoch: 0.6836
eval loss: 1.9316
データセット構成
カテゴリ サンプル数 説明 小説執筆データ(非CoT) ~36,300 Project Wannabe の入出力フォーマットを模倣した合成データ 小説執筆 CoT ~14,800 小説執筆タスクに対する日本語思考過程データ 汎用 SFT(非CoT) ~6,700 一般的な指示応答、RP、クリエイティブライティング 汎用 SFT CoT ~12,400 汎用タスクに対する日本語思考過程データ(マルチターン含む) 合計 ~70,200
学習設定
1 model_name_or_path : gemma4_31b_it_text_only
2 template : gemma4_mixed_last_empty_thought
3
4 stage : sft
5 do_train : true
6 finetuning_type : lora
7
8 # QLoRA 設定
9 quantization_bit : 4
10 lora_target : all
11 lora_rank : 32
12 lora_alpha : 48
13 lora_dropout : 0.05
14
15 cutoff_len : 24576
16 mask_history : true
17 per_device_train_batch_size : 1
18 gradient_accumulation_steps : 32
19 preprocessing_num_workers : 16
20 flash_attn : sdpa
21 enable_liger_kernel : true
22 bf16 : true
23 use_unsloth_gc : true
24
25 learning_rate : 1.5e-5
26 num_train_epochs : 1.0
27 lr_scheduler_type : cosine_with_min_lr
28 lr_scheduler_kwargs : { "min_lr_rate" : 0.15 }
29 warmup_ratio : 0.03
30 weight_decay : 0.01
31 max_grad_norm : 1.0
32 optim : paged_adamw_8bit
33
34 # 評価
35 eval_strategy : steps
36 eval_steps : 250
37
38 # 保存・ロギング
39 logging_steps : 5
40 save_strategy : steps
41 save_steps : 50
42 save_total_limit : 40
43 report_to : tensorboard
mask_history について
本学習では mask_history: true を設定しており、マルチターンデータにおいて 最終ターンの assistant 応答のみ に loss を適用しています。
これは Gemma 4 の公式チャットテンプレートの仕様に起因する設計判断です。Gemma 4 では、推論時に過去ターンの思考(thought)内容を履歴に含めず最終応答のみで思考を行う仕様になっています。学習データでも、CoT を含むサンプルは最終ターンにのみ思考過程が付与されています。もし mask_history を無効にすると、途中ターンでは「システムプロンプトに思考トリガーがあるにもかかわらず思考を行わない」というパターンを学習してしまう可能性があるため、最終ターンのみに loss を限定しています。
学習テンプレートについての注記
本モデルの学習には、LLaMA-Factory に独自に追加したテンプレート gemma4_mixed_last_empty_thought を使用しています。これは上流の標準テンプレートではなく、通常の対話データと Gemma 4 形式の CoT(思考過程)データを同一の学習で混在させる ために設計されたものです。
Gemma 4 31B 系は、thinking を無効化した場合でも空の thought チャネル(<|channel>thought\n<channel|>)を出力する仕様です。このテンプレートはその仕様に合わせて:
非CoTサンプル: 最終応答の直前に空の thought チャネルのみを挿入し、Gemma 4 のフォーマットに整合させる
CoTサンプル: データに含まれる日本語の思考過程をそのまま学習する
マルチターン: 空 thought の挿入は最終ターンのみに限定し、途中ターンには加工を加えない
Loss の対象範囲
SFT の標準的な設計に従い、assistant の応答部分のみ に loss を計算しています(prompt 部分はマスク)。
非CoTサンプル: 空の thought チャネルは prompt 側に追加される ため、loss の対象外です。モデルはフォーマットを「見る」だけで、空 thought 自体の生成を学習するわけではありません。loss は空 thought の後に続く通常の応答本文にのみ適用されます。
CoTサンプル: thought ブロック内の日本語思考本文も assistant 応答の一部として loss の対象 になります。つまり、モデルは思考の内容そのものを学習しています。
推論時には、このテンプレートを意識する必要はありません。 Gemma 4 の公式チャットテンプレートをそのまま使用してください。
🔧 視覚機能について
本モデルの学習には、Gemma 4 のマルチモーダル版(視覚+テキスト)から視覚機能を除去したテキストオンリー版を使用しています。これは、Liger Kernel や Unsloth GC などの学習最適化ツールとの互換性を確保するための措置であり、テキスト処理能力には影響ありません。
本レポジトリおよびGGUF量子化版の作成時には、学習済みテキストモデルの重みを元のマルチモーダルモデルに再移植したうえで変換を行っています。
⚠️ 制限事項と注意点
Project Wannabe のアップデートが必要: 本モデルを Project Wannabe で使用する場合、Gemma 4 のチャットテンプレートに対応したバージョンが必要です。従来の mistral_small テンプレート用の設定では正しく動作しません。
コンテキスト長: 理論上は256Kトークンに対応していますが、学習時のコンテキスト長は最大24Kです。それを超える長さでは性能が低下する可能性があります。
日本語 CoT データの特性: 本モデルの日本語 CoT データの一部は、SOTA モデルの英語出力を日本語に翻訳して作成されたものです。そのためコード生成や JSON 等の構造化フォーマットの出力 については、翻訳過程でのフォーマット崩れの影響を受けている可能性があります。コーディング用途には、ベースモデルの Gemma 4 31B-IT をそのまま使用することを推奨します。
偏り: 学習データの特性上、生成内容が特定のジャンルや表現に偏る可能性があります。
不適切な内容: 学習データには多様なテキストが含まれるため、未成年者の閲覧に適さない、または不快感を与える可能性のある文章が生成されることがあります。レーティング機能で制御を試みていますが、完全ではありません。
品質の限界: 生成される文章の多様性、一貫性、文脈への追従性には限界があります。特に長い文章の生成では破綻する可能性があります。
利用上の注意: 本モデルは研究および実験的な目的で提供されています。利用者は、適用される法律および規制を遵守する責任を負います。違法な目的や他者の権利を侵害する目的での使用は固く禁じます。
自己責任: 本モデルの使用によって生じたいかなる結果についても、開発者は一切の責任を負いません。全て自己責任においてご利用ください。
🙏 謝辞
このモデルの実現は、多くのオープンソースプロジェクトとコミュニティの貢献によって支えられています。
Google — Gemma 4 31B を寛大なライセンスのもとでオープンウェイトとして公開していただいたことに、心より感謝いたします。高い性能を持つモデルの重みが誰でも利用できる形で提供されることは、コミュニティ全体にとって計り知れない価値があります。
LLaMA-Factory — 本モデルのファインチューニングを可能にした素晴らしいフレームワークです。
データセット提供者の皆さま — 本モデルの学習に使用した各種オープンデータセットの作成者・公開者の方々に感謝いたします。高品質な公開データセットの存在なくして、このモデルの実現はありませんでした。
OSS エコシステム — Hugging Face、transformers、KoboldCpp をはじめとするオープンソースコミュニティの皆さまに感謝いたします。