こんにちは!超生産性チャンネルの「やすまる」です!
このブログでは、仕事における生産性を格段に向上させる情報を発信しています!
今回は、ChatGPTから欲しい情報を引き出すための指示文、つまりプロンプトの作り方について説明します
プロンプトの基本を覚えれば、ChatGPTから効率的に欲しい情報を導き出すことができますので是非ご覧ください!
一言いうと、正直このブログが初心者向けのプロンプトエンジニアリングの学習においては、現状だと完全版かなと思っています
その理由としては、ここ2週間様々な記事や動画を見た上で自ら実行し、厳選してその結果をまとめているからです
ちなみに、今回説明する内容は、AIの研究プロジェクトであるDAIR.AIで作成されたプロンプトエンジニアリングガイドをベースにしています。
このプロンプトエンジニアリングガイドは、現状GPT3.0に関する論文がメインなので、今回そのプロンプトエンジニアリングガイドにChatGPT関連の要素を追加または、ChatGPTに合っていない部分は削除・変更しました
そして、それらを初心者向けに必要な部分のみを厳選し、今回まとめています
※DAIR.AIとは、AIの研究、開発、展開に対するビッグテック(GoogleやFacebookなどの技術系大企業を指す)の広範な影響に対抗するために設立された、独立したコミュニティに根ざす研究所
「ChatGPTに指示を出すための文章」を「プロンプト」と言いますが、
このプロンプトについてChatGPTが回答しやすい形で指示を作成・入力することを プロンプトエンジニアリングと言います
プロンプトエンジニアリングが上達することによって、ChatGPTがより効果的で正確な結果を返すようになり、ユーザーとしては求める情報を得やすくなります
例えば、週末の土日の日本国内の旅行の行先についてChatGPTに質問する場合
日本の有名な観光地を教えて

ざっくり聞く分には問題ないですが、これだと2日間という期間内に行ける場所以外も回答されます
また選択肢も多いので迷ってしまいます
なので、ChatGPTに対してより詳細に伝えることで求める回答を得やすくします
東京から1泊2日で行ける日本の有名な観光地ベスト3を教えて

このように指示文を変更することで、自分が求める情報の精度が向上します
これがプロンプトエンジニアリングです
プロンプトエンジニアリングの基本的な考え方
シンプルなプロンプトでも情報を得ることはできますが、結果の品質は提供する情報の「量」と「品質」によって異なります。
プロンプトエンジニアリングは、この提供する情報の量と質を如何に上げていくかが重要です
プロンプトの要素
プロンプトは「命令」「文脈」「入力データ」「出力指示子」の4つの要素で成り立っています
「情報の量」と言う観点でいうと、この4つの要素をしっかり入力することが重要で、漏れなく入力することでモデルを適切に指示し、より良い結果を得ることができます
- 「命令」=モデルに実行して欲しい特定のタスクや指示
- 「文脈」=「命令」に追加する条件や背景などの補足情報
- 「入力データ」=要約などにおける元となる文章や回答例など
- 「出力指示子」=出力タイプや形式
命令とは、ChatGPTに実行して欲しい特定のタスクやアクションを指示することです
例えば、「~の要約をしてください」「~について教えてください」「~を考えてください」などがこの命令にあたります
命令は、通常プロンプトの開始部分に配置され、命令をすることでChatGPTの達成したいゴールを明確にします
この命令が無いとChatGPTはゴールが分からず、何をすべきかの正確な判断ができず、勝手な判断で回答を返してきます
空が

ChatGPTが自動的に指示を推測して、空について説明してくれました
しかし、もう一度聞くと

詳細にお知らせくださいとの回答に変化しました
このように命令が明確でないと、ランダムで様々な回答が返ってきます
対して、命令文がある場合は
以下の続きとなる文章を完成させてください:
空が

