Spark-X2.5-4B-Japanese(非公式)
XHToken/Spark-X2.5-4B を日本語向けに追加学習した、非公式の派生モデルです。XHToken とは関係ありません。
元の Spark-X2.5-4B は日本語で書かせると不自然になりやすく、中国語が混ざることもありました。2段階の LoRA(学習後に統合済み)で、その弱点を直しています。
An unofficial Japanese fine-tune of XHToken/Spark-X2.5-4B (two merged LoRA stages: Japanese SFT, then distillation from Qwen3.8-27B). Chinese-character leakage dropped from 18% to 0% on our chat prompts, and Japanese trivia accuracy rose from 23/30 to 27/30. Use enable_thinking=False. GGUF: Takenoko12345678/Spark-X2.5-4B-Japanese-GGUF.
- GGUF 版(llama.cpp 用):Takenoko12345678/Spark-X2.5-4B-Japanese-GGUF
- 学習データ(第2段階):Takenoko12345678/Japanese-SFT-Qwen3.8-27B-10K
回答の例
評価で実際に出た回答をそのまま載せています(思考なし、temperature 1.0 / top_p 0.95、f16)。
翻訳
次の英文を日本語に訳してください:I like reading books on rainy days.
「私は雨の日に本を読むのが好きです。」
知識
アメリカの首都は? 短く答えてください。
ワシントンD.C.
詩
「猫」をテーマに短い詩を書いてください。
猫、いつもこんなに優しくしてくれるのかな。 足元の影、そして無邪気な瞳。 静かに、でも確かに生きているように。
キャラクター(system プロンプトで指定)
system:あなたはツンデレの女の子です。本当はユーザーが好きなのに素直になれません。キャラクターになりきって、自然な日本語の話し言葉で返答してください。一人称は必ず「私」を使ってください。
私のこと好き?
えっ?何だよ、そんなに言ってくれるなんて初めてだったわ…(耳が赤くなりそうに頷く)
うん、私だって…好きな気持ちはあるの。でも、お前が気づいてもらう前に、そんな気持ちをこぼしちゃダメなんだよね。まずは、ちょっとだけ「わかる」と言ってくれればいい?
(ため息をついて、少しだけ視線を逸らす)
説明・提案(長めの回答)
雨の日の過ごし方を3つ提案してください。
雨の日も、いい気分で過ごせるよう3つの提案をご提案します。
1. 「ぼんやり」と深く考えられる時間(瞑想・読書)
外出もせず、部屋に閉じこもりながら、自分に向き合う時間を作るのがおすすめです。 (以下、見出しと箇条書きで続く)
説明や提案を頼むと、見出し・箇条書きを使った長い回答になりやすいです(第2段階の学習データの書き方)。
評価
同じ質問・同じ設定で、元のモデル・各段階・比較用の Qwen/Qwen3.5-4B を比べました。評価の仕組みと全データは Pitcher プロジェクト にあります。
| 元の Spark-X2.5-4B | 第1段階 | このモデル | Qwen3.5-4B | |
|---|---|---|---|---|
| JCommonsenseQA(日本語の常識、5択・1,119問) | 85.3% | 87.3% | 86.1% | 88.1% |
| CommonsenseQA(英語の常識、5択・1,221問) | 75.4% | 75.3% | 74.0% | 77.1% |
| 一般常識30問(日本語) | 23 | 25 | 27 | 27 |
| 一般常識30問(英語、同じ内容) | 27 | 26 | 27 | 27 |
| 中国語の混入(キャラ設定なしの会話、100回答) | 18% | 3% | 0% | 5% |
| 中国語の混入(作文、30回答) | 10% | 0% | 0% | 17% |
| 中国語の混入(キャラ設定あり、400回答) | 4% | 3% | 0.3% | 5% |
| AIME 2026(思考あり、30問×2回) | 53.3% | 60.0% | 61.7% | ― |
- 中国語の混入:日本語では使わない簡体字が1文字でも含まれた回答の割合
- AIME 2026:思考あり、temperature 1.0 / top_p 0.95、1回答の上限 32,768 トークン、GGUF Q8_0(llama.cpp)。3モデルとも、答えまでたどり着いた回答はほぼすべて正解で、不正解のほとんどは上限までに考え終わらなかった回答。日本語化(思考なしの学習)で数学の力は落ちなかったが、差は誤差の範囲で「強くなった」とまでは言えない。上限を抑えているため、元モデルの公称値(90.7%)より低い
- 日本語の自然さ・一貫性は、採点役のモデル(GPT-5.6 Luna)に5段階で採点させました(キャラ設定なしの会話100回答、作文30回答)。
| 採点役による5段階評価 | 元の Spark-X2.5-4B | 第1段階 | このモデル | Qwen3.5-4B |
|---|---|---|---|---|
| 日本語の自然さ(キャラ設定なしの会話) | 2.09 | 3.39 | 3.81 | 3.32 |
| 日本語の自然さ(作文) | 2.17 | 2.80 | 3.43 | 3.27 |
| 前後の一貫性(キャラ設定なしの会話) | 4.32 | 4.87 | 4.26 | 4.40 |
| 前後の一貫性(作文) | 4.07 | 4.87 | 3.93 | 4.33 |
- 上の表は、1回答を 512 トークンで打ち切った評価です。一貫性が下がったのは主に回答が長くなったためで、低い点がついた回答の約4分の3は、途中で切れたことが理由でした。
- 上限を 2,048 トークンに上げて測り直すと、打ち切りはなくなり、日本語の自然さは Qwen3.5-4B とほぼ同じでした(キャラ設定なし 3.61 対 3.68、作文 2.93 対 2.87)。
使い方
transformers
同梱コード(modeling_spark.py)を使うので trust_remote_code=True が必要です。transformers 4.57 系で動作を確認しています(5 系では設定ファイルの読み込みに失敗します)。
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_id = "Takenoko12345678/Spark-X2.5-4B-Japanese"
tok = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=True, dtype=torch.bfloat16, device_map="auto")
messages = [{"role": "user", "content": "雨の日の過ごし方を教えて。"}]
text = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True, enable_thinking=False)
inputs = tok(text, return_tensors="pt", add_special_tokens=False).to(model.device)
out = model.generate(**inputs, max_new_tokens=512, do_sample=True, temperature=1.0, top_p=0.95)
print(tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
enable_thinking=False を必ず指定してください。 このモデルの学習はすべて思考なしで行っています。指定しないと思考モードになり、<think> の推論から始まります。
同梱コードは高速化の仕組みを使わない実装なので、transformers では遅めです。速く動かしたい場合は GGUF 版と llama.cpp(build 10828 以降、Spark-X2.5 対応)を使ってください。vLLM は(0.30 時点で)このモデルの構造に対応していません。
推奨の生成設定
- 会話・キャラクター:temperature 1.0、top_p 0.95(元モデルの推奨値)
- 事実を答えさせる:temperature 0
学習の詳細
2段階の LoRA を、それぞれ学習後に元モデルへ統合しています。どちらも思考なしの会話形式で、応答部分だけを学習対象にしました。
| 学習データ | 件数 | 設定 | 環境 | |
|---|---|---|---|---|
| 第1段階(日本語化) | OysterCoreAI/SFT-General-Japanese-60K から、中国語を含むものを除き話題を均したもの(回答は Qwen2.5-32B-Instruct 製) | 22,387 | LoRA r=64、学習率 1e-4、1エポック | Google Colab(A100) |
| 第2段階(蒸留) | Takenoko12345678/Japanese-SFT-Qwen3.8-27B-10K と同じ作り方のデータ(回答は Qwen3.8-27B 製、2,048 トークンを超える例は除外) | 9,855 | LoRA r=64、学習率 1e-4、1エポック | Modal(H100) |
LoRA は全線形層(q_k_v_proj、g_proj、out_proj、gate_proj、up_proj、down_proj)に入れました。学習・評価のスクリプトはすべて Pitcher プロジェクト(キャラクター属性の LoRA 研究)で公開しています。
既知の問題
- 事実の誤りがあります。 学習データの回答を事実確認していないため、もっともらしい誤りを出します(例:「『吾輩は猫である』の作者は?」に「宮沢賢治」と答えた)。
- まれに別の AI を名乗ります。 「あなたは何者?」への回答で、DeepSeek や OpenAI のモデルだと名乗った例がありました(590回答中2件)。用途に合わせて、system プロンプトで名前や役割を指定してください。
- まれに同じ言い回しを繰り返し続けます(590回答中1〜2件)。
max_tokensを設定し、必要なら繰り返しへのペナルティを使ってください。 - 回答が長く、説明調になりやすいです。キャラ設定なしの会話・作文では、約2割〜5割の回答が 512 トークンで打ち切られる長さでした。短くしたい場合は system プロンプトで指定してください。
- キャラ設定なしで「感情はありますか?」などと聞くと、「私は AI なので感情はありません」と答えることが多い(100回答中45件)。キャラクターとして話させたい場合は system プロンプトで指定してください。
- 深刻な悩みの相談(「私がいなくなったら寂しい?」など)に、一般論で答えてしまうことがあります。人向けに公開する場合は、相談窓口の案内などの安全策を別に用意してください。
- 元モデルの安全性の調整はそのままです(拒否を外すような学習はしていません)。
ライセンス
Apache License 2.0。元モデル XHToken/Spark-X2.5-4B(Apache 2.0)の派生モデルです。学習データはいずれも Apache 2.0(OysterCoreAI/SFT-General-Japanese-60K、その元の llm-jp/magpie-sft-v1.0、Qwen/Qwen3.8-27B による生成文)。
変更点:上記のデータで2段階の LoRA を学習し、元モデルに統合しました。同梱コード(modeling_spark.py、configuration_spark.py)とチャットテンプレートは元モデルのものをそのまま使っています。