見出し画像

ローカルPCのLLMに長編小説を書かせるシステムをAntigravityで作ってみた

最近話題のAntigravityに、Ollama経由でローカルPCで動作するLLMを使って長編小説を書かせるシステムを作らせてみました。
途中、人間が介入することもできますが、放っておけばAIが勝手に長編小説を長々と書き続けてくれます。
しかも、ローカルPCで動作するので、いくら使っても無料。
PCさえあれば、誰でも無限に小説を生成し続けることができる小説家撲滅システムができました。ついに、AIによって奪われる職業に「小説家」が列挙される日が到来した!?

gemma3:27bで4万文字弱のSF小説を生成

先に結果から書くと、モデルに gemma3:27b を設定し、人間が介入することなく、39,681文字のSF小説『虚無の残響』を書き上げることができました。コンテキストウィンドウの枠を超えて、4万文字弱を生成し終えました。
小説本文はnoteの姉妹サイトでもある物語投稿サイトTALESの方にアップロードしました。もし、ご興味があるようでしたらご一読下さい。

実のところ、小説として面白いか? と、いわれると、正直……いや、控えめに言って「微妙」。率直に言って「は?」な出来ではあるのですが……

ま、とにかく、30のシーンに分けて出力されているにも関わらず、一応、大筋での起承転結があって、序盤は序盤っぽく、最後は最後っぽくなっています。しかも、これがローカルPCで動作しているわけですから、システムの第一号としては、こんなものかなと。
実のところ、もっとクズみたいな支離滅裂な文章群が生成されることを覚悟していたのですが、そこまででもないなという感じです。

『虚無の残響』をこれから読もうとしている方に、一応、言い訳をしておくと、今回生成したシステムを使っても、1シーンずつ書き進めて、都度、人間が介入すれば、もっともっと面白くなったと思います。ただ、あくまで今回は「小説を書くこと」が目的ではなく「小説生成システムの性能確認」が目的なので、まぁ、こうなったわけです。 (;^_^A

別のモデルを使えばもっと面白くなるのでは? と思い、同じプロンプトで gpt-oss:120b でも試したところ、一晩かけて68,844文字を書き上げました。分量的には、だいたい1冊分200ページぐらいにはなるのではないでしょうか。
タイトルは『ネオ東京・シルエット・コード』
こちらもTALESにアップしているので、ご興味のある方はどうぞご笑覧ください。

AIにAIシステムを作らせる

いまはバイブコーディングなどと呼ばれていますが、AIにコーディングさせることは、たぶん今後当たり前になるでしょう。こと、AIシステムの開発に当たっては、AIにコーディングさせることができるのに、これを使わないとなると、AIの利用を推進する立場でAIを拒絶していると捉えられる可能性もあります。近々、AIを使ってコーディングを行うことは必須になって行くでしょう。

Antigravity

Google Antigravity(アンチグラビティ)については、インターネット上に情報があふれているので、ここで詳しく触れることは避けようと思いますが、一見すると、VScodeベースのエディタにGemini 3が統合されているという感じ。
ただ、「エディタの中にAIがいる」とは真逆で、「AIの中にエディタがある」という発想なのだそうで、開発プロセス全体をAIが主導するのがウリなのだそうです。まぁ、使う方にとってはどっちでもいいんですけど。
とにかく、ざっくり言うと、Antigravityを立ち上げて「こんなアプリが欲しい!」と言葉で伝えれば「へい、お待ち!」と、アプリが出てくるというわけです。
スゴイね、AI!!

とりあえず、お願いしてみる

おもむろにAntigravityを立ち上げて、以下のプロンプトを投げてみました。

Ollamaを使ってローカルPCにインストールされたAIに長編小説を書かせるシステムを開発したい。
現在求められる要件は下記の通り:
1.7万文字から10万文字程度の長編小説を出力する。章や節ごとに分割して出力することは問題ないが、ストーリが矛盾なくつながっていることが求められる。
2.プロット作成 → 章・シーン構成(ハコ書き)作成 → 本文執筆 の3ステップで執筆を進める。
3.キャラクター名、年齢、口調、重要な伏線を管理するcharacters.json world.json を生成・参照する機能が必要。
4.本文執筆時に、「現在のシーンの指示」+「キャラクター設定」+「直前のシーンの要約」を動的にプロンプトに組み込むロジックが必要。
5.基本的にはAIが自動的に執筆を進めるが、進捗やプロットをすべてローカルのファイル(Markdown/JSON)として保存し、人間がVS Code等でいつでも編集・修正し、システムがそれを読み込んで続きを書けるようにする。

プロンプト1

こんなんでいいのかな?って感じの丸投げっぷりですが、なんか問題があったら聞いてくるだろうと思い、しばし休憩。

すると……

Ollamaを使った長編小説執筆システムの開発が完了しました。  main.py  を使ってプロット作成から執筆まで行えます。 詳細は walkthrough.md  をご確認ください。

Antigravity出力1

え、できたん? もう、作ったん?

拍子抜けするようなスピード感。なんと、もうできてしまいました。長編小説生成システムが!

ただーーし! ウキウキしながら実行して驚いたのは、出てきた小説が

Oh, English!

そう、英語の小説だったのです。
ぬかっておりました。長編小説とは書きましたが、「日本語」という指定を全くしておりませんでした。

慌てて、

日本語の小説を生成したいので、出力ファイルを全て日本語で出力するように修正してください。

プロンプト2

と、2発目のプロンプトを叩き込んだところ、

出力ファイルが全て日本語になるように generators.py  のプロンプトを修正しました。 これにより、プロット、キャラクター設定、世界観、本文、要約が日本語で生成されるようになります。

Antigravity出力2

という回答と共に、該当箇所が修正され、めでたく日本語小説執筆システムが完成したのでした。
早えぇ~

GitHubで公開

今回作ったシステムは、README(英語版と日本語版の両方共)もAntigravityに書いてもらって、『NovelWriter』という名前で、GitHubで公開しています。(MITライセンス)
ご興味があれば覗いてみてください。


いいなと思ったら応援しよう!

久道秀作 頂いたサポートは今後の記事作成のために活用させて頂きます。

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
買うたび 抽選 ※条件・上限あり \note クリエイター感謝祭ポイントバックキャンペーン/最大全額もどってくる! 12.1 月〜1.14 水 まで
ローカルPCのLLMに長編小説を書かせるシステムをAntigravityで作ってみた|久道秀作
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1