【ChatGPT】GoalをSeekする複雑なプロンプトについて解説してみる

mistake, error, facepalm プロンプト
この記事は約19分で読めます。

今回は、ChatGPTのプロンプトについての解説記事となります。
先ず、本日解説するプロンプトはShunsuke Hayashi(林 駿甫)さんがお作りなったものです。
Shunsuke Hayashi(林 駿甫)さんはプロンプトデザイナーとして活躍しておられる方です。
(コード自体はshi3zさんのnoteよりお借り致しました。)

なお以下のプロンプトの”Goal”はあくまで一例です。後述しますが、このプロンプトはテンプレートですので、使う方の目的により書き換えて使用する事が想定されています。

この記事は私の個人的な解釈によるものです。必ずしも作者の意図と説明が合致している事を保証するのものではございません事をご理解のうえお読みください。

#[このコンテンツは [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]

先ずはプロンプトデザインの基本を知りたいという方は以下の記事をご覧ください。

スポンサーリンク

このプロンプトについての解説

このプロンプトを端的に表すならば、『ある目標(Goal)を達成するための手順を分解して出力する』テンプレートです。
つまり、どんな手順をたどれば目標を達成できるのか?を出力してくれると言って良いと思います。

今回の例では全体としてUberEats配達員を主人公とした物語のあらすじを出力させようとしています。その過程として主人公が何らかの出来事を経験して自分の能力を使ってA’という状態になるまでを分解しています。

これは汎用的なプロンプトなので特化した質問でなければ凡そ無難な回答をくれる事が多いです。
これは汎用的なプロンプトなので特化した質問でなければ凡そ無難な回答をくれる事が多いです。

プロンプトの流れ