何度実行しても「空が」に続く文章を作成してくれます
このように「命令」を与えたことで達成したいゴールが実現できます
文脈とは、「命令」に追加する条件や背景などの補足情報を指します
文脈を加えることでより指示内容が明確になり適切な回答結果が出やすくなります
以下の続きとなる「春の夕焼けについて語った」文章を完成させてください:
空が

この例で言うと「春の夕焼けについて語った」が文脈です
この文脈を追加することで、どのような空について文章を作成すべきかが明確になりました
結構便利なプロンプトとして、「あなたは~の専門家です」など役割を文脈として与えるとその領域の専門家として答えてくれます
入力データは、文章の要約や具体例を教えるときに追加します
出力指示子は、出力する文章のタイプや形式を指します
例えば「小学生でも分かるように」「100文字以内で」「表形式で」など
出力指示子を指定することで、テキストの構造や表現方法をコントロールすることができます
以下の続きとなる「春の夕焼けについて語った」文章を「村上春樹のような表現で」完成させてください:
空が

先ほどの文章に「村上春樹のような表現で」を加えることで、内容がより情緒的なりました
このようにプロンプトは基本「命令」「文脈」「入力データ」「出力指示子」の4つの要素で成り立っているということをここでは覚えておいてください
この4つを工夫することで、欲しい情報が得やすくなります
プロンプトの品質
プロンプトの品質のという観点で言うと以下のポイントを意識する必要があります
- 曖昧ではない具体的かつ明確な文章
- 誤解を招かない詳細な説明
例えばChatGPTについて説明を求める場合
ChatGPTについて、"読みやすく多すぎない文字数"で説明してください
↑「読みやすく多すぎない文字数」どの程度の文字数か不明
ChatGPTについて、"200文字以内"で説明してください
↑「200文字以内」と文字数が明確
例えば「ワンピース」について説明を求める場合
「ワンピース」について説明してください
↑どの「ワンピース」を意味しているか不明、漫画?洋服?
「ワンピース」について説明してください
↑補足情報によって「洋服のワンピース」であると意味が明確
ここからは、プロンプトエンジニアリングの基本的なテクニックについてお伝えします
プロンプトエンジニアリングの基本的な考え方は、シンプルなプロンプトから始めて段階的に情報を追加し、回答の精度を上げていくことです
それを表すと主なステップは以下の4ステップです
- Zero-Shotプロンプティング
- Few-Shotプロンプティング
- Chain-of-Thoughtプロンプティング
- Zero-Shot CoTプロンプティング
Zero-Shotプロンプティング
Zero-Shotプロンプティングとは、回答例を与えずChatGPTから回答を得るテクニックです
例えば、「東京の観光名所を教えてください」「おもしろいアクション映画を教えてください」などがZero-Shotプロンプティングです
皆さんが入力しているプロンプトの多くはこのZero-Shotプロンプティングだと思います
ChatGPTが「すごい」と言われている理由の一つが、このZero-Shotプロンプティングの驚くべき能力で、ユーザーが丁寧に指示しなくても、自動的に推察して回答してくれます
例えば、「東京の観光名所を教えてください」と聞くとこのように回答が返ってきます
東京の観光名所を教えてください

通常、「東京の観光名所を教えてください」という質問に対しては、単語で「浅草」「秋葉原」「渋谷」のように場所のみで回答されるところをChatGPTでは地名に加えてその場所の情報も補足して教えてくれます
人間に聞く場合でも普通は「地名」のみが多い思います
気の利く人だと「その理由」を追加して教えてくれますが、ChatGPTはそのレベルで回答ができるということです
これすごいですよね!
Few-Shotプロンプティング
Few-Shotプロンプティングとは、いくつかの回答例を与えて指示を出し、その例に沿った形でChatGPTから回答を得るテクニックです
先ほどZero-Shotプロンプティングで説明したようにChatGPTは気を聞かせてたくさんの情報を出してくれます
そのことで逆に説明が冗長的になったり、複雑になったりします
なので、いくつかの回答例を与えることでChatGPTが学習し、欲しい形式で回答を得ることができます
言い換えれば、ChatGPTの学習をユーザーが手助けしながら指示するということです
新宿の説明を以下のように表現してください
渋谷:若者の街
巣鴨:お年寄りの街
秋葉原:オタクの街

