🙄

AI小説執筆ツールにおけるプロンプト設計論

に公開

おおよそ小説執筆用のプロンプトの基本は固まってきたので、一度自分の考えているプロンプトとは何でどうやって設計しているかという事を書き出してみる事にします。

ツール側の紹介はこちら。

https://zenn.dev/yomai/articles/b79db03532815a

と、言っても僕も専門家ではないので、間違っている内容も多分に含まれていると思います。

なのでお優しい人がご指摘していただけると助かります。

よろしくお願いいたします。

基本的な考え方

  • AIに渡すプロンプトは必要最低限にすべき
  • 自然言語よりコードに近いほどよい
    • Mermaidでできる限り書くべき

これが僕の考えているプロンプト設計の骨子となる考えです。

AIに渡すプロンプトは必要最低限にすべき

AIとは超絶賢い素晴らしい存在です。

我々人間は、頑張ってAIができない事を探すしかありません。

っていうのが巷にあふれるAI理論な訳ですが、本当にそうですか?

僕はそんなこと思ったこと1度もありませんし、未だにしりとりもまともにできないこいつがそんなに優秀なわけがないと常に思ってます。

意外に気づいていない人多いみたいですが、AIって状態を記録しておいてそれを変更させるって処理を非常に苦手としています。

なので再起処理とか作らせるとびっくりするぐらい能力落ちるし、数ファイルまたぐ大規模リファクタリングとかも結構怪しい挙動します。

要するに1-10まで細かく書いたプロンプトでは、内容を覚えてられないので挙動が怪しくなると思ってプロンプトを設計すべきだという事が言えます。

安いモデルのコンテキスト限界って問題もありますしね。

もちろん更に発展した暁にはそのあたりの問題は解決されているかもしれませんが、現状のGPUを馬鹿みたいにつないで電気をあほみたいに使っている仕組みでは原理的に難しいのではないかなと思います。

なのでできる限り渡す情報は絞るようにしておく必要があると思っています。

自然言語よりコードに近いほどよい

AIというのは処理の過程でびっくりするぐらい行間読んできます。

なぜそんな言ってもない事を推論に混ぜたのかと思うほど混ぜてきます。

なので、あいまいな表現を避けて絶対に推論を間違えないようにプロンプトを渡す必要があります。

で、その視点で見るとコードに近ければ近いほど曖昧さがなくなるので、意思疎通が楽になると僕は考えてます。

と、いうか自然言語というのは曖昧さを許容する表現なのだから指示文として使うのには無理がある。

おまけに人間って言語化がへたくそで自分が考えていることを完全に言語化できる人間って相当なエリートな訳です。

だからコミュニケーション齟齬が至る所で起こっていると考えることもできる。

だったら自然言語での曖昧な表現はあきらめてもうちょっとコードに近い所で会話した方が有意義だろうというのが僕の基本的な考え。

モデルの活用

と、いう事で僕が考えている2点

  • AIに渡すプロンプトは必要最低限にすべき
  • 自然言語よりコードに近いほどよい

を満たせる表現は何か?

一つの答えがモデルではないかと思っています。

特にPlant UMLやMermaidといったコードライクでモデルを記述できる技術の進歩は素晴らしいのでこれを活用するのが一番楽ではないかと考えています。

AIとの会話をモデルでやると楽な点としては以下の2点が考えられます。

  • こちらの意図に変な解釈が入らない
  • むこうのグダグダ長い文章をカットできる

AIっていうのは回答が長ければ長いほど素晴らしいと思っているのか知りませんが、要点の得ない話をグダグダずっとしていて読むのがめんどくさくて仕方がない。

3行でまとめろよってつい言いたくなりますよね?

でも、実際に3行だとあまりに削りすぎて何が言いたいかさっぱり分からない訳です。

モデルにするとそこらへんがそれなりに圧縮されて意図が読みやすくなると僕は感じています。

なので、将来的にはAIとのコミュニケーション用の言語が開発されるだろうなとは思ってますが、現状ないのでモデルを変わりに使うのが良いのではないかと思っています。

Mermaidの理由

