AIで短編小説作ってみた!プロンプト付き

AIで短編小説作ってみた!プロンプト付き

作ったもの

あしざわ法典を参考にして、ChatGPT4に短編小説を書かせてみました。

あしざわ法典では、人をAIがキャッチボールして執筆をすすめますが、今回はスクリプト化してボタン一発で小説を生成できるようにしました。
また、あしざわ法典自体がGPT3.5時代に書かれたものなので、三幕構成の確認などはスキップしています。

実行コマンド一発でランダムな小説ができるので、ほぼ小説ガチャ!

小説の書かせ方

以下の流れで、ChatGPT4に英語で指示して、英語で書いてもらいます。

  • ネタ出し → あらすじ生成
  • 登場人物のプロフィール作成
  • プロット作成
  • 章ごとに本文を作成
  • 日本語に翻訳
  • 最終チェック(人間)

システム構成

システムコンテキスト

You are an AI bestselling writer. You collaborate with humans to write a short story.

Current conversation: {chat_history}
Human: {input}
AI:

{chat_history}は、langchainのConversationSummaryMemoryをGPT3.5で利用。

ネタ出し → あらすじ生成

ある程度ランダムな要素を元ネタにあらすじを生成してもらいます。
以下の要素をスクリプトからランダム選択し、小説のお題とします。

  • ランダムに選んだ職業
  • ランダムに選んだ物語のジャンル2つ
    • ホラーとか、ファンタジー、SFなど
  • ランダムに選んだ物語の結末タイプ
    • ハッピーエンドなど

プロンプト

Choose two random words related to Nurse.
I would like to write a story from them.
It ends with Bittersweet Ending.
Be specific in describing any secrets, mysteries, or decisions that come up in the story.
Do not add a subtitle to the title.
The genres of the novel you will be writing is Steampunk and Thriller.
Can you give me one idea?

EXAMPLE
Title: Peach Boys
Picked Words: peach, village
Synopsis:
Boys born from peaches go to exterminate ogres. They succeed in conquering the ogres and return to their village.
END OF EXAMPLE

YOUR IDEA

日本語訳

ナースに関連する単語をランダムに2つ選んでください。
その中から物語を書きたいです。
ビタースイート・エンディングで終わる。
物語の中で出てくる秘密、謎、決断などを具体的に記述してください。
タイトルに副題をつけないこと。
あなたが書く小説のジャンルは、スチームパンクスリラーです。
1つのアイデアを教えてください

EXAMPLE
Title: 桃少年
Picked Words: 桃, 村
Synopsis:
桃から生まれた男の子が鬼退治に行く。鬼退治に成功した彼らは、村に帰っていきます。
END OF EXAMPLE

YOUR IDEA

  • 太字の箇所がプログラムでランダムチョイスした指示
  • EXAMPLEは書式指定のための例なので毎回同じでOK
  • Picked WordsにGPT4が脳内で選んだ単語を書いてくれます

登場人物のプロフィール作成

次にキャラ一覧を作ってもらいます。

プロンプト

Please create a brief profile of the characters needed for this story.
The profile should include appearance and gender. Gender should be limited to female or male.

EXAMPLE

  • Emily Morton:
    • Gender: Female
    • Appearance: Mid-30s. average height. slim build. shoulder-length brown hair. blue eyes, and a kind smile.
    • Role: She confronts the protagonist and attacks him with a bomb in the city in the middle of the story. In the end, she reforms and rushes to the protagonist’s rescue.
      END OF EXAMPLE

PROFILES:

日本語約

この物語に必要なキャラクターの簡単なプロフィールを作成してください。
プロフィールは、外見と性別を記載してください。性別は女性か男性に限定してください。

EXAMPLE

  • エミリー・モートン:
  • 性別:女性
  • 外観: 30代半ば、平均的な身長、スリムな体格、肩まである茶髪、青い目、優しい笑顔
  • 役割: 物語中盤の街で主人公と対峙し、爆弾で攻撃する。最後は改心し、主人公の救出に駆けつける。
    END OF EXAMPLE

PROFILES:

これで、主人公込みで、3~5キャラほど作ってくれます。
性別に関しては男 or 女と指定しないと性別不詳とかトランスジェンダーをねじ込んできます。
Stable Diffusionでキャラの絵を作るときめんどうになりそうだったので性別をハッキリさせました。

プロット作成

次に各章のプロットを作ってもらいます。

ここでは、お話全体の単語数と、作成する章の数でボリュームを指定します。
ストーリー展開に要望がある場合は、ここでも指定しておきましょう。

プロンプト

I want to turn this story into a story of about 600 words.
It have in 3 chapters.
Can you write a plot based on the conversations we’ve had so far?
If the antagonist does something evil or obstructive to the protagonist, please describe it specifically.
When a character makes his or her first appearance, introduce the character in a way that readers can understand.
The story sholud be Bittersweet Ending.

EXAMPLE
Chapter 1:
Momotaro was born from a peach…
Chapter 2:
Momotaro has defeated the ogre…
END OF EXAMPLE

YOUR PLOT:

日本語訳

