
1月24日から始めた世界崩壊少女のオープンテスト。
日々のバージョンアップは順調で、このまま稼働は継続できそうなので、ここらで今日までの開発記を書いておきます。
おもいつき…
1月19日(日)、基本情報技術の試験勉強をしていた時、プログラミングの項目に差し掛かりました。変数の宣言や定義、代入などなど、2年前に通っていた職業訓練校でも習った内容を思い出している内に、ふと、「……そういえばChatGPTのプロンプトも他のファイルからもってこれるよな」という気付きがありました。これがきっかけみたいなもんです。
去年の9月頃のことです。現在も通所している就労継続B型アフターネオさんで小説を書いていた時、ChatGPTに小説のようなものを書かせようとしたことがありました。
ChatGPTの綴る文章はとても丁寧で、国語のテストならたぶん100点レベルなのですが、最大の欠点として、こいつは人間がフィクションに求めるセンシティブな内容が書けないんですよ。嫌がるんですw まぁ、それっぽいのは書けますけどね。
だから、ChatGPTに文章系の創作は無理だろうな、とその時は思ったのですが……、同時に、あるテキストに対する感想を、特定のキャラクターの口調にして、Xに投稿させる分にはどうだろうか? と考えました。
それなら別に、小説のような質感や文才は求められません。
だいぶ前に、RSSから取得したニュース記事のタイトルとURLを投稿するだけのニュースBotを作ったことがあり、それはGoogleNewsのRSSが使えなくなったので休止していたんですが、この気づきをきっかけに、キャラクター口調のコメント付きでニュースを流すXBotをあらためてつくってみることにしたわけです。
プログラミングは趣味レベルで続けているので、ChatGPTのAPIは叩いたことがありました。ネットで拾ってきたサンプルコードを触っただけですけどね。
なので、元々あったコード同士をくっつけただけで作業はほぼ終了。大部分はChatGPTに書いてもらったわけですが。ちなみにRSSははてなブックマークを使うことにしました。
こうしてこうしてできたのが、Xで発達障害ニュースをコメント付きでポストする初葉アイなのです。
この子のプロンプトはコードにべた書きなのですが……、
はい、ここで話を冒頭に戻します。
例えば、プロンプトの元となる内容が別のファイルに書かれていて、そのファイルが例えば、投稿フォームから送られた内容の履歴ログとかなら?
この時に世界崩壊少女の設定を思いつき、『もしかしたらOpenAIにも創作させられるかもしれない』と思い、実際にやってみることにしたわけです。
プロンプトは世界観設定+投稿された内容で変動させる
例えばChatGPTに「崩壊した世界に生きる少女がXに投稿しそうなこと」と指示すれば、それっぽい文章は出してくれますが、数十パターン出した後は文言が違うだけで、内容に大差のないものが生成され続けます。バリエーションを増やせといっても効果はないです。こんなんでXのBotアカウントを立ち上げても、似たような文章が投稿されるばかりなのでつまらないでしょう。
でも、細々と指示を変えば話は別です。例えば、
- 指示:Xに投稿する少女が考える文章を考えろ。
- 指示:生成する文章は世界観とイベントにあった内容にしろ
- 世界観:崩壊した世界
- イベント:……
という固定のプロンプトに続けて、誰かが送ってくれたイベントテキストをくっつければ、その内容にあったテキストが生成されるわけです。
これならバリエーションの問題は解決します。
サンプルとなるイベントテキストを何十パターンか用意し、ランダム処理でどれかが選ばれるようにしてOpenAIにテキストを生成させたところ、手応えのある文章が生成されるようになりました。
しかし、実際、Xに投稿させて見てみると、最初は「おぉっ!」と思えるわけですが、数個くらい見たあとは、所詮はAIのテキストだな、と飽きがくるわけです。どのポストを見ても満足度が同じです。ずっと同じものを食べさせられてる感じ。
文章にリアリティはあっても、創作物に求められる説得力がありません。これではいけません。
別世界にいる生きている人間が投稿している、と思わせられなければいけません。
どうすればこの課題をクリアできるか?
その解決策が、写真付き投稿の実装でした。
文章だけではなく、その世界を写したような写真の画像があれば、説得力は爆上がりとなるはずです。
で、その画像はどうする?
ChatGPT+DALL-E-2で写真付き投稿を実現
うろ覚えだけど、そういえばOpenAIも画像生成できたよね。ということで、テキストから画像生成をさせてみることにしました。
コードはネットで拾ったサンプルコードを活用しました。
最初にできたのがこれです。
プロンプトには「崩壊した世界」と入れましたが、なんというか、常識の崩壊した画像が生成されました。
その後も不可解な画像ばかりが生成されました。サムネイル画像のやつもこの頃にできたものです。
ある意味センスはあるけど、求めているリアリティとは方向性が全く違います。いつか機会があれば公開しましょう。
世界崩壊少女は、ここから始まったといっても過言ではありません。
そうして試行錯誤の末に、プロンプトはしっかり要点が説明されたもので、英文の方が良いことがわかり、なんとか見られるものができ始めました。
これは「廃墟で足音を聞いた」とかのテキストから生成された画像です。
最初に見た時はぞくっとしました。
よくみなくてもAI生成だとわかりますが、写真の質感は十分に感じられます。
このままプロンプトを追求すれば、かなりいいものができそうな気配がしました。
ただやはり、結構リアルではあるものの、一目でAI生成であることがわかるレベルを越えることができません。
プロンプトが悪いのか、仮に最良のプロンプトができてもそのレベルは越えられないのか、その見極めもできませんし、画像生成はテキストよりも料金が高いので、テスト生成できる回数は限られています。
この頃に、偶然生成されたのが、
孤独な日々、希望だけが私を駆り立てる。他の生存者はいるのだろうか…? #X #希望 #孤独 pic.twitter.com/XWxJRMgnE5
— 世界崩壊少女『初希アイ』 (@hatsukiai_TWEG) January 23, 2025
このモノクロ画像でした。
一目でこれだ、と思いました。
モノクロにすればいろいろ誤魔化せるし、色がないことで見た人の想像力を刺激できる!
見せない。隠す。一部だけを明かす。
創作の基本ですね!
こうして、テキストと画像の生成のスタート地点がはっきりしたわけです。
- 世界観設定と投稿された文章を組み合わせて、毎回変化のある投稿文章を生成する
- 世界観設定と投稿された文章から、モノクロ写真のようなリアルな画像を生成する
他を作りながら、あとはひたすらプロンプト研究……
めでたくスタートがきれたので、イベントとなる投稿を受け付けるサイトをつくりながら、プロンプト研究に勤しみました。
投稿を受けるサイトは、以前、暇つぶしに作ったチャットルームを叩き台にして改良するだけだったので特に山はありませんでしたが、プロンプト研究はかなり難航しました。
今、ようやく及第点というだけで、まだまだ改良が必要です。
今回は今日までの流れを順序立ててまとめておきます。
テキスト生成の課題
投稿文生成で困ったのが、文章内に日付やファイルパス、ハッシュタグなどを入れてしまうことです。もちろんプロンプト上では入れないように言っているのですが、どうしても「Xに投稿する文章を生成して」という指示のプライオリティが高すぎるようでした。
指示を見直しても効果がなさそうなので、別の処理で削除と置き換えをすることで対処しました。
こうしてとりあえず投稿文に含めてほしくない要素は対処できたのですが、悪戯投稿対策や投稿済み履歴の取得についてはまだまだ課題が残っています。
悪戯投稿対策は、テキストが世界観を壊す内容なら夢だったことにしろ、という指示を加えて様子見中です。というのも、OpenAIはどうしても柔軟に対応する方向で処理してしまうので、例えば異世界にワープしたとかいう内容でも採用してしまうのです。
投稿済み履歴の取得については、例えば「廃墟で犬を見た」という投稿に対し、過去に投稿した内容に「犬を見た」という内容があれば、現在時刻と過去投稿の日付を取得、比較して、「犬を見た。三日前にも犬を見た」なんて文章を生成してほしいわけです。これが実現できれば物語の可能性がグッと広がります。
ただ、初期段階では実装していたのですが、成功率が低いので、現在は過去の履歴は読まないようにしています。OpenAIは文字の取得でも利用料金がかかるので、その点も考慮しなければなりません。
ですので現在の方針としては、ランダム選択された投稿からの生成を基準に、投稿される文章を頼ることにしています。つまり、内部的に過去の履歴を取得させなくても、「この間、見た犬がまたいた」など、過去の出来事に触れた投稿があればいいだけの話です。
例えばXに「食料が尽きてお腹が空いた……」という投稿があれば、それをみたフォロワーさんがフォームに、「廃墟で食べ物をたくさん見つける」という投稿をしてくれる、みたいなのを期待しています!
画像生成の課題
生成した投稿文をみて、世界観設定を基準にモノクロ画像を生成しろ、という指示のあとに、投稿内容と世界観設定を読ませます。
これで必要な内容を渡しているわけですが、初期の頃は、5割くらいは投稿文の内容とは無関係な画像が生成されました。テキスト同様、これを基準にしろと伝えたところで、他の情報も伝えていると、文意を問わず、OpenAIは基準が絞り込めなくなるようでした。
ここでも指示を英文にしたり、単語にしたり、箇条書きにしたり……、とChatGPTに相談しながらプロンプトを見直していきました。そうしてこうして着実に、画像のクオリティとテキストとの適合率はあがっていきました。
しかし、
昨日から降り続いていた雨がやっと止んだ。夜、星空を見上げながら願い事をしたよ。いつか、生きている誰かと会いたいな。#初希アイ #最後の生存者 pic.twitter.com/rngH3alhSU
— 世界崩壊少女『初希アイ』 (@hatsukiai_TWEG) January 26, 2025
このように、物体の時は対象物にズームアップした構図が多すぎて、何枚も見ていると違和感の方が勝ってしまうのです。
要素が物体の時は中距離で、風景の時は遠距離の構図にしろ、と指示をしても効果が薄い。腹の立つことに中途半端に成功するので、何が間違っているのかがつかみにくい。
プロンプト(画像生成指示 + 投稿文 + 世界観) → DALL-Eー2 画像生成
何十枚も見ているうちにわかったのが、結局、DALL-E-2も同様、何が基準かと伝えたところで、読ませたプロンプトに書かれている内容を全て再現しようとしてしまう、ということです。
それなら……、と思いついたのが、基準となる投稿文から、撮影可能な物理的要素を取り出す、という下拵えをすることでした。この処理は形態素解析も検討したのですが、柔軟な判断が必要なので、ChatGPTにやらせました。
プロンプト(撮影要素取得指示 + 投稿文) → 要素取得 → プロンプト(画像生成指示 + 撮影要素 + 世界観) → DALL-Eー2 画像生成
こうして、画像生成用プロンプトの要素の1つに投稿文を丸ごと渡すのではなく、純粋に基準となる情報を渡す、という流れになり、 これが大当たりで体感成功率が5割から8割くらいになりました。
今日は廃墟の中で、一人でぬいぐるみを見つけた。ぼろぼろだけど、なぜかとてもかわいい。即座に抱きしめた。誰かといれたら、もっと楽しいはず。 pic.twitter.com/igH1yX36xE
— 世界崩壊少女『初希アイ』 (@hatsukiai_TWEG) January 26, 2025
しかし、まだまだテキストと不一致な画像が目立ちます。
たまにある程度ならネタ要素としてありかも、とは思うのですが、ただ指示が下手で、滑っているだけです。これでは笑えませんし、フォロワーが増えてもすぐに飽きられてしまうでしょう。
そこで! 最終的に渡すプロンプトも最後に要約させることにしました。
つまり、決定版投稿文から撮影要素を抜き出したあとに画像生成ではなく、画像生成指示と撮影要素、世界観設定を合わせたものをまたChatGPTに渡し、画像生成用プロンプトとして要約させたものを、DALL-E-2に渡すことにしたわけです。
プロンプト(撮影要素取得指示 + 投稿文) → 要素取得 → プロンプト(要約指示 + 撮影要素 + 世界観) → プロンプト(画像生成指示 + 要約) → DALL-Eー2 画像生成
これがぎょっとするくらい質をあげてくれました!
これを書いている今、一番良いのはこれですね。
車の中に古い手紙が見つかった。”この場所から逃げろ”と書かれていた。逃げる先はどこかな… #生存者初希アイ pic.twitter.com/aowSMnQWTR
— 世界崩壊少女『初希アイ』 (@hatsukiai_TWEG) January 29, 2025
現在
現在はWEBサイトもBotのコーディングも必要な処理を入れ終わったところで、落ち着いてきました。……最初のきっかけからここまで10日間なんですが、なんか半年くらいやっていたような疲労感を感じています。
これからしばらくはプロンプト研究と必要処理の検討になるでしょう。
開発記はまたどこかの節目に書こうと思います。
あと、オープンテスト中にプレゼント付きの企画をやるつもりなので、今のうちにXアカウントのフォローをしてくださると嬉しいです。

コメント