その中でmermaidを使っているのはなぜかと言いますと、

  • markdownに直接記述可能
  • javaとか入れなくてもいい
  • びっくりするぐらい自由度が高いので、可能性しか感じない

とかが理由になります。

特に最後の

  • びっくりするぐらい自由度が高いので、可能性しか感じない

はMermaidを触る度に思っています。これを考えた人間は天才だとしか思えない。
フォーマットにない図でもほぼ工夫次第で書けるので下手したら今書けない図もいつか書けるようになるかもしれないなと思っています。

マジでMermaidすごい。

プロンプト詳細

基本の考え方は終わったのでプロンプト詳細に入ります。

プロンプトの基本的な形というのは、このように基本プロンプトがあってそこにインプットをくっつけてやると最終的にAIに投げるプロンプトとなります。

基本プロンプト+インプットに必要条件をすべてくっつけてコンテキスト内に収めれば、欲しい出力が出てきますし、足りないなら勝手に行間を埋めたごみが出てくるというのが現在のAIの仕組みです。

加えて長すぎると必要な指示もごそっとカットされてまたごみが出てくるという事もいう事ができます。

小説用基本プロンプト

小説って言うのは乱暴に言えば登場人物とストーリーがあれば完成すると僕は思っておりますので、骨子となるプロンプトとして次のモデルを与えています。

  • character.md

登場人物。ペルソナをベースに作ったので必要ない情報が入っている気もしますが概ねキャラ設定は守ってくれているみたいなのでしばらくはこの形式で発展させていけばいいかと思っています。

  • story.md

ストーリーに関してはマインドマップ形式にしています。守るべきことが放射状になっているのでAI的に理解しやすいかと思って作りました。

ただ使っている感じどうも必要条件が抜ける時があるのであまり良くない可能性が高い。プライオリティの設定がないから不要だと判断して重要な情報を捨てていそうな予感がしているので作り直したい所。

小説作成用プロンプト

https://github.com/yomai-hiyashidewa/novel_workflow

詳細はGitHubに公開してあるのでそちらを見ていただくとして、基本的な流れは以下のようになっています。

  • 執筆する

この3つのプロンプトが中心となる執筆用のプロンプトです。

  • planner

## 執筆プランを作成する

* canonの内容を元にinputの内容をどのような物語にするかを決定する。
* この作業は一連の執筆ワークフローの一部である。
* 最終成果物は小説であり、このプランを元に小説家が執筆を行う。
* あなたの仕事は最終小説が2000字程度になるようにinputの内容を分割してまとめることである。
  * inputの内容は、**物語に不可欠な独自の情報**を優先し、可能な限り使いきる。
  * 分け方例:午前、午後、場所
* 以下の出力フォーマットに従って出力する。

### 最終成果物(plan.md)仕様

* **【出力フォーマットの厳守】**
    * **全体あらすじの項目は、必ず**`##`**(Markdownのレベル2ヘッダー)で区切り全体のあらすじを記述すること**
    * **各執筆プランの項目は、必ず**`###`**(Markdownのレベル3ヘッダー)で区切り、プランのタイトルを記述すること。**

以後フォーマット

以下のフォーマットに従って分割した内容を出力する。

## 全体あらすじ

### タイトル案

| 要素 | 記述内容 |
| :--- | :--- |
| **物語の焦点** | そのパートで扱う主要なテーマや達成すべき目的。 |
| **場所・時間** | そのパートの具体的な場所と、時間の経過。 |
| **天気** | そのパートの天気の情報。 |
| **使用するイベント** | `note.md`から選択したイベント |
| **使用する感想** | `note.md`から選択したイベントに関係する感想 |
| **使用する写真アイデア** | `pictures.md`から選択した写真アイデア。htmlタグごとコピーして、アドレスを"../img"に変える。 |

#### Setting.mdからの引用

* このパートに最も深く関連する`setting.md`のNo.を特定し、そのNo.の行に記載されている**全内容**を引用して記述する。
* 表形式なのでヘッダー行もまとめて引用する。


このプロンプトがメモと設定資料から小説を作成するための計画を立案しています。