これが、Zero-Shotプロンプティングだと新宿の説明は以下のように200文字以上の長い文章で返ってきます

このように回答例を与え、欲しい形で回答を得る方法をFew-Shotプロンプティングといいます
Chain-of-Thoughtプロンプティング
Chain-of-Thought(CoT)プロンプティングは、複数のプロンプトを連鎖的に実行することで、より複雑なタスクを解決するプロンプトエンジニアリングのアプローチです。
具体的には以下のような形での対応です
日本の主要観光地はどこですか?

京都でのおすすめ観光スポットはどこですか?

金閣寺へのアクセス方法を教えてください

この方法では、ChatGPTは一連のプロンプトを順番に処理し、各ステップで得られた出力を次のステップの入力として使用します。
これにより、AIモデルは複数の小さなタスクを組み合わせて、最終的な目標を達成することができます。
対して、1回で最終目的まで実行しようとすると以下のようになります
日本の主要観光地、その観光地でのおすすめの観光スポット、観光スポットへのアクセス方法、そして観光地でのおすすめの宿泊施設について教えてください。

ChatGPTはこのプロンプトに対して一度に回答できますが、回答が簡潔になり、それぞれの質問に対して十分な情報が得られないことがあります
なので、複数回の質問を重ねた方がより詳細な情報を得ることが可能です
Zero-Shot CoTプロンプティング
これは最初に説明したZero-Shotプロンプティングと前段で説明したCoTプロンプティングこの2つを組み合わせた方法です
これは、最初のプロンプトの最後に「指示に対してステップバイステップで答えてください」この一文を加える方法です
この一文を加えると何がいいのか具体例を用いて説明します
飲食店の売り上げを上げる方法を教えてください

飲食店の売り上げを上げる方法を教えてください。指示に対してステップバイステップで考えてください。

このように「指示に対してステップバイステップで考えてください」という指示を加えることで
飲食店の売り上げをあげる方法について、いきなり打ち手を提示するのではなく、考え方の手順を示してくれます
この回答はコンサルタントが一般的に行う考え方に近くまず最初に目的と現状理解をしっかり行うことで、どの打ち手が最も効果的なのかが判断できます
逆にこれをせずいきなり打ち手から始めてしまうと全く効果のない打ち手ばかり実行してしまい結果に結びつきません
このようにステップバイステップでという風にChatGPTに質問する、思考プロセスを手順化してくれるので、自分が達成したいゴールに近づきやすくなります
手順が示された後は、この手順それぞれに対してCoTで1つずつプロンプトを実行していき、詳細を確認するのが良いです
大前提としてChatGPTから出力される回答はいつも同じものではありません
欲しい情報が一発で返ってくるときもあれば、何度やってもなかなか返ってこないときもあります
この理由を詳しく説明すると、ChatGPTから出力される回答がある程度ランダムになるように、ランダム性を操作するtemperatureなどの内部的な値が決まった値、つまり固定値で設定されています
なので、このランダム性をシステム的に操作することはできません
しかし、プロンプトを工夫することでChatGPTからの回答をなるべくコントロールする方法はあります
一貫性 or 多様性をコントロール
ランダム性を完璧に排除できないが、「具体的かつ明確な質問」「 回答の制約」を設けることで 一貫性を向上することができる
例えば
東京観光のおすすめの観光スポットを1つ教えてください
観光スポットの条件は
・千年以上の歴史がある建物で日本独自の文化が堪能できる
・インスタ映えする
・交通機関が整っていて行きやすい
・休憩できる場所もある

