ローカルLLMに小説を書いてもらう v2.1


はじめに

以下の記事のマイナーチェンジ版です。

生成スクリプト

最新の生成スクリプトとプロンプト定義はgistを更新してあります。

https://gist.github.com/kohya-ss/68d41a9720bfbdfd87869ec970142f4b

見えてきた課題と対策

v2のスクリプトでいくつか小説生成を試みる中で、課題も見えてきました。

生成単位は小さめに

v2では、ひとつの章を複数のシーンに分割し、章ごとに生成していましたが、一度の生成で場面転換を含むようなものを生成しようとすると、破綻する確率が上がるようでした。そのためv2.1では各章を小さめに、具体的にはひとつの場面で収まるくらいにして、その単位で生成するよう変更しました。

また登場人物の状態や心情、その章を通しての変化がわかりにくいよう思いましたので「初期状態」「内容(章での変化)」「終了状態」を生成させるようにしました。

そのため、v2でのシーン分割のステージは、v2.1では状況整理を行うステージに変更してあります(スクリプト内は `scenes` 表記のまま)。

これらにより、多少ですが破綻が少なくなったように思います。ただ、章をまたがると「前の章にあった出来事を繰り返す」「服装が変わっている」といったことが起きますので、まだまだ改善の余地はありそうです。

なお、プロットやアウトラインから一気に生成しても意外に何とかなったりしますが、起承転結や設定の管理を考えると、やはり分割生成が良さそうではあります。

レビューするよりガチャしたほうがいい

身も蓋もないですが、編集者エージェントにレビューさせて小説家エージェントに修正させるよりも、量を生成したほうが良さそう、という認識です。同じ時間で2.5倍ほど生成できるので、単純に試行回数が増え、良いものができる確率も上がるようです。

手で修正するのが速い

小説を生成したい、手段は問わない、ということなら、中間生成物を都度編集していくのが確実です。特に章の状況整理を修正し、各章で矛盾しないようにしておくと本文がまともになる率が上がります。

これに伴いスクリプトでは、試行回数と最大ステージを定できるようにしました。プロットだけガチャ、アウトラインまでガチャ、などとして、修正したり良さそうなものを組み合わせたりしていくと、結果的に良いものが早く完成するようです。

プロットからの完全生成はロマンということですね……。

「60点です」プロンプトの導入

本文生成のステージで、初回の編集者エージェントのレビューコメントに、固定の文章を指定できるようにしました。ここに「この文章では60点です。100点を目指してください」などと指定すると、生成されるテキストが「リッチ」になります(必ずしも良くなるとは限りませんが、より細かい描写をしようとしてくれる感じです)。

まだ試していませんが、いわゆる「パワハラプロンプト」のように、「60点を100点にするには」「それを適用」の二段階の方がより良い可能性もありそうです。

ただすべての章で行うと時間も掛かりますので、クライマックスの章の直前まで生成し、Ctrl+Cで止めて、プロンプトを差し替えてクライマックスの章を生成、という手順をお勧めします。

生成された小説

ひょんなことからXで拝見したとりにく(@tori29umai)さんのプロットが面白そうだったため、恋愛小説からSF小説にプロンプトを微修正し、試しに生成してみました。こちらの記事に本文を紹介していただきましたのでご覧ください。

生成はCommand-R+ Q4_K_Mで行いました。この記事の末尾に中間成果物(各ステージの生成結果)を含むJSONファイルを添付しておきますので、よろしければご覧ください。

まとめ

いろいろ工夫することで品質が上げられそう、という記事でした。Claude 3.5 Sonnetによる記事まとめを置いて終わりにしたいと思います。

本プロジェクトは、ローカルLLMを用いた短編小説生成の挑戦的な取り組みです。これまでの経験から、小さな単位での分割生成、多数の試行、人間による中間編集の有効性が明らかになりました。また、プロンプト設計の工夫により生成文章の質を向上させられることも分かりました。さらに、他のジャンルへの応用可能性も確認されています。これらの知見は、AI小説生成の分野に貴重な示唆を与えるものです。今後も試行錯誤を重ね、AI技術と人間の創造性のバランスを探りながら、新たな物語創作の可能性を追求していきます。

あっはい頑張ります

生成物

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