と、いうのも後ろの工程でこの内容を全部一気にやらせると明らかにコンテキストが不足したので分割処理にしました。

もしかしたらお高いモデルを使うと破綻しない可能性もありますが、重要な設定を忘れるというポカをやりそうなのでしばらくは分割した方がよいと思っています。

またAIというのは優先順位の付け方がとにかくへたくそです。

なので、できる限り全部使えと指示していますがここはいまいちうまくいっていないのでイベントの選び方というガイドラインを別に設定する必要があるのかな?とは感じています。

* plotter

## プロット作成する

* plan.mdの内容ごとに、**執筆の指針となるプロット**を作成する。
* この作業は一連の執筆ワークフローの一部である。
* 最終成果物は小説であり、このプロットを元に小説家が執筆を行う。
* 小説家が執筆する最終稿はおおよそ2000字を想定している。
* あなたの仕事はplan.mdの内容を元にプロットを作成することである。
    * canonの内容を正しく守ることがクライアントから求められている。

### 作業詳細    
* プロットの内容は以下に示すmermaidのテンプレートに従って言動、感情を記述する。
    * 詳細なセリフは小説家が作るので話の流れと感情が分かるように書くこと。
* plan.mdから使用する写真をhtmlタグごとコピーする。
* plan.mdから#### Setting.mdからの引用以下をすべてコピーする。
* 章の最初の場合は起承転結の起、最後の場合は起承転結の結を意識して作成する。
* 途中である場合は次への引きを最後に入れる。

#### 出力フォーマット

##### カット割り

```mermaid
flowchart TD
subgraph character A
    subgraph cut1
        act1[言動] --- emotion1(感情)
    end

    subgraph cut2
        act2[言動] --- emotion2(感情)
    end

    subgraph cut4
        act4[言動] --- emotion4(感情)
    end

end

subgraph character B
    subgraph cut3
        act3[言動] --- emotion3(感情)
    end

    subgraph cut5
        act5[言動] --- emotion5(感情)
    end

end

cut1 --> cut2
cut2 --> cut3
cut3 --> cut4
cut4 --> cut5

```
##### 使用する写真

##### Setting.mdからの引用

分割した計画に合わせてプロットの作成を行っています。

いろいろ考えた結果、必要なのは言動とその時の気持ちなんだからカット割りみたいな感じで出せないかと考えたのがこのモデル。

プロットって言ってるのに明らかに書きすぎていて、おまけにその理由となる創作理論がこれでもかと詰め込まれていて読むのが本当に苦痛だったのでやっぱり自然言語でAIと会話するのは無理があると感じた。

  • writer

多分要だとは思っているが、現状もっと前の段階に手を入れる必要があり、ありきたりなことしか書いてないのでカット。

備考

これの原型としてはnotebookLMに自分のツーリング記録と雑なdeepresearchの結果を入れた結果、すごい面白いポッドキャストができたのでこの形式で作りたいと思ってこの形にしています。

https://notebooklm.google.com/notebook/4c1e49fe-dc0c-4bb9-bad8-47908a7cc984?artifactId=dac7616b-95b0-418e-8667-00f5823955cd

じゃあわざわざプロンプトなんて作らずにNotebookLMでいいじゃんって話なんですが、NotebookLMの話って何を入れても大体同じような感じにしかならなくて飽きたんですよね。

常に意識高い会話しているから疲れる。

音声解説って書いてあるから当たり前かもしれませんが、とにかく意識高くて問がどうこうばっかり言ってるので僕が常に欲しい物ではなかった。

実際の制作物例

https://note.com/yomai_worldtrip/n/nc79eb75e26fe

https://note.com/yomai_worldtrip/n/n25c1d6f61e15

*ちなみにイラストについては特にやっていて面白い物でもないので雑にgeminiかchatGPTに投げて出てきたのをそのまま使ってます。

別の設定使って精度が安定してきたらそっちにも取り組むかも。

まとめ

  • mermaidを使ってできる限りモデルでAIと会話できる方法を目指している。
    • AIに判断をできる限り委ねない。
    • AIの曖昧な回答を見ないでいいようにする。

Discussion