このプロンプトだと、おすすめの観光スポットは、ほぼ100%の確率で「浅草」が出てきます
説明理由の文章は毎回異なりますが、観光スポットは同じです
このように条件を具体的にすることで、一貫性を向上させることが可能です
逆に、「異なる視点から考えてください」や、「より創造的なアプローチで回答してください」といった指示与えることによって多様性のある回答を得ることができる
例えば先ほどのプロンプトの最後に「他の人が行かない場所をユニークな視点で考えてください」と追加します
東京観光のおすすめの観光スポットを1つ教えてください
観光スポットの条件は
・千年以上の歴史がある建物で日本独自の文化が堪能できる
・インスタ映えする
・交通機関が整っていて行きやすい
・休憩できる場所もある
他の人が行かない場所をユニークな視点で考えてください

このように「浅草」以外の観光スポットがおすすめされました
このプロンプトで複数回実行しましたが都度違う観光スポットがおすすめされました
少しずつ試行錯誤
基本的な考え方として、「シンプルなプロンプトから始めて段階的に情報を追加し、回答の精度を上げていく」とお伝えしましたが、この考え方が重要なので改めてお伝えします
いきなり高度なプロンプトを作成して実行しても、自分が欲しい回答が返ってこなかった場合、どの部分を修正すべきかが分からなくなります
なので、まずはZero-shotプロンプティングから始めて、徐々に出力条件や入力データなどを追加しながら試行錯誤を積み重ねて精度を上げていくことが大事です
それを何度も繰り返していくと、ある程度コツが掴めてきますので、慣れてきたら高度なプロンプトから始めても問題ないです
作成したプロンプトを他のケースでも使用したいことってありませんか?
そのようなケースに対して、プロンプトをテンプレート化しましょう!
テンプレート化の重要性
プロンプトをテンプレート化するメリットは以下の点です
- 再利用性の向上
- 品質の確保
- 保守性と柔軟性の強化
作成したプロンプトを整理してテンプレート集のような形でまとめておくことで、同じようなケースでプロンプトを実行したい場合、そのテンプレート集から取り出し、簡単に再利用ができます
そうすることで、新たなプロンプトを作成する時間と労力を減らすことができます
テンプレート化することで、ChatGPT出力形式を一貫した形式やスタイルで実行することができます。
これにより、ChatGPTから得られる結果の品質を一定のレベルに保つことができます
例えば、映画評価テンプレートのプロンプトの場合
あなたは映画評論家です。以下のテンプレートに従って映画の評価をしてください
[評価対象作品]
バックトゥザフューチャー
[プロンプト]
映画タイトル: {movie_name}
評価: {rating}/10
レビュー要約: {review_summary}

ちゃんとテンプレートに沿った形で評価されました
別の作品でも実行してみます
あなたは映画評論家です。以下のテンプレートに従って映画の評価をしてください
[評価対象作品]
ジュラシックパーク
[プロンプト]
映画タイトル: {movie_name}
評価: {rating}/10
レビュー要約: {review_summary}

こちらもテンプレートに沿った形で評価されました
このようにテンプレート化することで欲しい形で出力されます
ここで言う保守性と柔軟性とは、どのような意味かというと
保守性⇒テンプレートの管理を簡単にすること
柔軟性⇒テンプレートの修正を簡単にして、様々な用途に活用できるということ
という意味です
では、なぜテンプレート化すると保守性と柔軟性が強化されるのか?
それはプロンプトに「変数」を用いるからです
変数を用いたプロンプト
簡単に説明すると、変数とは情報を入れる「箱」のようなものです
過去に中学生の数学で「y=x+2」のような一次関数を習ったことがあると思います
その一次関数のxの部分の数字をx=1,2,3…のように変えると、yの値がy=3,4,5…と変わりましたよね
この変更する値、xの部分が変数です
このxに入る値が、プロンプトの場合は数字じゃな様々な言葉が入ります
例えば、Cityという変数を用いたプロンプトの場合
{city}に関するおすすめの観光スポットを教えてください。
[変数]
city: 東京

