Aratako's picture
Update README.md
0ab32f8 verified
metadata
license: apache-2.0
datasets:
  - Aratako/Syosetu711K-Cleaned-158K-Instruct
language:
  - ja
library_name: transformers
tags:
  - not-for-all-audiences
  - nsfw
base_model:
  - Elizezen/Antler-7B

Antler-7B-Novel-Writing

GGUF版はこちら/Click here for the GGUF version

概要

Elizezen/Antler-7Bをベースに、小説生成用のinstruction tuningを施したモデルです。

ジャンルやクオリティ、キーワードや年齢区分を指定すると、それに従った小説を生成するようにinstruction tuningしています。

プロンプトフォーマット

Mistralのchat templateを利用してください。また、学習に利用したデータのフォーマットの関係上、以下のような形式が望ましいと思われます。

[INST] {小説生成の指示}

ジャンル:{ジャンル(小説家になろう形式)}
クオリティ:{クオリティを示す数値(0から3)}
キーワード:{小説の概要を示すタグ・キーワードを読点区切りで羅列(小説家になろう形式)}
年齢区分:{年齢区分を示す数値(0:全年齢、1:R15、2:R18)} [/INST]

実例

入力

[INST] あなたのタスクは小説を書くことです。ユーザーが以下で示す設定から適切な小説を書いてください。

ジャンル:ハイファンタジー〔ファンタジー〕
クオリティ:2
キーワード:R15、残酷な描写あり、ギャグ、女主人公、魔王、魔法、主人公最強、転生
年齢区分:1 [/INST] 

出力

 私、セレスティア・ラウエントはどうにも死んでしまったらしい。それも事故的に、と言うより殺人事件の被害者として。
 幸いなことに、私自身の記憶はちゃんと持っているし前世の記憶も保有している。つまりは転生だ。
 今世では十八歳――地球の基準で言えば高校二年生になったばかりだ――の娘である。経緯は多少苦々しい思い出だけれど、母親と父親に抱き締められながら「気を付けて」と見送られ、笑顔で手を振りながら学校へ向かっていた途中だ。
 突然何者かに背後からナイフで刺されて、それが原因でお空の世界に旅立ったわけだ。
 一応前世の記憶を取り戻す前に自分が死んだ理由を確認しておくべきだろう。両親に対して申し訳ない気持ちは山ほどあるし、自分が許せない気持ちもある。
 ……まぁ、もう本当に関わる機会なんて無いだろうけれど。私の事情を知ったら両親や周囲の人達は心配してしまうし、家族同士で大変なことになるのが目に見えている。

 そんなわけで今世での私の名前は『セレスティア・ラウエント』、十八歳の高校二年生。
 神様みたいな存在――つまり神様――と出会ったのはその時だった。

「セレスティア・ラウエント」

 驚くべきことに、私は絶命寸前にも関わらず現世へと舞い戻って来た。

「よく我慢したね」

 そして優しげな声をかけてきたのが、黒いマントに身を包み頭から足先までフル装備の何者か。
 最初は死神かな? と思ったけれど、背中に背負った大剣が見るからに武器です! って感じだったし、眼光も普通に強い。さらに言えば魔法使いみたいなローブも着ている。両手にはガントレットを装着しているし、あとは……うん、勇者っぽい。
 一応人間とは思えない容姿をしている。真っ白な肌に同じ色の長い髪を後ろで結び上げ、金色の瞳でジロジロとこちらを見つめてきた。その瞬間、やけにイラっとした。
 本当に死神とかなら別に構わないけれど、もし魔王とかだった場合面倒事になりそうだし、出来れば関わりたくない。せっかく今世で出会った家族だし、少しでも長生きさせてあげたい気持ちもある。最悪の場合、私が守ってあげたい。
 まぁ、現実逃避のような考え方ではあるけれど。

「……あなたが?」

「冥界への案内人だね」

 相手が何者なのか分からな

上記の例では以下のような出力設定を行っています。

  • Temperature:0.7
  • Top-p:0.9
  • Repetition Penalty:1.1
  • Amount to Gen.: 1024

プロンプト内で指定する属性について

本モデルは学習時の指示にジャンルやキーワード、クオリティ、年齢区分などを追加して学習しているため、それらの属性を指定することである程度出力の制御が可能です。

ジャンル

なろう小説APIおよびなろうR18小説APIにおけるgenrenocgenreのジャンルで学習しています。具体的には以下のものを学習時に使っています。この形式で指定するのが望ましいかと思われます。

  • 全年齢・R15:未選択〔未選択〕、異世界〔恋愛〕、現実世界〔恋愛〕ハイファンタジー〔ファンタジー〕、ローファンタジー〔ファンタジー〕、純文学〔文芸〕、ヒューマンドラマ〔文芸〕、歴史〔文芸〕、推理〔文芸〕、ホラー〔文芸〕、アクション〔文芸〕、コメディー〔文芸〕、VRゲーム〔SF〕、宇宙〔SF〕、空想科学〔SF〕、パニック〔SF〕、童話〔その他〕、詩〔その他〕、エッセイ〔その他〕、リプレイ〔その他〕、その他〔その他〕、ノンジャンル〔ノンジャンル〕
  • R18:男性向け、女性向け、BL、大人向け ※こちらはAPIページ上での表記からやや変更して学習しています。

クオリティ

本モデルの学習に使用したデータセットの大本であるRyokoAI/Syosetu711Kのq-scoreを利用して学習時のレコードにクオリティタグをつけています。

使用したデータセットは既にq-scoreが0.8以上の高品質のものをフィルターしてありますが、さらにそれを25%ずつに分け、下から0、1、2、3とラベリングしています。3を指定するとより高品質な出力になる事が期待されます。

年齢区分

全年齢の作品には0を、R15作品には1を、R18作品には2をラベルとしてつけ学習しています。これを生成時に指定することである程度表現の制御が可能となっていると思います。 なお、年齢区分に2を指定する場合、ジャンルもそれ専用のものを指定する必要があるのでご注意ください。

学習関連の情報

使用データセット

学習の設定

RunpodでGPUサーバを借り、A6000x7で学習を行いました。主な学習パラメータは以下の通りです。

  • lora_r: 128
  • lisa_alpha: 256
  • lora_dropout: 0.05
  • lora_target_modules: ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj", "lm_head"]
  • learning_rate: 2e-5
  • num_train_epochs: 2 epochs
  • batch_size: 64
  • max_seq_length: 4096

ライセンス

apache-2.0ライセンスの元公開いたします。

ただし、元モデルであるElizezen/Antler-7Bのライセンスが不明であるため、作者様から何らかの連絡等を受けた場合変更の可能性があります。