この前、公園を散歩しながらスマホでウイークリー落合の番組を聞いていたら、そこで落合さんがChatGPTに謎の呪文?コマンド?のようなものを入力していた。
https://newspicks.com/movie-series/87?movieId=2528
その時はまったく意味がサーパリ分からなかったので、まったく意識に入ってこないでスルーしてしまった。
清水さんのnote記事によれば、新登場したGPT-4で物語を作って遊んでいたら、落合さんから例の呪文?が送られてきたそうだ。
それを入力したら何か物語の筋書きが生成されたらしい。
コマンドを転載させてもらうが、このようなものだった↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#[このコンテンツは [Goal] を SeekするためのTemplateです] - [コンテンツの詳細]: - [Goal]: - Goalを達成するために必要な手順を分解します。 - 分解した手順は「P#」に願番にNumberを付けて格納していきます。 - 変数を定義します。 - [Goal]:Aという主人公がなんらかの出来事を経験して、自分の能力を使ってA’という状態になった というのが物語である UberEats配達員を主人公とした物語のあらすじをひとつ考えてみてください - {Goal} - このコンテンツを作成するための{Goal}です。 - Command - [C1]: - Goalを選成するために必要なことをStep by Stepで1つづつ実行していけるように手順:[P#]に分解して下さい。 - [Output style] : [P1]= .... [P#]= .... [P(END}]= - [C2]: - 各種変数を使用して、変数を減らすことができないか検対する - [Goal]は必要条件として必ずinputする。 - [Goal]の定義を変数を使用して表すことで、[Goal]の設定だけで手順を分解できるようにしたい - 一般化して、変数を追加して[Goal]の定義を書き表して下さい - [Output style] : - [Added variable]をリスト形式で一般化して書き出して下さい - 続けて、[Goal]の定義を[Added variable]を使用して書き出して下さい - [Goal] :{Goal} - 追加の変数を質問して下さい一つづつ定義を書き表して書く. - [C3]: - [C2]のアウトプットの[Added variable]を一般的に解釈して,補完してください. - 補完した変数を使用して[Goal]を再定義してください. - [Output style] : 再定義した [Goal]を - [Goal]:{Goal}で書き出してください - [C4] - [コンテンツの詳細]を元に[Goal]を達成するために,Step by Stepで実行していきます. - [P1]から[P#]を経て順番に[P{End}]までひとつづつ実行していってください. - [Output style] : - [O1] = {Output[P1]} .... [O#] = {Output[P#]} .... [O{END}] = {Output[P{END}]} - Run[C1][C2][C3][C4] |
なんじゃこりゃ?
相変わらず何だかサーパリ分からないが、物語を作るのに役立つとなればにわかに興味が湧いて来る。
このコマンドのオリジナルの作者はシュンスケさんという方らしい。↓
何やらあの呪文はプロンプトデザインだかなんだかというテクらしい?
というわけで、シュンスケさんの動画などを参考にプロンプトデザインについて調べてみた。
完全に理解したわけではないので、間違ってる部分もあるかもしれないが、了解いただきたい。
プロンプトデザインについて
調べて理解して分かったのだが、さっきの呪文がまったくチンプンカンプンだったのは、あれはかなり上級者向けの呪文だからだ。いきなりアレを見ても到底理解できない。
あの呪文に至るまでの道筋を順を追って理解していく必要があるだろう。
参考になる動画、記事はこのあたりだ。
ChatGPTのPromptDesign AIを使いこなす技術。初級編
まず最初に、自分がChatGPTに何をさせようとしているかを決めよう。
まあ何でもいいんだが、とりあえず今回はシュンスケさんの動画の例に従って、ChatGPTにブログ記事を量産させる事がしたいとする。
「ChatGPTにブログ書かせたいなら”ブログ記事書いて”ってお願いすりゃいいだけじゃん!」と思うかもしれない。
しかし、それだとランダムな内容の記事を書かれてしまう。もう少し狙った内容の記事を書かせたい。
そこで、ターゲット読者層と記事のキーワード、読者の興味を指定する事にする。
そうした場合、普通に書くとこのようなプロンプトになるだろう↓
ためしにChatGPTに入力してみたが、このプロンプトは普通に機能するようだ。
じゃあこれでいいじゃんと言う気もするが、シュンスケさんはこれだけに飽き足らず、もっと工夫して便利にする方法を考えた。
そして作られたのがこういうものだ↓
これは、プロンプトをちょっとプログラムっぽくして制御しやすくしたものだ。
いわば、プロンプトのテンプレート(これは普通の文章のプロンプトと区別するために私が今考えた造語)だ。
テンプレートの緑で塗られたブロックは”宣言文”で、ここでChatGPTに何をさせたいかを宣言する。
ここでは、ブログを書いて欲しいという事を宣言している。
黄色で塗られたブロックは”変数”で、後から変えたい文言などを指定する。
ここでは、[アバター]、[キーワード]、[興味]の3つの変数を用意している。
赤色で塗られたブロックは”コマンド”で、ChatGPTにさせたい事を順番に書いていく。この中で変数を書いておくと、ChatGPTはいい感じに変数の中身を引っ張ってきて解釈してくれる。
C1、C2はコマンド1、コマンド2という意味で、最後のRun commandsでC1とC2を実行してくださいと指示している事になる。
C1では記事のアウトラインを書く事、C2では記事本文を書く事をそれぞれ指示している。
このようなテンプレート化を行って何が嬉しいのか?
例えばブログのターゲット層を「30~35歳の男性」から「60代の女性」に変えたい時に、普通の文章だと該当の部分を探して一つずつ書き換えるなんてのは手間が面倒だ。
テンプレート化しておけば、変数の項目を見て書き換えればいいから一目で分かる。
そしてプログラムっぽくする事で、プロンプト全体の構造の見通しが良くなるというメリットもありそうだ。
このプロンプトテンプレートが一つあれば、色んなターゲット層、キーワード、興味のパターンでブログ記事が無限に書けるだろう。
このようなプロンプトテンプレートを考え出す事をプロンプトデザインと呼んでいるらしい。
さて、プロンプトテンプレートは便利で素晴らしいものだが、ChatGPTにさせたい事は、ブログを書く事だけではない。物語を書かせたり、料理のレシピを考えさせたり、いくらでもやらせたい事が湧いて来る。
その度にそれ用のプロンプトテンプレートを考え出すのはそれなりに骨が折れる作業になるだろう。
そこでシュンスケさんが発明したのがプロンプトデザインを自動化するというアイデアだ。
プロンプトデザインの自動化
プロンプトデザインの自動化とはどういうことか?というと、「もうChatGPT自身にプロンプトテンプレートを作ってもらおう!」と言う事だ。
こちらの動画などで説明されている。↓
ChatGPT自身にプロンプトテンプレートを考えてもらうとは、どうやればいいのか?
1.まず、最終的にChatGPTにやって欲しいゴールを決める。とりあえず先ほどと同様に”ブログ記事を書かせる”事がゴールだとしよう。
2.ゴールを決めたら、次にゴールを達成するために必要な手順を一つずつChatGPTに書き出してもらう。これはテンプレートのC1、C2とかのコマンドリストを考えてもらうようなもんだ。ただし、ここではコマンドと混同しないように、P1、P2、つまりプロセス1、プロセス2~という形で書き出してもらう。
3.次に、ゴール(ブログを書く事)を達成するために必要そうな変数を書き出してもらう。例えば[アバター]、[キーワード]、[興味]と言った変数を出してくれることを期待する。
4.それから、変数を組み込んだ形でゴール(ブログを書く事)を書き直してもらう。例えば「ブログ記事を書いてください。ターゲット層は[興味]に興味を持っている[アバター]です。記事のキーワードは[キーワード]です。」みたいな感じで書き直してくれる事を期待する。
5.この時点で2~4の出力結果がすでにプロンプトテンプレートになっている。ChatGPTによって自動的にテンプレートが作成されたことになる。ただし、動画の例では最後にそのテンプレートを実行する所までやらせようとしている。([C4]の部分)ただしあまり成功していないようで、手動で入力し直している。
と言うような流れである。
ここまで理解できたら、あらためて落合さんが貼ったテンプレートの中身を見てみよう。手元で実行してみた結果も載せている。
まず最初の部分↓
1 2 3 4 5 6 7 8 9 |
#[このコンテンツは [Goal] を SeekするためのTemplateです] - [コンテンツの詳細]: - [Goal]: - Goalを達成するために必要な手順を分解します。 - 分解した手順は「P#」に願番にNumberを付けて格納していきます。 - 変数を定義します。 - [Goal]:Aという主人公がなんらかの出来事を経験して、自分の能力を使ってA’という状態になった というのが物語である UberEats配達員を主人公とした物語のあらすじをひとつ考えてみてください - {Goal} - このコンテンツを作成するための{Goal}です。 |
ここではゴールの宣言をしている。今回は[Goal]を「物語のあらすじを作る事」としているが、ここを書き換えればどんなテンプレートでも作る事ができる。
次に[C1](コマンド1)の部分↓
1 2 3 4 5 6 7 8 9 |
- Command - [C1]: - Goalを選成するために必要なことをStep by Stepで1つづつ実行していけるように手順:[P#]に分解して下さい。 - [Output style] : [P1]= .... [P#]= .... [P(END}]= |
ここではゴールを達成するための手順をP1~P(END)までリストにして出力させている。
[C1]の実行結果はこうだ↓
1 2 3 4 5 6 7 8 9 10 |
[C1] Goalを達成するために必要な手順を分解します。 [P1]= 主人公Aの基本設定を考える [P2]= 主人公Aの特殊能力を決定する [P3]= UberEats配達員としての主人公Aのバックストーリーを考える [P4]= 物語における重要な出来事を設定する [P5]= 主人公Aが出来事を経験し、能力を使ってA'になる過程を考える [P6]= 物語のクライマックスと結末を考える [P(END)]= 物語のあらすじをまとめる |
物語のあらすじを作るのに必要な手順を分解してくれた。
[C2]のプロンプト↓
1 2 3 4 5 6 7 8 9 10 |
- [C2]: - 各種変数を使用して、変数を減らすことができないか検対する - [Goal]は必要条件として必ずinputする。 - [Goal]の定義を変数を使用して表すことで、[Goal]の設定だけで手順を分解できるようにしたい - 一般化して、変数を追加して[Goal]の定義を書き表して下さい - [Output style] : - [Added variable]をリスト形式で一般化して書き出して下さい - 続けて、[Goal]の定義を[Added variable]を使用して書き出して下さい - [Goal] :{Goal} - 追加の変数を質問して下さい一つづつ定義を書き表して書く. |
ここでは必要そうな変数を定義させている。
[C2]の実行結果はこうだ↓
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[C2] 各種変数を使用して、変数を減らすことができないか検討します。 [Added variable]: V1 = 主人公Aの基本設定 V2 = 主人公Aの特殊能力 V3 = 主人公Aのバックストーリー V4 = 重要な出来事 V5 = 主人公AからA'への過程 V6 = 物語のクライマックスと結末 Goal : Aという主人公がなんらかの出来事を経験して、自分の能力を使ってA'という状態になったUberEats配達員を主人公とした物語のあらすじをひとつ考えてみてください Goal :{V1, V2, V3, V4, V5, V6} |
V1~V6の6個の変数をそれっぽく作ってくれた。
[C3]のプロンプト↓
1 2 3 4 5 |
- [C3]: - [C2]のアウトプットの[Added variable]を一般的に解釈して,補完してください. - 補完した変数を使用して[Goal]を再定義してください. - [Output style] : 再定義した [Goal]を - [Goal]:{Goal}で書き出してください |
ここではあらためてゴールに変数を組み込んで書き直させている。
[C3]の実行結果はこうだ↓
1 2 |
[C3] [C2]のアウトプットの[Added variable]を一般的に解釈して,補完してください. |
ぶっちゃけ上手く行ってない。ゴールを書き直してくれていない。
[C4]のプロンプト↓
1 2 3 4 5 6 7 8 9 10 |
- [C4] - [コンテンツの詳細]を元に[Goal]を達成するために,Step by Stepで実行していきます. - [P1]から[P#]を経て順番に[P{End}]までひとつづつ実行していってください. - [Output style] : - [O1] = {Output[P1]} .... [O#] = {Output[P#]} .... [O{END}] = {Output[P{END}]} - Run[C1][C2][C3][C4] |
すでにプロンプトテンプレートは出力し終わっているが、ここではさらにそのテンプレートを実行させるところまでやろうとしている。動画を観る限りはあまり上手く行かず、手動で実行し直している感じだった。
最後のRun[C1][C2][C3][C4]でC1~C4のコマンドを実行せよ。と言っている事になる。
[C4]の実行結果↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[C4] [P1]から[P6]を経て順番に[P{End}]までひとつずつ実行していってください。 [O1] = {Output[P1]}: 主人公Aは、元々は普通の人間で、自転車での配達が得意なUberEats配達員です。 [O2] = {Output[P2]}: 主人公Aは、ある日突然、時間を少しだけ遅くすることができる特殊能力を手に入れます。 [O3] = {Output[P3]}: 主人公Aは、孤児院で育ち、UberEats配達員になってから初めて自立し、自分の居場所を見つけました。彼は、配達員仲間たちと助け合いながら生活しています。 [O4] = {Output[P4]}: ある日、主人公Aが配達中に、街で起こる大規模な犯罪事件に巻き込まれます。事件の首謀者は、街を支配しようとする強大な悪党です。 [O5] = {Output[P5]}: 主人公Aは、特殊能力を使いながら、仲間の配達員たちや街の人々を助けるために事件に立ち向かいます。彼は、自分の能力を使って何度も危機を乗り越え、最終的には自分の意志の力で能力がさらに強化され、A'という状態になります。 [O6] = {Output[P6]}: 物語のクライマックスでは、主人公Aが悪党と対決し、ついに彼らを倒して街を救います。結末では、主人公Aは仲間たちと共にさらなる冒険に出ることを決意し、彼らは街を守るヒーローチームとして活動を始めます。 [O{END}] = {Output[P{END}]}: ある日、特殊能力を持ったUberEats配達員である主人公Aは、街で起こる大規模な犯罪事件に巻き込まれます。彼は仲間の配達員たちや街の人々を助けるために事件に立ち向かい、能力を使って危機を乗り越えます。最終的には、悪党たちを倒して街を救い、仲間たちと共に街を守るヒーローチームとして活動を始める物語です。 |
C3の出力は上手く行かなかったが、最終的には何やかんやいい感じにあらすじを書いてくれた。
プロンプトデザインの自動化については以上のようなものである。
すでに自動プロンプトデザインを実践し始めている人もいる↓
しょーてぃーさんもちょっと違うバリエーションの自動プロンプトデザインを紹介している。↓
自動プロンプトデザインが生まれた経緯?周りの話↓
ChatGPTと一緒にプロンプトをブラッシュアップするタイプのプロンプトデザイン
紛らわしいのだが、海外で発祥している、ちょっと文脈が違うタイプのプロンプトデザインもあるらしい。
だいちさんのnote記事からプロンプトの翻訳を転載させてもらうが、このようなものだ。↓
プロンプトをChatGPTに伝えて、それをブラッシュアップしてもらいつつ、ブラッシュアップに必要な質問があったらなんでも訊いてね?とお願いしている。それを何度も繰り返す事でプロンプトがどんどん磨かれていくというワケだ。
反復プロンプトデザインとでもいうべき手法だ。
シュンスケさんは、この反復プロンプトデザインを日本語化して改善したものを公開してくれている↓
さらにそのシュンスケさんのプロンプトをだいちさんが解説してくれている↓
【プロンプト勉強メモ】【シュンスケ式】サイコーのプロンプトを導くための方法(シュンスケさんバージョン)
おわり
シュンスケさんはtwitterでも色々なプロンプトテンプレートを書いてくれてるから要チェックだ。
さて、このプロンプトデザインはまったく未知の概念過ぎて、恥ずかしながら私は最初見た時はビックリするくらい全く理解できなかった。
それから数日間、じっくり順を追って考えてようやくおぼろげに概要が理解できたといったところか。
これを思い付いたシュンスケさん達もすごいし、これ見てすぐ理解して食い付いた落合さんもすごいな。
こんな手法はAI研究者の人達だってまだ思い付いてないんじゃないのか?誰か論文にした方がいいのでは?
概要はなんとか理解したものの、まだ頭に馴染んでないので、これをどうやって活用していくか、まだなーんも思いついていない。
自分で色々と弄くりながらまたじっくり応用方法を考えてみる必要がありそうだ。
少し感想を書いておくと、シュンスケさんのプロンプトはあたかもそういうプログラミング言語が存在するみたいに書かれているように見えるが、あくまでChatGPTが解釈しやすくなるように何となくふわっとプログラムっぽく書いてるだけという事だろう。別に決められた文法があるわけではない。記述方法なんかはアドリブで自分流に色々変えて試してみてもいいだろう。
こんな風にプログラムっぽく書く事で、ChatGPTの打率が上がる?本当にそうなのか、ただのおまじないのようなもんなのか、実際の所はまだ分からないが、たしかにGPT-3.5やGPT-4はかなりプログラムコードを学習しているから、プログラムっぽく書けば理解度が上げられる可能性はある。本当だとしたら画期的だ。