
AIによるBL小説4 データセット
AIにBL小説を書いて貰おうと試行錯誤した記録です。
BLとはBoy's Love、男性同士の恋愛を描いた作品のことです。
BLを好む女性のことを腐女子と呼んだりします。
前回はこちら
第1回はこちら
学習素材について考える
AIの進化速度が速すぎて、記事を書ききる前に内容が陳腐化してしまうの、なんとかならないですかね?
(OpenAI Dev Dayを見ながら)
さて、第2回で生の文章(Raw text)を学習させたLoRAを作成しました。
しかし文体は学習できても、BLがどういうものかはあまり理解できてなさそうで。
概念を学習させるには、データセットを用いたトレーニングの方が良さそうです。
RAGとかもあるんでしょうけど、そちらはひとまず置いておきます。
が、ですよ。
当然ながら日本語BL小説用のデータセットなぞ、この世に存在する訳もなく、例のごとく手作りです。
供給のお淑やかなジャンルの民はいつもそう! 無いものは自家生産!
※元ネタはこちら
20年以上オンリーワン沼にいた友に推しのぬいぐるみをプレゼントできた話(1/3) pic.twitter.com/N7hvOBIOsS
— AK壱乃 毎週金曜漫画更新 (@ichi_no_kuchi) October 6, 2023
データセット作り
小説
さてまずはBL小説を用意します。
第2回にも出てきた自著のBL本です。
これの第1章、2万7000字。
ムーンライトノベルズだとこちら。
https://novel18.syosetu.com/n1285bt/
データセットの項目
こちらを参考にデータセットを作っていきます。


indexとcategory
indexは単純に連番。
categoryはとりあえず「closed_qa」としておきます。
ChatGPTくんに聞いたら、詩を書くための「poet」みたいな指定もあるようなので、本当は「novel」とかにしたかったのですが、ELYZAが認識してくれるかどうか分からなかったので、ひとまず実績のある無難な値にしておきます。
output
AI回答の模範となる部分です。
テキストエディタで、本文を適当に区切っていきます。
ダブルクォーテーションで囲って、それぞれ改行。
だいたい3~15行くらいずつに分けていきます。

これで134データに分かれました。
この段階でExcelに貼り付け。

input
文脈に当たる部分なので、前後をつなぎ合わせていきます。
前データのoutput + 今データのoutput + 次データのoutput とし、3データ分のoutputを合体させたものにします。

instruction
プロンプトに該当する部分ですね。
一律で以下のように指定します。
小説のワンシーンを書いてください。シーンは「XXXXX」です。

で、問題なのがXXXXXの所です。
ここは、outputの内容を端的に表したものにすればいい気がします。
つまり要約です。
要約ならChatGPTくんにお願いできるじゃん! と意気揚々と頼んだのですが、エロ規定に引っかかって拒否されました。

まだ指しか舐めてないのに!
厳しすぎるよ!!
BingのChatGPTくんは潔癖すぎる!!
しょうがないので自分で要約していきます。
超メンドクサイ(≧ヘ≦)
あ、「壁ドン」だとか「キスシーン」だとかいうタグ付け的な情報も、この項目に書いておきます。
jsonに変換
全データの要約ができたら、以下のサイトでjson形式に変換。
変換結果をテキストエディタに張り付けて、jsonファイルを作成。
text-generation-webui\training\datasets に放り込みます。
要約用データセット
これ、outputとinstructionを逆にしたら、要約用のデータセットが作れそう。
そっちで学習したLoRAも作ってみて、うまく行きそうなら第2章以降の要約を任せたいところです。
そしたらエロシーンの要約もできるじゃん!
可能な限り楽をしたい!
これについては、また別途考えてみます。
AIに書かせる
なんだかちょっと学習素材が足らない気もするので、AIノベリストくんとかに、いい感じの学習素材を作って貰うのもアリかなぁと思ったり。
これもやるとしたら次回以降かなー。
Training
ともかくBLデータセットらしきものが出来たので、早速Trainingしていきます!
モデルはElyzaを8bitでロード。
NameにLoRA名、DataSetに作ったjsonを指定。
設定はこんな感じ。

実行すると以下のようなエラー。
RuntimeError: Data-point has no keyset match within format "['instruction,output', 'instruction,input,output']"
最初はFormatに「alpaca-format.json」を指定していたのですが、キーが合わないと。
えー? indexとcategory要らないのー?
データセットのjsonを直すのも癪だったので、「alpaca-format.json」をコピーして編集。黄色の「,index,category」部分を追加。

これで無事動きました。
学習時間は20分くらい。アレ? 思ったより早いぞ???
他設定だと2~4時間にもなったりしました。
違いが良くわからない……。
LR Schedulerをlinearからcosine_with_restartsとかにしてみましたが、なんだか過学習になる気がする?
あと、高ランクで作ったLoRAの文章はループしまくりです。
プロット「見つめあう、手をつなぐ」
シロはクロの腕にしがみつくようにして、顔を寄せた。クロは笑みを深くして、シロの頭を撫でた。
「ねぇ、シロ。お前は俺の奴隷だ。奴隷は俺の所有物だ。俺の指示に従って、俺の為に動くのが義務だ。それが奴隷の務めだ。お前は俺の奴隷だ。俺の奴隷だ。俺の奴隷だ。俺の奴隷だ。俺の奴隷だ。
ヤンデレが過ぎる……!!
闇落ちELYZA (≧~≦)
というか学習素材にそんなハードな内容は含まれてないよ!?
ループ対策
しょうがないのでループ対策を行います。
でもなんだか回答がアホになる気がするので、なるべく低設定を攻めていきます。
repetition_penalty
→ ~1.06くらいまでが限界かな。
高くなるとやはり支離滅裂に。
repetition_penalty_range
→ あまり高いと激重になるので、256くらいにしてます。
Other parameters の no_repeat_ngram_size
→ 支離滅裂になる気がするので0のまま。

