This model continues [JFanFic]{https://huggingface.co/susurofu/JFanFic} I trained in 2024. This model was trained for the short stories generation in Japanese in a style of web fanfiction platforms. By the prompt with title, genre, and keywords this model can produce such short stories wit hvery specific "literary" quality, but still enjoyable and making you think what except for literary coherency in plots and characters makes you enjoy the text.
The major difference is that this model is fine-tuned version of qwen3-0.6b model. The previous one was fine-tuned version of Rinna's gpt-neox with 4b parameters. However, due to hardware limitations , the previous model was fine tuned with QLoRA and with 2048 context size. This model is full-finetuned without quantizing with extended 4096 context size (now, it really can cover short stories size). Also, its generations got more stable: model faces less issues with unfinilized outputs (in a number of my runs, stories finish with <|short_story_end|> token as in training corpus) and model was not found hallucinating producing raw ttraining data of the base model.
本モデルは、2024年に私が学習させたJFanFicの後継モデルです。日本語のWeb小説投稿サイトに見られるような文体で、短編小説を生成することを目的として学習させました。
タイトル、ジャンル、キーワードを含むプロンプトを与えることで、独特の「文学的」な質を持つ短編小説を生成できます。物語の展開や登場人物の描写には必ずしも文学的な一貫性があるとはいえませんが、それでもどこか楽しめる作品が生まれます。また、こうした生成作品を読むことで、物語や登場人物の整合性以外に、いったい何が私たちに文章を楽しませるのか、という問いについて考えるきっかけにもなるでしょう。
従来モデルとの最大の違いは、本モデルがQwen3-0.6Bをファインチューニングしたモデルである点です。以前のモデルは、約40億(4B)パラメータを持つrinnaのGPT-NeoXをベースとしていました。しかし、当時のハードウェア上の制約により、QLoRAを用いたファインチューニングを行い、コンテキスト長も2,048トークンに制限されていました。
一方、本モデルでは、量子化を行わずに全パラメータをファインチューニング(Full Fine-Tuning)し、コンテキスト長も4,096トークンに拡張しました。これにより、実際の短編小説の長さをより十分に扱えるようになっています。
さらに、生成結果の安定性も向上しました。特に、物語が適切に終了しない問題が減少しており、複数回の生成実験では、学習コーパスで使用した<|short_story_end|>トークンによって物語が正常に終了することを確認しています。また、ベースモデルの事前学習データに由来する文章をそのまま生成してしまう現象も、今回の実験では確認されませんでした。
Here, you can find sample running code:
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
MODEL_ID = "susurofu/qwen3-0.6b-mini-fanfic-ja"
if torch.cuda.is_available():
device = "cuda"
elif torch.backends.mps.is_available():
device = "mps"
else:
device = "cpu"
dtype = torch.float32 if device == "cpu" else torch.float16
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
dtype=dtype,
attn_implementation="eager"
).to(device)
model.eval()
prompt = (
"<|type|> short story "
"<|title|> 異世界で目覚めた青年の冒険 "
"<|genre|> 異世界[恋愛] "
"<|keywords|> 異世界 恋愛 魔法 王国 冒険 "
"<|short_story_start|>"
)
# but you can even use prompt in other format, the model still works rather stable
# prompt = "冬の夜、私は誰もいない駅に立っていた。"
inputs = tokenizer(
prompt,
return_tensors="pt",
add_special_tokens=False
).to(device)
with torch.inference_mode():
outputs = model.generate(
**inputs,
max_new_tokens=2000, # set up to 4096
do_sample=True,
temperature=0.9, # other values can be reasonbale, experiment
top_p=0.9,
top_k=50,
repetition_penalty=1.1,
use_cache=True,
pad_token_id=tokenizer.pad_token_id
if tokenizer.pad_token_id is not None
else tokenizer.eos_token_id,
eos_token_id=tokenizer.eos_token_id,
)
generated_tokens = outputs[0][inputs["input_ids"].shape[1]:]
story = tokenizer.decode(
generated_tokens,
skip_special_tokens=False
)
print(story)
Here is the story which was generated with the sample prompt:
異世界への旅立ちの時を想定して書いてみました。
あっという間にお楽しみください!
「お帰り、サラム」
王城に訪れた彼は、その美しい笑顔とともに声を掛けてきた。
いつもは厳格な王様が、今はどこか柔らかな表情をしていることに気がついた。この光景を見ると自然と身震いしてしまう。
「また遅くなってしまったようですね……」
私は小さくため息を吐きながら返事をした。この場所では時間の感覚なんてほとんどない。
「そうだったか。今日は何か特別なものでも見たいものがあったのか?」
彼の言葉通り、王様は少し困ったような面持ちをしてこちらを見る。しかし、私の視線を感じた彼はそんなことを気にしているわけじゃないらしい。
「実は最近目の前にある宝物を見つけられました!」
突然大きな声を出して彼から距離を取りながら、私は急いで話すように言った。
「ほう? それは素晴らしいことだねえ…じゃあ一緒に見て回ろうよ。そしたら私が指し示してくれるけどさ」
そう言って彼は何故か私より背が高い位置まで来たのであった。まるで魔法を使って体長をつけているみたいでとても不気味である。
「本当にどうしようもなく好きになったんですって! あの時の王子様が可愛いんですよー!!」
今度は自分の前であまり興奮していない姿勢を保ちつつも叫んでしまっていた。
何人や数々の男たちの中で一番好みのお守りを受け取ってくれるのもいいものの、やはり美人といえば美人だが美女だと判断されてしまうほどではないかと思う。
「まさか俺が可愛すぎるとは思わないだろうなぁ」
王様があんなところで口を開こうともしないため、そのまま私も相槌を打ちつつ微笑む事しかできない。
「これならもっと手が出せますよね~。これはとっても美味しそうですぅ」
こんな感じで話を進めるうちにどんどん二人元へ向いていく道筋になるのがわかった。
しばらくすると王宮側に入った先には珍しい宝石のようなものが飾られた石壁がありそれを眺めていることが多かった。
「あれぇ〜? 僕の家の石造りの家があるんだぁ?」
「そうですね! 確かそれっぽい形だけどここにあるのはあまり見た事がなかったですよ」
それにしても一瞬だけ記憶が曖昧になってしまいそうな程鮮明に印象に残っているようで奇妙であった。ただ一つ気になることは、ここで出会えたということなのである。
「確かに僕が好きな色ですよね! よかったですね♪」
真紅のように輝ける瞳を持つ女性になぜか我に帰ってしまう自分がいるが、それでも無情にも今日出会ってきたのだと思い知ることとなる。
───『美』の一覧(例)・『貴族』等など···
◇ ◇ ◇
「ふふっ! 素敵なお礼をするのはなかなか面白いものだと思います」
「そう言えば彼女の方はどうでしたでしょうかねぇ?」
なんとなく足音が遠ざかる一方となったのに気づいたらしく呆然としたままに後ずさることが多い。
―――「まぁ何もありませんよー。良かったらこれから遊ぼうかと思っていましたから・・・」
振り向けばそこにはもう二歳くらいの少女が立っていて心臓を跳ね上がらせてしまったのである。
◆ ◆ ◆
※ここからはフィクションであり実在する人物・団体について一切関係はありません。
もし参考になったという方がいらっしゃったら幸いです。<|short_story_end|>
<|short_story_end|><|endoftext|>
License
Use this model as you find suitable under Apache 2.0 license and with respect to the original lisense of qwen3-0.6b model.