ChatGPTのパワーを最大限に引き出す！「Prompt Engineering Guide」をわかりやすく解説

## はじめに
ChatGPTとの対話をより質の高いものにするには、適切なプロンプト（入力文）の設定が非常に重要です。しかし、その方法がわからないという方も多いのではないでしょうか？そんな方々のために、「Prompt Engineering Guide」というガイドが存在します。今回はこのガイドの内容を、初心者にもわかりやすく要点を抜粋して解説いたします。ChatGPTの真の能力を引き出すためのノウハウを共に学んでいきましょう！

## 1. Prompt Engineering Guideの概要
「Prompt Engineering Guide」は、AI研究に取り組む海外コミュニティである「DAIR.AI」によって無料公開されているものです。このガイドでは、GPTをはじめとする大規模言語モデルを利用する際に、適切な出力を得るためのプロンプトについて海外の論文等も出典としながら解説されています。
今回はこの「Prompt Engineering Guide」の内容の内で、ChatGPTを利用する際に応用可能な情報を簡潔にまとめていきます。
こちらで日本語版も公開されていますので、気になる方は元のガイドもチェックしてみてください。なお、こちらのnoteで紹介する具体例はいずれも以下のページから抜粋しています。

https://www.promptingguide.ai/jp

## 2. ChatGPTは確率で喋る−プロンプトエンジニアリングの重要性とは
LLM（大規模言語モデル）は、与えられた文脈に基づいて、その続きとなる文字列を確率的に生成します。例えば、「空が」という文章の次には「青い」「綺麗」といった文言が続く確率が高いでしょう。
この、モデルの出力は、指示や質問、文脈、入力など様々な情報によって左右されます。
そのため、望む出力を得るためには、これらの要素を適切に利用し、候補を絞って出力の確率を上げることが重要となります。これを実現するアプローチの一つがプロンプトエンジニアリングで、これによってモデルに適切な指示を出し、より良い結果を得ることができます。

## 3. プロンプトエンジニアリングの基本
### プロンプトの要素
プロンプトは一般に質問や指示の形を取ります。これらはモデルに実行すべき特定のタスクを伝えるためのものです。
さらに、プロンプトは以下の要素を含むことがあります。

命令：モデルに実行してほしい特定のタスクや行動
文脈：モデルをより適切な応答に導くための追加情報や背景
入力データ：モデルに応答を見つけてほしい特定の入力や質問
出力指示子：出力のタイプや形式を示すもの

これらすべてが必要というわけではなく、どの要素を用いるべきかは特定のタスクによって変わります。
プロンプトエンジニアリングの本質的な部分は、モデルの出力を最適化するためにこれらの要素をどのように組み合わせるかにあります。それには、モデルがどのように動作するか、どのようにプロンプトを解釈するかについての理解が必要となります。

### プロンプト設計に関する一般的なヒント
ここでは、プロンプトを考える際に一般的に役立つ情報をまとめます。

モデルに達成したいことを指示するために、「書く」「分類する」「要約する」「翻訳する」「並べ替える」などのコマンドを使用することが有効です。このような指示はプロンプトの最初に配置し、指示と文脈を区切るために「###」のような明確な区切り記号を使用することが有効です。

[良い例]
プロンプト：
```
### 指示 ###
以下のテキストをスペイン語に翻訳してください。
Text: "hello!"
```
出力：
```
¡Hola!
```
その上で、プロンプトの設計には以下の要点が重要であるとされています。

#### ・具体的かつ詳細な指示を出す
モデルに実行してほしい指示やタスクについて非常に具体的に説明することが推奨されています。プロンプトが詳細で具体的であればあるほど、結果は良くなります。

[良い例]
プロンプト：
```
以下のテキストから場所の名前を抽出してください。
望ましいフォーマット：
Place: <comma_separated_list_of_company_names>
入力：「これらの進展は研究者にとって励みになっていますが、まだ多くのことが謎のままです。リスボンのシャンパリマウド・センター・フォー・ジ・アンノウンの神経免疫学者であるヘンリーク・ヴェイガ・フェルナンデスは、「脳と周辺部で見られる効果の間にはしばしばブラックボックスがあります」「治療的な文脈で使用したい場合、実際には作用機序を理解する必要があります。」」
```
出力：
```
Place: リスボンのシャンパリマウド・センター・フォー・ジ・アンノウン
```

#### ・「〜しない」を避ける
プロンプトを設計する際には、「しないこと」を言わず、「すること」を言うことが推奨されています。これにより、より具体的になり、モデルから良い回答を得るための詳細に焦点が当てられます。

