見出し画像

AIによるBL小説4 データセット

AIにBL小説を書いて貰おうと試行錯誤した記録です。
BLとはBoy's Love、男性同士の恋愛を描いた作品のことです。
BLを好む女性のことを腐女子と呼んだりします。

前回はこちら

第1回はこちら


学習素材について考える

AIの進化速度が速すぎて、記事を書ききる前に内容が陳腐化してしまうの、なんとかならないですかね?
(OpenAI Dev Dayを見ながら)

さて、第2回で生の文章(Raw text)を学習させたLoRAを作成しました。

しかし文体は学習できても、BLがどういうものかはあまり理解できてなさそうで。
概念を学習させるには、データセットを用いたトレーニングの方が良さそうです。
RAGとかもあるんでしょうけど、そちらはひとまず置いておきます。

が、ですよ。
当然ながら日本語BL小説用のデータセットなぞ、この世に存在する訳もなく、例のごとく手作りです。
供給のお淑やかなジャンルの民はいつもそう! 無いものは自家生産

※元ネタはこちら


データセット作り

小説

さてまずは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 、LoRA Rank 256、Contrastive Search

ヤンデレが過ぎる……!!
闇落ちELYZA (≧~≦)
というか学習素材にそんなハードな内容は含まれてないよ!?


ループ対策

しょうがないのでループ対策を行います。
でもなんだか回答がアホになる気がするので、なるべく低設定を攻めていきます。

repetition_penalty
 → ~1.06くらいまでが限界かな。
   高くなるとやはり支離滅裂に。

repetition_penalty_range
 → あまり高いと激重になるので、256くらいにしてます。

Other parameters の no_repeat_ngram_size
 → 支離滅裂になる気がするので0のまま。

これで多少マシになったかな。

プロット「サンドイッチを食べる、告白する」

クロは緊張して動かすことのできない手首をじっと見つめていた。シロはその手をそっと握りしめた。

「クロくん、大丈夫?」

「うん……」小さく頷いたクロは顔を上げ、真っ直ぐシロを見つめ返した。

「俺、告白する」

「え?本当?」驚いて目を丸くするシロに、クロは更に強引に顔を寄せた。

「本当だよ。もう限界だ。俺はシロが好きだ。ずっと前から好きだった。好きすぎて耐えられなくなった。だから、今度こそ絶対に逃さない。お前と一緒にいたい。幸せになりたい。そうだろ?」強く抱きしめられた腕に力を込めて、クロは必死に訴えた。

「クロくん……」戸惑いながらも嬉しそうに笑みを浮かべるシロの表情を見て、クロは安堵の溜め息を漏らした。

「ほんとに嬉しいな。俺、本当に幸せだ」

「うん。私も」頬を染め、目尻に涙を滲ませながら、シロは微笑んだ。

「ありがとう、クロくん。私、本当は怖かった。どうしようもなく不安で、焦れていた。だけど、こうして受け入れてくれたから、安心した。本当に、ありがとう」

「いや、俺が感謝してる。こんなに可愛くて優しい人、滅多にいないからね。俺の大事な宝物だ。大切に扱うから、頼む」

「うん。約束する」二人は互いに見つめ合い、心からの感謝と愛情を伝える。

~以下長いので略~

ELYZA 、LoRA Rank 128、Contrastive Search
repetition_penalty 1.06、repetition_penalty_range 256

うーん。やっぱりちょっと支離滅裂かなぁ?
特に省略した後半はもっと微妙でした。

それから、ここにはちょっと載せられないのでアレですが、プロットを「押し倒す」とかにすると、ちょっとハードめのBL小説が出てくるようになりました。
おかしいな……。
学習素材にそんなハードな描写は含まれてないはずなんだけど……???

ChatGPT4 API

とか言ってるうちに、ChatGPT4のAPIが来ましたよ!!!!
早速BL小説を書いて貰います。

プロット「見つめあう、手をつなぐ」

夜が深まり、静寂が街を覆っていた。月明かりがわずかに照らす部屋の中、クロとシロは対峙していた。二人の間には言葉はなく、ただ無数の感情が空気を振動させている。

クロはいつものように無口でぶっきらぼうな態度だったが、その眼差しはシロだけに向けられた温もりを孕んでいた。黒髪が短く刈り上げられた冷たい外見とは裏腹に、彼の心は熱く、何かを訴えかけるかのようにシロを見つめていた。

シロはその視線に心を奪われながらも、自らもクロの深い瞳に視線を送り返していた。銀髪の長い髪が彼のかわいらしさを際立たせ、その姿は月明りに照らされ幻想的でさえあった。オレは…と内心で呼びかけながら、彼自身もクロのことをどうにか形にしたい一心だった。

そんな抑えきれない想いが高まる中、クロはゆっくりと手を伸ばした。先ほどまでの距離は一瞬にして意味を失い、彼の大きな手がシロの小さな手を包み込む。硬い指先が柔らかに絡み合い、ふたりの手は確かな繋がりを示していた。

クロの指がシロの手の甲を撫で、そっと力を込める。その行為は言葉以上の約束であり、シロの心臓は高鳴りを隠せなかった。彼はクロをじっと見上げ、この瞬間を何よりも儚く、美しいと感じていた。

「シロ…」クロはついに声を漏らす。それはいつものぶっきらぼうな声とは異なり、どこか温かみがあった。

「ん…アンタ…」シロも小さく返す。自分たちの指が絡まった温かさを感じながら、心の中でクロの名を何度も呼んでいた。

見つめ合い、手をつなぐシンプルな仕草の中にこそ、二人の深い愛情が静かに育っていたのだ。この夜、言葉ではなく、確かな感覚で互いを確かめていた。静けさだけが立ち込める部屋の中、クロとシロは、静かに絆を深めていくのであった。

もうねー、全部これでいいじゃん? って気になりますよね。
ハイクオリティ過ぎ。文章が自然!
価格もそこそこ安い! colabレンタル代とか考えたら全然アリ!


ChatGPT4によるデータセット作り

直接小説を書かせるだけでなく、良質なデータセットまで簡単に作れちゃう!

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


データセット用のお題

お題づくりもお手の物。
優秀すぎて人間のやることが、ほとんどなくなっちゃいましたね!

「褒めて」って指定したら自画自賛し始めちゃったChatGPT4くん

万能過ぎ……。

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

無限の供給! 凄い時代だ!


次回はこちら


この記事が気に入ったらサポートをしてみませんか?