このプロンプトの最後の文の「city:東京」の「東京」の部分を「京都」や「大阪」に変えると実行されるプロンプトが変わり、入力した地名での観光スポットを提供してくれます
この例だと変数の数が一つしかないので、変数にするメリットが少ないですが
もう少し複雑なプロンプトにする場合
{city}に関するおすすめの{category}を教えてください。
また、{city}で買うべき{item}も教えてください。
[変数]
city: 東京
category: 観光スポット
item: 食べ物

このようなプロンプトにすれば[変数]の”city”,”category”,”item”を変更するだけで、様々なパターンのプロンプトが自由に実行できます
例えば、以下のように変数を変更します
{city}に関するおすすめの{category}を教えてください。
また、{city}で買うべき{item}も教えてください。
[変数]
city: 京都
category: 歴史的な建物
item: お土産
{city}に関するおすすめの{category}を教えてください。
また、{city}で買うべき{item}も教えてください。
[変数]
city: 沖縄
category: レストラン
item: お菓子
前段のプロンプトの「保守性と柔軟性の強化」についての説明に戻りますが
このように「変数」を用いることで、プロンプトを個別に「東京」バージョン「京都」バージョンのように複数のプロンプトで管理する必要が無くなり、一つのテンプレートを保存しておくだけでいいので、管理が簡単になります
また、「変数」を変更するだけで柔軟にプロンプトを変更できるので、柔軟性も向上します
テンプレート化まとめ
改めて説明するとテンプレート化することで、以下の3点が実現でき、ChatGPT活用が促進します
- 再利用性の向上
- 品質の確保
- 保守性と柔軟性の強化
これを参考にみなさんも様々なテンプレートを作成してみてください!
ここまで技術的な面の話をしてきました
ですが、プロンプトエンジニアリングを上達させるためにはマインド面も重要なので少しこの点について説明させてください
人に指示を出すのに似ている
チャットGPTに知識を出すのは人に指示を出すことに似ています
皆さんは会社の部下や後輩に作業依頼をした時、自分の意図とは違った作業をされた経験はありませんか?
これは指示された部下や後輩が悪いのではなく、指示した人の指示内容が悪いため起きてしまうことが大半です
「当然◯◯するのが当たり前」「なんで◯◯していないの?」など
指示した人の立場からすると当然のことでも相手からすると当然ではありません
なので、指示を与える時はしっかり情報を相手に共有することが重要です
また、間違った対応された時にそれに対して怒りの感情をぶつけても何も解決しません
相手が間違った対応した場合は、「間違った対応した原因の追求」とそれに対して「フィードバックを行い対応を正しく指示」してあげる必要があります
ChatGPTも同様に「しっかり情報を与えて」ください
そして、欲しい回答出ない場合は「原因の追究」を行い「フィードバック」をしてあげてください
「原因を追究」することで、ChatGPTの思考プロセスが理解でき、それをベースに「正しくフィードバック」をしてあげると欲しい回答が得やすくなります
諦めないことが大事
ChatGPTを使う上で最も重要なマインドセットが「諦めない」ということです
ChatGPTが使えないという風に考えてる人の多くは、最初に少し使って自分の欲しい回答が返ってこなかったのでそのように判断している場合が多いです
1回の指示でChatGPTがその指示に上手く答えられないとしても、ChatGPTへの質問方法を工夫することで、最初答えられなかった指示でも最終的には答えることができる場合が結構あります
なので、試行錯誤しながら根気強く取り組んみてください!
参考までにChatGPTを使う上での小技をお伝えします
音声入力を活用する
ChatGPTに指示を与える時は音声入力で指示を与えると時間短縮になって便利です
ChatGPTは対話型AIなので、会話しているような口調の文章でもちゃんと正しく認識して処理をしてくれます
例えば、以下のような音声入力でChatGPTに入力している最中に間違えて指示を出してしまい、訂正するようなプロンプトを実行してみます
東京の観光名所を教えてくださいあー違う違う京都の観光名所でした