これで多少マシになったかな。
プロット「サンドイッチを食べる、告白する」
クロは緊張して動かすことのできない手首をじっと見つめていた。シロはその手をそっと握りしめた。
「クロくん、大丈夫?」
「うん……」小さく頷いたクロは顔を上げ、真っ直ぐシロを見つめ返した。
「俺、告白する」
「え?本当?」驚いて目を丸くするシロに、クロは更に強引に顔を寄せた。
「本当だよ。もう限界だ。俺はシロが好きだ。ずっと前から好きだった。好きすぎて耐えられなくなった。だから、今度こそ絶対に逃さない。お前と一緒にいたい。幸せになりたい。そうだろ?」強く抱きしめられた腕に力を込めて、クロは必死に訴えた。
「クロくん……」戸惑いながらも嬉しそうに笑みを浮かべるシロの表情を見て、クロは安堵の溜め息を漏らした。
「ほんとに嬉しいな。俺、本当に幸せだ」
「うん。私も」頬を染め、目尻に涙を滲ませながら、シロは微笑んだ。
「ありがとう、クロくん。私、本当は怖かった。どうしようもなく不安で、焦れていた。だけど、こうして受け入れてくれたから、安心した。本当に、ありがとう」
「いや、俺が感謝してる。こんなに可愛くて優しい人、滅多にいないからね。俺の大事な宝物だ。大切に扱うから、頼む」
「うん。約束する」二人は互いに見つめ合い、心からの感謝と愛情を伝える。
~以下長いので略~
repetition_penalty 1.06、repetition_penalty_range 256
うーん。やっぱりちょっと支離滅裂かなぁ?
特に省略した後半はもっと微妙でした。
それから、ここにはちょっと載せられないのでアレですが、プロットを「押し倒す」とかにすると、ちょっとハードめのBL小説が出てくるようになりました。
おかしいな……。
学習素材にそんなハードな描写は含まれてないはずなんだけど……???
ChatGPT4 API
とか言ってるうちに、ChatGPT4のAPIが来ましたよ!!!!
早速BL小説を書いて貰います。
プロット「見つめあう、手をつなぐ」
夜が深まり、静寂が街を覆っていた。月明かりがわずかに照らす部屋の中、クロとシロは対峙していた。二人の間には言葉はなく、ただ無数の感情が空気を振動させている。
クロはいつものように無口でぶっきらぼうな態度だったが、その眼差しはシロだけに向けられた温もりを孕んでいた。黒髪が短く刈り上げられた冷たい外見とは裏腹に、彼の心は熱く、何かを訴えかけるかのようにシロを見つめていた。
シロはその視線に心を奪われながらも、自らもクロの深い瞳に視線を送り返していた。銀髪の長い髪が彼のかわいらしさを際立たせ、その姿は月明りに照らされ幻想的でさえあった。オレは…と内心で呼びかけながら、彼自身もクロのことをどうにか形にしたい一心だった。
そんな抑えきれない想いが高まる中、クロはゆっくりと手を伸ばした。先ほどまでの距離は一瞬にして意味を失い、彼の大きな手がシロの小さな手を包み込む。硬い指先が柔らかに絡み合い、ふたりの手は確かな繋がりを示していた。
クロの指がシロの手の甲を撫で、そっと力を込める。その行為は言葉以上の約束であり、シロの心臓は高鳴りを隠せなかった。彼はクロをじっと見上げ、この瞬間を何よりも儚く、美しいと感じていた。
「シロ…」クロはついに声を漏らす。それはいつものぶっきらぼうな声とは異なり、どこか温かみがあった。
「ん…アンタ…」シロも小さく返す。自分たちの指が絡まった温かさを感じながら、心の中でクロの名を何度も呼んでいた。
見つめ合い、手をつなぐシンプルな仕草の中にこそ、二人の深い愛情が静かに育っていたのだ。この夜、言葉ではなく、確かな感覚で互いを確かめていた。静けさだけが立ち込める部屋の中、クロとシロは、静かに絆を深めていくのであった。
もうねー、全部これでいいじゃん? って気になりますよね。
ハイクオリティ過ぎ。文章が自然!
価格もそこそこ安い! colabレンタル代とか考えたら全然アリ!
ChatGPT4によるデータセット作り
直接小説を書かせるだけでなく、良質なデータセットまで簡単に作れちゃう!

今更データセットなんて必要あるの? という話ではあるんですが。
まあAPIなんて、いつ突然使えなくなるか、わかったもんじゃないですし?別のLLMトレーニングのために、データセットを作る意味はきっとあると(震え声)どうも他のLLMに使っては駄目なよう?
ライバル教育になっちゃいますもんね。
そりゃそうか……(・ω・) 残念。
データセット用のお題
お題づくりもお手の物。
優秀すぎて人間のやることが、ほとんどなくなっちゃいましたね!

万能過ぎ……。
過疎ジャンル民もChatGPT4さえあれば、いつでも推しキャラの小説が読めますね。
もう推しの同人誌を切望しすぎて、夢でまで同人誌を買うも読む直前に目が覚めてしまい、凄くがっかりするとか。
そんな飢餓には襲われなくて済むんですね……!
無限の供給! 凄い時代だ!
次回はこちら