この物語を、600ワード程度の物語にしたいのです。
全部で3章になります。
今までの会話からプロットを書けるか?
敵役が主人公に対して悪事や妨害行為をする場合、それを具体的に描写してください。
キャラクターが初登場するときは、読者が理解できるように紹介してください。
ストーリーは、ビタースイート・エンディングであることが望ましい。

EXAMPLE
第1章
桃太郎は桃から生まれた…。
第2章
桃太郎は鬼を退治した…。
END OF EXAMPLE

YOUR PLOT:

章ごとに本文を作成

1章ずつ本文を書いてもらいます。
ここでは、章ごとに2つの指示を出します。

  • (章ごとの指示)
    • 最初と最後の章で指示を入れました。
    • 1章: 世界観の紹介からお願いします。必要であれば、年代や場所の説明も入れてください。
    • 最終章: 物語は第3章で終わります。結論、解決、物語の終わりを含めてください。
  • (この章のプロット)
    • 作成したプロットを提示します。
    • こうすることで各章の齟齬が減ります。

プロンプト

I want to write a novel of about 600 words, **3 chaptersA in all, based on the conversations we’ve had so far.
Can you write Chapter 1 of the novel in the first person of the main character in 200 words or less?
Please write in dialogue-driven style and the psychological description of the protagonist.
Do not use foreshadowing sentences by the protagonist.
(章ごとの指示)

PLOT_OF_THIS_CHAPTER
(この章のプロット)
END PLOT_OF_THIS_CHAPTER

CHAPTER1:

日本語訳

今までの会話から、600字程度、全部で3章の小説を書きたいのです。
小説の第1章を主人公の一人称で200字以内で書いていただけないでしょうか。
主人公の心理描写を中心に、会話中心で書いてください。
主人公による伏線的な文章は使わないでください。
(章ごとの指示)

PLOT_OF_THIS_CHAPTER
(この章のプロット)
END PLOT_OF_THIS_CHAPTER

CHAPTER1:

本文ができたら、扱いやすく、読みやすいようにマークダウン形式で保存しておきます。

日本語に翻訳

保存したMarkDownを、ChatGPTに翻訳してもらいましょう。

プロンプト

You are a professional AI story writer.
Human inputs are markdown.Please translate markdown into Japanese.
The text in markdown should be in an easy-to-read format, like a Japanese light novel.
Markdown structure and tag is output as is.Don’t delete “#”.All I need is a translated markdown.

日本語訳

あなたはプロのAI作家です。
人間の入力はマークダウンです。マークダウンを日本語に翻訳してください。
マークダウンの文章は、日本のライトノベルのような読みやすい形式であることが望ましいです。
マークダウンの構造、タグはそのまま出力します。”#”は削除しないでください。

ファイルまるごと翻訳は、文字数オーバーになるのでできません。
langchainの、MarkdownTextSplitterで分割して翻訳します。

const { MarkdownTextSplitter } = require("langchain/text_splitter");

async SplitMarkDown(text: string, chunkSize = 1000, chunkOverlap = 100, separators = ["\n\n", "\n", " ", ""]) {
  const splitParam = {
    chunkSize,
    chunkOverlap,
    separators,
  };
  const splitter = new MarkdownTextSplitter(splitParam);

  const metadatas: Record<string, any>[] = [];
  const documents = await splitter.createDocuments([text], metadatas);
  return documents;
}

最終チェック

固有名詞が統一されてなかったり、わかりにくい箇所を手作業で治すと読みやすくなります。
また、ChatGPT4投げてチェックしてもらうのも有効です。

プロンプト

以下のラノベを読んで、わかりにくい箇所や一文が長すぎる箇所を修正しスタイリッシュな感じにしてください。

本文

具体的な修正をどうしたら良いかわからない場合、とりあえずぶん投げてみるのもアリです。

スクリプトに実装した機能

スクリプトは使い慣れたNode.jsで langchain というnpmパッケージを利用しました。
こちらはネット上の情報に古いものが多いので動かないときは、公式ドキュメント読んだり、諦めてソース読みましょう

すべて一括で行うと、20分以上かかる上にOpen AI APIの使用料金が高くなるのでスクリプトには下記機能を持たせました。

途中経過保存 & 再実行機能

途中経過をjsonに保存し、あとからトライ&エラーできるようにしました。
最初のあらすじをたくさん出してもらって、気に入ったものだけ続きを書いてもらうようにしました。

簡易翻訳機能

GPT4の各出力は、Google翻訳 APIで日本語に翻訳しました。
ChatGPT4で翻訳すると値段が高くなるし、時間もかかります。
そこで、無料枠のあるGoogle翻訳APIを利用しました。

const {Translate} = require('@google-cloud/translate').v2;

async TranslateEn2Ja(text: string) {
  try {
    const translate = new Translate({key: YOUR_API_KEY});

    // 翻訳する言語コード(日本語: 'ja')
    const targetLanguage = 'ja';

    // 翻訳を実行
    const [translation] = await translate.translate(text, targetLanguage);

    return translation;
  } catch (error) {
    console.error(error);
    throw error;
  }
}