まず、[C1]では、Goalを達成するために必要な手順を分解し、[P1]から[P#]までの手順をリストアップします。

次に、[C2]では、変数を使用して、[Goal]を一般化し、手順の分解を簡単にすることを目指します。[Added variable]をリストアップし、[Goal]の定義を[Added variable]を使用して表します。

[C3]では、[C2]のアウトプットの[Added variable]を一般的に解釈し、[Goal]を再定義します。

最後の[C4]では、[コンテンツの詳細]を元に、[P1]から[P#]を順番に実行していき、目標を達成するための手順を実行します。結果として[O1]から[O#]までのアウトプットをリストアップします。

以上より、このプロンプトは、目標を達成するために必要な手順を分解するための一般的なテンプレートとして使用できます。

それでは、次から大まかな役割ごとに詳しく見ていきましょう。

スポンサーリンク

– {Goal} – このコンテンツを作成するための{Goal}です。これは何を示しているのか

- {Goal}
- このコンテンツを作成するための{Goal}です。

この部分は、このプロンプトを作成するにあたっての目的(Goal)を定義しています。つまり、このプロンプトで達成したい目的を示しています。
この部分はプロンプトの意図を明確にするためにも重要です。

スポンサーリンク

– Command この役割は何か

- Command

“Command”は、このプロンプトの中で、実行するべき手順や作業を指示するセクションのことです。
具体的には、[C1]から[C4]までの4つのコマンドが示されています。各コマンドは、目的やゴールを達成するために必要な作業を指示し、それに従ってプロンプトを進めることで、最終的に目的を達成することができます。
このように、Command部分はこのプロンプトを実行するうえで非常に重要な役割を担っていると言えます。

スポンサーリンク

他にはどのような指示がプロンプトで使用可能なのか?

プロンプトで使用可能な指示は、プロンプトの種類や目的によって異なりますが、一般的には以下のような指示が使われます。

以下の指示はあくまでChatGPTのみならずプロンプト全般で使用できるものです。
必ずしもChatGPTにおいて期待通りの動作を保証するものでは有りません。
あくまで、これらはプロンプトデザインにおいて、ある程度の共通認識の元(例えばcommandであれば他の人も命令かなって思うよね?程度ですが)でよく使うだけであり、別の言葉に変えても問題ない場合がほとんどです。
これはプロンプトを使うようなAIモデル(自然言語処理ベース)はプログラム言語(人工言語)のように特定の単語=命令が絶対的ではないからです(勿論モデルによる)
ChatGPTであればあくまで自然言語処理ベースなので、前後に書いた方が指示(xxせよ)を表現出来ていれば問題ないと言う事です。例えばCommandを日本語で命令や指示に変えても動きますし、Orderとかにしても動くと思います。
ただ、これをやってしまうと後で見返した時、他人に見て欲しい時、複雑な処理にする時などで可読性が低下するのでお勧めはしません。

  • Prompt: 与えられたトピックやテーマに関連する情報やアイデアを出力するように指示します。
  • Generate: サンプル文章、テキスト、画像、音声、動画などを生成するように指示します。
  • Summarize: 複数の文章や文書から要約を作成するように指示します。
  • Classify: 与えられたテキストや画像などを分類するように指示します。
  • Translate: 文章、フレーズ、単語、音声、画像などを別の言語に翻訳するように指示します。
  • Edit: 与えられた文章や文書を編集するように指示します。
  • Evaluate: 与えられた文章や文書に対して、品質、論理的妥当性、相互整合性、傾向などを評価するように指示します。
  • Compare: 与えられた2つの文章、画像、音声などを比較するように指示します。
  • Recommend: 特定の条件に基づいて、アイテムや情報を推奨するように指示します。
  • Predict: 特定の入力データに基づいて、予測を作成するように指示します。
  • Solve: 与えられた問題や課題を解決するために、解決策を提供するように指示します。
  • Explain: 特定の現象や事象について説明するように指示します。
  • Explore: 特定のトピックに関する情報を探索し、新たな知見を得るように指示します。
  • Design: 特定の製品やシステムを設計するための指示を出します。
  • Generate Ideas: 特定のトピックに関するアイデアを生成するように指示します。
  • Clarify: あいまいな点や曖昧な表現を明確化するように指示します。
  • Verify: 特定の情報や主張が正しいかどうかを検証するように指示します。
  • Recommend Actions: 特定の問題や課題に対して、どのようなアクションを取るべきかを推奨するように指示します。
  • Generate Questions: 特定のトピックに関する質問を生成するように指示します。
  • Evaluate Options: 特定の選択肢を評価し、最適な選択肢を見つけるように指示します。
  • Predict Outcomes: 特定のアクションや決定に対する結果を予測するように指示します。
  • Modify: 特定の文章や文書を変更するように指示します。
  • Convert: 特定のデータやフォーマットを変換するように指示します。
  • Extract: 特定のデータや情報を抽出するように指示します。
  • Annotate: 特定の文章や画像に注釈を追加するように指示します。
  • Simulate: 特定の状況やシナリオをシミュレーションするように指示します。
  • Optimize: 特定の目的を達成するために、最適な解決策を見つけるように指示します。
  • Train: 機械学習モデルをトレーニングするための指示を出します。

以下の記事では、ここまで難しくないいくつかの例を取り上げて解説しています。

スポンサーリンク

– [Output style] : の役割は?

- [Output style] :

“[Output style]”は、プロンプトで出力する情報のスタイルや形式を指定するためのセクションです。このセクションでは、プロンプトの出力内容を、一定の形式に整えて表示する方法を示します。

具体的には、”[Output style]”以下に示される書式に従って、各ステップの実行結果を出力することが想定されています。たとえば、”[P1]=”という書式に従って、ステップ1の結果を表示し、”[P2]=”という書式に従って、ステップ2の結果を表示するようになっています。また、”[O1]=”という書式に従って、ステップ1の出力結果を表示し、”[O2]=”という書式に従って、ステップ2の出力結果を表示するようになっています。

このように、”[Output style]”を指定することで、プロンプトの出力内容を統一的に表示することができ、ユーザーが出力結果を理解しやすくなるというメリットがあります。

スポンサーリンク

– [C1]:や- [C2]: の役割は?

- [C1]:や- [C2]:

“[C1]”や”[C2]”などは、プロンプトの中での各コマンドを識別するためのラベルです。このようなラベルは、プロンプトを分かりやすくするために使用されます。各ラベルには、目的やタスクを達成するための手順が含まれており、これらの手順に従ってプロンプトを実行することができます。

たとえば、”[C1]”はプロンプトの最初のコマンドであり、”[Goal]”を達成するために必要な手順を分解するように指示しています。”[C2]”は、変数を使用して”[Goal]”を定義するためのコマンドであり、”[C1]”で分解した手順に加えて、変数を使用して目的を表現する方法が示されています。

このように、各ラベルは、プロンプトを実行するための手順や指示を提供するために使用されます。プロンプトの目的やタスクに応じて、必要なラベルを追加したり、独自のラベルを作成することができます。

スポンサーリンク

[C1],[C2]のようなラベリングにルールはあるのか?

プロンプトのラベリングに、一般的なルールがありません。
ラベリングの方法は、プロンプトの作成者や目的、プロンプトのタスクに応じて異なります。
ただし、一般的に、プロンプトを作成する際には、以下のようなルールに従ってラベリングを行うことが多いです。

  1. コマンドの意図が明確になるように、適切なラベルを使用する。
  2. コマンドの順序が分かりやすくなるように、番号を使用してコマンドをラベル付けする。
  3. ラベルが混乱を招かないように、明確で一貫性のあるラベル名を使用する。
  4. 同じ種類のコマンドには、同じラベルを使用する。

これらのルールに従って、プロンプトを作成することで、ユーザーがプロンプトを簡単に理解し、必要なタスクを実行できるようになります。
また、ラベルのルールは、プロンプト作成者が柔軟に変更できるため、自分のスタイルに合わせて調整することもできます。

日本語でも大抵はうまく行くのですが、解釈を間違える事が多いので英語化するのも良いかも知れません。
日本語でも大抵はうまく行くのですが、解釈を間違える事が多いので英語化するのも良いかも知れません。
スポンサーリンク

コマンドの実行順はどのように指示すればよいのか?

プロンプトのコマンドの実行順序は、ラベルに番号を付けることで指示することができます。具体的には、各コマンドに[P1]、[P2]、[P3]のような番号を付けて、順序を示します。また、プロンプトの最後には[P(END)]という番号を付けて、プロンプトの実行が完了したことを示します。

以下に例を示します。

[C1]:
- [Goal]: Aという主人公がなんらかの出来事を経験して、自分の能力を使ってA’という状態になったというのが物語である UberEats配達員を主人公とした物語のあらすじをひとつ考えてみてください。

[Output style]:
[P1]= 分解した手順をここに記述してください。
[P2]= 分解した手順をここに記述してください。
[P3]= 分解した手順をここに記述してください。
[P(END)]= 全ての手順を実行しました。

このように、各コマンドのラベルに番号を付けることで、プロンプトの実行順序が明確になります。プロンプトを実行する際には、[P1]から[P(END)]まで順番に実行することで、目的を達成するための手順を実行することができます。

指示についてですが、そもそもChatGPTにも言語理解能力の限界がありますので、少し意識してみると結果が変わるかも知れません。

スポンサーリンク

– Run[C1][C2][C3][C4] の役割は?

“Run[C1][C2][C3][C4]”は、プロンプトの各コマンドを実行するための指示です。具体的には、”[C1]”、”[C2]”、”[C3]”、”[C4]”というラベルに対応するコマンドを順番に実行することを意味します。

各コマンドを実行することで、プロンプトの目的を達成するための手順が順番に実行され、プロンプトの出力結果が得られます。たとえば、”[C1]”は、目的を達成するために必要な手順を分解する指示であり、”[C2]”は、変数を使用して目的を定義する指示です。”[C3]”は、変数を使用した目的の再定義を行い、”[C4]”は、目的を達成するための手順を順番に実行する指示です。

“Run[C1][C2][C3][C4]”を実行することで、プロンプトの目的を達成するために必要な手順を順番に実行できます。ただし、プロンプトによっては、より多くのコマンドが必要な場合があるため、プロンプトの目的とタスクに応じて、必要なコマンドを実行するように指示する必要があります。

スポンサーリンク

– Run[C1][C2][C3][C4] が無い場合、コマンドの実行順はどのようになるのか?

“Run[C1][C2][C3][C4]”が指示されていない場合、コマンドの実行順序は明示的に指定されていないため、上から順に実行する可能性が高いです。
ただし、プロンプトの各コマンドには、実行する順序に関する情報が含まれているのであれば、実行順序を明確に指定した方が良いでしょう。

たとえば、各コマンドのラベルに番号を付けることで、実行順序を明示的に指定することができます。また、プロンプトの最後には、コマンドの実行が完了したことを示すラベルを付けることで、プロンプトの実行が終了したことを明示することができます。

したがって、プロンプトを実行する際には、コマンドの実行順序を明確に指定することが望ましいです。具体的には、各コマンドの実行順序を明示的に指定する方法を使用して、プロンプトの実行順序を明確にすることができます。

スポンサーリンク

明示的なラベリングや指示がない場合、コマンドはどのような順で実行されるか

プロンプトに明示的なラベリングや指示がない場合、一般的にはコマンドは上から順に実行されます。
これは、プログラムやスクリプトなどのコンピュータプログラムの基本的な動作原理に基づくものです。

しかし、プロンプトによっては、コマンドの実行順序がランダムな場合もあります。
たとえば、対話型のプロンプトの場合、ユーザーが入力したコマンドによって、実行順序が変わる場合があります。

したがって、プロンプトを作成する際には、実行順序が重要な場合は、明示的なラベリングや指示を追加することが望ましいです。

コマンドがあまり数が多いと、出力の一貫性を維持する事が困難になってくる可能性があります。ChatGPTに「つづけ」と言っても前の事を無視した回答をする事がありますが、まさしくその現象です。以下で長文出力時の限界について解説しているので参考にしてみて下さい。

スポンサーリンク

明示的なラベリングや指示をする場合、どのようにすればよいのか?書式はあるのか?

明示的なラベリングや指示をする場合、一般的には以下のような書式を使用します。

[ラベル]: コマンドの内容

この書式では、”[ラベル]”という形式のラベルに、コロン”:”を付けて、コマンドの内容を続けます。ラベルは、コマンドの内容を説明するために付けられる名前であり、プロンプトの実行順序を示すために数字を付けることが多いです。

例えば、以下は「Hello, World!」というメッセージを表示するプロンプトの例です。

[P1]: メッセージを表示する
echo "Hello, World!"

[P2]: プログラムの実行が終了したことを表示する
echo "プログラムの実行が終了しました。"

この例では、”[P1]”と”[P2]”というラベルに、それぞれコマンドの内容が続きます。”[P1]”は、「メッセージを表示する」という名前で、”echo”コマンドを使用して、”Hello, World!”というメッセージを表示します。”[P2]”は、「プログラムの実行が終了したことを表示する」という名前で、”echo”コマンドを使用して、プログラムの実行が終了したことを表示します。

このように、明示的なラベリングや指示をすることで、プロンプトの実行順序や目的を明確にすることができます。

スポンサーリンク

– [Goal] :{Goal} の役割は?[]と{}の使い分けは?

まず”[Goal] :{Goal}”は、プロンプトの目的を示すためのコマンドです。
“{Goal}”という部分には、プロンプトの目的が入ります。
“{ }”は、目的を記述するための変数であり、”[Goal]”というラベルに対応する目的を表す変数と言う事を示しています。

“[]”と”{}”についてですが、これらはそれぞれ異なる目的で使用されます。
“[]”は、ラベルを表すために使用される事が多いです。一般的には”[ラベル]”という形式で使用され、コマンドの識別子として機能します。

一方、”{}”は、変数を表すために使用されます。一般的には”{変数名}”という形式で使用され、値を代入することができる変数として機能します。

このプロンプトの場合、”[Goal]”というラベルに対応する目的を、”{Goal}”という変数を使用して表現します。
これにより、プロンプトの目的を簡潔に表現することができます。
また、”[Goal] :{Goal}”のように、ラベルと変数を併用することで、目的を明確に定義することができます。

したがって、”[Goal] :{Goal}”は、プロンプトの目的を明確に示すためのコマンドであり、”[]”と”{}”は、それぞれラベルと変数を表すために使用されます。

例えば、以下はプロンプトの例です。

[Goal]: Aという主人公がなんらかの出来事を経験して、自分の能力を使ってA’という状態になったというのが物語である UberEats配達員を主人公とした物語のあらすじをひとつ考えてみてください。

[Goal]: UberEats配達員を主人公とした物語のあらすじをひとつ考える。
[Goal] :{goal}

この例では、最初の”[Goal]”では、目的の説明文が記述されています。2番目の”[Goal]”では、目的を一般化するために、”{goal}”という変数が使用されています。最後の”[Goal] :{goal}”では、”{goal}”という変数が使用されていることが示されています。この変数には、後のステップで実際の値が代入されることになります。

余り難しく考えるよりまずは試してみてChatGPTの反応を確認したほうが良いです。複雑なプロンプトを組んだとしてもそれが必ずしも良い答えを出すとは限りません。行き詰ったら逆にシンプルなプロンプトで質問を繰り返すのも良い手だと思います。
余り難しく考えるよりまずは試してみてChatGPTの反応を確認したほうが良いです。複雑なプロンプトを組んだとしてもそれが必ずしも良い答えを出すとは限りません。行き詰ったら逆にシンプルなプロンプトで質問を繰り返すのも良い手だと思います。
スポンサーリンク

一般化とは?

この解説で度々登場している、プロンプトの一般化とは、具体的な値や条件を変数やパラメータに置き換え、より汎用的な形式で表現することです。

一般化することで、プロンプトをより汎用的な形式にすることができ、同じ構造の問題に対して再利用できるようになります。

具体的には、プロンプトの中で、問題の目的やステップ、条件などを一般的な形式で表現し、それぞれの値や条件を変数やパラメータに置き換えることができます。例えば、「a + b = 5」という式がある場合、aやbの値によって解が異なりますが、変数を使用して「x + y = 5」という式に一般化することで、異なる値に対応できます。

一般化の概念は、プログラミングの中で広く使用されており、コードの再利用性を高めるために重要な概念です。
一般化することで、同じ構造の問題に対して同じ手順を適用することができ、プロンプトの作成や変更が容易になります。

ChatGPTにはコンテキスト維持に関する限界も存在します。質問の意図や背景を読み切る事が出来ない場面があります。上述の長文問題と一部重複するのですが、こちらも把握しておくとより良いプロンプトが作成できるかも知れません。

スポンサーリンク

最初で述べたようなプロンプトを作るためにはどのような手順を踏めばよいのだろうか?

これほど素晴らしいプロンプトを凡人である我々に作ることは出来るのでしょうか?
一応、私が個人的に考え付いた限りでは以下のような手順を踏めば可能性はあるかもしれません。
(今回取り上げたプロンプトを使ってChatGPTに聞いてみても良いかも知れませんね)

最初で述べたようなプロンプトを作るためには、以下のような手順を踏むことが近道と思います。

  1. 目的を明確にする:
    プロンプトの目的を定義し、どのような問題に対して解決策を提供するかを明確にする。
  2. ステップを分解する:
    目的を達成するために必要なステップを分解し、それぞれにラベルを付ける。
  3. 変数を定義する:
    プロンプトに必要な変数を定義し、プロンプト内で使用する。
  4. 変数を使用して一般化する:
    目的やステップ、条件などを一般化し、変数を使用して表現する。
  5. コマンドを記述する:
    各ステップに対応するコマンドを記述し、必要に応じて変数やパラメータを使用して、一般化された表現を具体化する。
  6. 実行して動作を確認する:
    プロンプトを実行し、正しく動作するかどうかを確認する。
  7. 必要に応じて改良する:
    プロンプトの改良が必要な場合は、手順2〜6を繰り返し、問題を修正する。

このような手順を踏むことで、明確で一般化されたプロンプトを作成することができるでしょう。また、一般化することで、同じ構造の問題に対して同じ手順を適用することができ、プロンプトの作成や変更が容易になります。ただい、いきなりShunsuke Hayashi(林 駿甫)さんレベルにプロンプトデザインをやってのける事は難しいでしょう。
先ずは基礎から理解し、目的に応じて規模を拡大していくのが良いと思います。

さいごに。せっかく万能なプロンプトから出力された情報も必ず正しいとは限りません。以下の記事でChatGPTがつく嘘について解説していますので参考にしてみて下さい。

コメント

タイトルとURLをコピーしました