[悪い例]
プロンプト：
```
以下は、顧客に映画を推薦するエージェントです。興味を尋ねないで、個人情報を尋ねないでください。
顧客：私の興味に基づいて映画をお勧めください。
エージェント：
```
出力：
```
はい、あなたの興味に基づいて映画をお勧めできます。アクション、コメディ、ロマンス、それともその他の何か、どのような映画がお好きですか？
```
[良い例]
プロンプト：
```
以下は、顧客に映画を推薦するエージェントです。エージェントは、上位のグローバルトレンド映画から映画をお勧めする責任があります。ユーザーの好みを尋ねることを避け、個人情報を尋ねることを避ける必要があります。エージェントがおすすめ映画を持っていない場合は、「申し訳ありませんが、今日お勧めする映画が見つかりませんでした。」と返答する必要があります。
顧客：私の興味に基づいて映画をお勧めください。
エージェント：
```
出力：
```
申し訳ありませんが、あなたの興味に関する情報はありません。しかし、ここに今一番トレンディーな映画のリストがあります：[リストの映画]。お好きなものが見つかることを願っています！
```

## 4. プロンプトエンジニアリングの応用テクニック
ここからは、応用的なプロンプトについて、いくつかの手法をご紹介します。

### Few-Shotプロンプティング
大規模言語モデルを用いて複雑なタスクを実行するには工夫が必要となります。その1つとして挙げられるテクニックがFew-Shotプロンプティングで、プロンプト内でいくつかのデモ（例）を提供するものです。（これに対してデモを提供せずに行うプロンプティングを、Zero-Shotプロンプティングとよびます。）

[良い例]
プロンプト：
```
「whatpu」とはタンザニア固有の小さくて毛皮のある動物です。「whatpu」という言葉を使った文の例は次のとおりです。
私たちはアフリカを旅行して、これらのとてもかわいいwhatpusを見ました。
「farduddle」というのは、とても速く上下にジャンプすることを意味します。 「farduddle」という言葉を使用した文の例は次のとおりです。
```
出力：
```
私たちは試合に勝ったとき、みんなfarduddleをして祝いました。
```

[良い例]
プロンプト：
```
これは素晴らしい! // ポジティブ
これは酷い! // ネガティブ
あの映画は最高だった! // ポジティブ
なんてひどい番組なんだ! //
```
出力：
```
ネガティブ
```

### Chain-of-Thought(CoT)プロンプティング
先ほどご紹介したFew-Shotプロンプティングだけでは不十分なタスクも存在します。例えば、複雑な推論を伴うようなタスクがこれに該当します。
具体的には以下の例が挙げられます。

[悪い例]
プロンプト：
```
このグループの奇数を合計すると偶数になります：4、8、9、15、12、2、1。
A: 答えはFalseです。
このグループの奇数を合計すると偶数になります：17、10、19、4、8、12、24。
A: 答えはTrueです。
このグループの奇数を合計すると偶数になります：16、11、14、4、8、13、24。
A: 答えはTrueです。
このグループの奇数を合計すると偶数になります：17、9、10、12、13、4、2。
A: 答えはFalseです。
このグループの奇数を合計すると偶数になります：15、32、5、13、82、7、1。
A:
```
出力：
```
答えはTrueです。
```
このように、4つものデモを与えているにも関わらず間違った出力がなされています。

このような場合に役に立つのがChain-of-Thought(CoT)プロンプティングです。Chain-of-Thoughtプロンプティングは、中間的な推論ステップを介することで複雑な推論能力を実現する、というものです。

[良い例]
プロンプト：
```
このグループの奇数を合計すると偶数になります。: 4、8、9、15、12、2、1。
A: 奇数を全て加えると(9, 15, 1)25になります。答えはFalseです。
このグループの奇数を合計すると偶数になります。: 15、32、5、13、82、7、1。
A:
```
出力：
```
奇数を全て加えると(15, 5, 13, 7, 1)41になります。答えはFalseです。
```
ここではFew-ShotプロンプティングとChain-of-Thoughtプロンプティングを組み合わせた例を紹介しましたが、場合によってはZero-ShotプロンプティングにおいてもChain-of-Thoughtプロンプティングは適用可能です。その場合、「ステップバイステップで考えてみましょう。」のような文言を追加することでChain-of-Thoughtプロンプティングを実現します。

[良い例]
プロンプト：
```
私は市場に行って10個のリンゴを買いました。隣人に2つ、修理工に2つ渡しました。それから5つのリンゴを買って1つ食べました。残りは何個ですか？
ステップバイステップで考えてみましょう。
```
出力：
```
最初に、10個のリンゴから始めました。
隣人と修理工に合わせて、リンゴを2つずつ渡し、残りは6個になりました。
次に、5つのリンゴを買い、11個になりました。
最後に、1つのリンゴを食べたため、残りは10個になります。
```

## 5. まとめ
今回はPrompt Engineering Guideの内容のうち、ChatGPTに応用できそうなものを抜粋してお届けしました。
最後に、要点をまとめます。

- プロンプトの要素を区切る
- 具体的かつ詳細な指示を出す
- 「〜しない」を避ける
- Few-Shotプロンプティング
- Chain-of-Thoughtプロンプティング

ここまでお読みいただきありがとうございました。
ぜひこれらの内容を参考にして、より良いChatGPTライフを送りましょう！

---
NOVEL株式会社では、業務委託パートナーを募集しています。AIやLLMに興味があるエンジニアやPMの方、大歓迎です。副業としてでも問題ありませんので、ご興味を持たれた方はぜひこちらのフォームよりご応募ください。

https://forms.gle/P7JmYGFVrit1R8kH9