「あー違う違う」で、前の指示をキャンセルして、その後の指示を正しく実行してくれています
CoTプロンプティングのように連続して指示を与えながら情報を深掘っていく時にわざわざに手入力していると時間がかかるので、音声入力はかなり便利です!
音声入力の仕方
音声入力の方法は、パソコンにあらかじめ備わっている機能を使う方法、ブラウザに拡張機能を追加して使う方法の2つがあります
Windowsロゴキー+Hを押します
すると、音声入力のツールバーが立ちあがるので、そのまま話せば入力できます
Macで、アップルメニュー >「システム設定」と選択し、サイドバーで「キーボード」 をクリックします。(下にスクロールする必要がある場合があります)
右側で「音声入力」に移動してから、オンにします。確認を求めるメッセージが表示されたら、「有効にする」をクリックします
Controlキーを2回連続押すと、音声入力のツールバーが立ちあがるので、そのまま話せば入力できます
Chromeで「拡張機能」と検索し、一番上に出てきた「ウェブストア」のサイトを開きます
ウェブストア内の検索バーから「Voice in」と検索します
検索すると「Voice in」の拡張機能が表示されるので「chromeに追加」を押します
後は指示に従ってステップを実行していくと拡張機能に追加されます
使うときは、Alt+Lを押せば、正入力が可能となるのでそのまま話せば入力できます
英語で入力
英語でプロンプトを書くメリットは以下の二つです
- 回答の精度が高い
- 一度に長い文章を入力また出力できる
ChatGPTの学習データの多くは、英語の文章で書かれたテキストデータなので、英語で指示を出した方が正しい回答を得やすくなります
とは言え英語を書き慣れていない私たちが英語で文書を作成するのは少し大変です
なので私の場合一旦日本語でプロンプトを作成して、DeepLのような翻訳サービスを活用して英語に翻訳し、それをChatGPTに入力しています
また、ChatGPTに入力可能な文字数も英語の方が多いです。
ChatGPTに入力できる上限の文字数はトークン数という単位で計算されており、無料版のChatGPTだと上限は2,048トークンです(OpenAI社のサイトより)
そして、そのトークン数は英語、日本語で異なり、英語だと1トークンは約4文字、日本語だとひらがな・カタカナで1トークン約0.5~1文字(1文字=1~2トークン)、漢字0.3~0.5文字(1文字=2~3トークン)のようです
どのようにトークン数を計算しているかは公開されていないため正確には分かりませんが、例えば以下の文章のトークン数をOpenAI社のTokenizerを使って見てみると
英語の”How are you”が合計3トークン
日本語の”元気ですか”が合計7トークンでした
このように英語を活用することによって、日本語以上の精度を出すことができるので、状況に合わせて英語で書いてみるのもよいと思います
プロンプトエンジニアリングの要点
プロンプトエンジニアリングの要点は以下です
- ChatGPTが回答しやすい形で指示を作成・入力することを プロンプトエンジニアリングという
- プロンプトの結果の品質は、提供する情報の「量」と「品質」によって異なる
- 「命令」「文脈」「入力データ」「出力指示子」の4つの要素で成り立つ
- プロンプトの品質を上げるためには、具体的かつ詳細に過不足なく情報を入力する
- 回答の精度上げるには、シンプルなプロンプトから始めて試行錯誤しながら、段階的に情報を追加する
- プロンプトを効率的に開発するためには、変数を使いテンプレート化して整理しておくことが重要
- ChatGPTを使いこなすためには、諦めないことが大事
参考サイト
OpenAI API を使用した迅速なエンジニアリングのベスト プラクティス