癒しの時計仕掛け

タイトル画像

以下は、ChatGPT4に書いてもらった小説です。

第1章

この病院には、私が想像していた以上の秘密があるようで、その感覚が消えなかった。私の名前はエリザ、30代後半の看護師で、古びた19世紀の建物で働いている。運命的なあの夜、地面が揺れるのを感じたとき、私の人生がどれほど変わるか、まったく予想できなかった。

地下へと降りて、揺れの原因を探ろうとしたところ、隠された扉が目に飛び込んできた。

好奇心に駆られ、つぶやいた。「これは何だろう?」

扉の向こうには、時計仕掛けのオートマタがたくさん詰まった部屋が広がり、繊細な歯車が連動して動く様子に見入った。彼らが謎の病気や怪我をした人々を治療しているのを見つめていた。

周囲を見回すと、輝く真鍮の姿を微調整している技術者がいた。ドキドキしながら彼に近づいた。「すみません、これは…一体何ですか?」

彼は驚きの目で私を見た。「ああ、看護師の方ですね。ようこそ。ここは時計仕掛けのオートマタが病人を治療する場所です。」

信じられない気持ちで彼を見つめた。「でも…どうやって?こんなもの、見たことがない。」

彼は微笑んだ。「しばらく見ていたら、新しいことが分かるかもしれませんよ。」

そうして、私はその提案を受け入れた。だが、その好奇心が、私の人生を永遠に変える危険な道へと導くことになるとは、その時まだ知らなかった。

第2章

私は、時計仕掛けのオートマタが病人を治すその素晴らしき光景が忘れられなかった。シフトの終わりに近づくと、魅了と罪悪感が交錯する感情が湧いてきました。この隠された世界を秘密にできぬと悟り、以前一緒に働いたアリステア捜査官に相談することにしました。彼は信頼に足る人物であることを知っていました。

「病院の地下で信じられないことが起きているんです」と、私は震える声で語り始めました。

アリステア捜査官は真剣な眼差しで聞き入り、驚きの表情で眉を上げました。「時計仕掛けの機械でできた部屋が人々を治すって? 信じられない話ですね!」

私たちは隠された部屋に降り、オートマタの動きを観察。彼の好奇心は私と同じで、時計仕掛けの創造者の歴史を探求することにしました。

私たちは文書を発掘し、完璧を追求する天才発明家の存在が明らかになりました。彼は、時計仕掛けの精巧な仕組みを使い、機能不全の臓器を置き換える技術に磨きをかけていました。しかし、彼の仕事を知れば知るほど、不安が募りました。創造者の仕事は、倫理に反し、無防備な患者たちを実験台にしていたのです。

感嘆しつつも、その創造における非道な行為に恐怖を覚える私は、アリステアに告げました。「どう思うべきか分からない。これらの機械は奇跡に近いものだけど、その代償は…見合うのだろうか?」

アリステアは、冷静に私たちの使命を思い出させました。「看護師エリザ、私たちは真実を暴く立場です。それが私たちの責任だ。」

勇敢で決意に満ちた私たちは、共に前進し続けました。時計仕掛けの創造者の秘密を暴き、彼の罪を明るみに出すことに専念しました。

第3章

エリザは恐ろしい状況に立たされ、こんなことになるとは夢にも思わなかった。彼女は髪に絡まった指を通しながら、暗闇に包まれた周囲を見つめ、警告の兆候を無視してしまったことを後悔していた。

彼女の誘拐犯の声が部屋に響く。「看護師エリザ、あなたの好奇心がここまで導いた。言葉が私の終わりになるところだったが、今はあなたが私の手にある。」

涙をこらえ、声が裂けるのを抑えて、エリザは言った。「あなたの実験は残酷だ!無実の人々が苦しんでいる!」

その時、アリステア捜査官が現れ、時計仕掛けの創造者に向かって揺るぎない決意で言った。「彼女を放せ!これ以上、正義から逃げられない!」

激しい対決が終わりなく感じられたが、エリザは縛られた身体と心の痛みに抵抗しつつ、最後にはアリステアが狂気の発明家を制圧するのを目の当たりにした。彼の逮捕により、時計仕掛けのオートマタは解体され、ねじれた歴史が暴かれた。

病院で試練から回復しながら、エリザは恐ろしい経験を背後に置いて看護師としての仕事を続ける決意を固めた。アリステアは彼女の回復力に感銘を受け、社会を改善するために戦うことを誓った。

喜びと悲しみが混ざり合った現実であった。時計仕掛けのオートマタは癒しをもたらしたものの、他人の苦しみという代償を払っていた。これは科学と倫理の境界を押し広げる代償として、私たちに突きつけられた忘れてはならない警鐘であった。


まとめ

いくつかのステップに分けて小説を書いてもらいました。

作成した文章は、一部によくわからないところや不整合があります。
自分では書けない物語が作れてるのはすごいのです。
ここから品質をあげるには作家経験のある人のノウハウが必要だと感じました。

ネタ出しとして、あらすじだけ生成するのも十分楽しめます。
普通では考えつかない謎世界観が出てくるので、面白いです。