【完全保存版】OpenAIが教えるChatGPTからより良い結果を得るためのプロンプトのコツ

<table>
  <tr>
    <th>いまいちな例</th>
    <th>良い例</th>
  </tr>
  <tr>
    <td>Excelで数字を足す方法は？</td>
    <td>Excelでドルの金額が書かれた列を合計する方法は？全てのシートでこれを自動的に行い、合計は右側の「合計」列にまとめたい。</td>
  </tr>
  <tr>
    <td>大統領は誰？</td>
    <td>2021年時点でのメキシコの大統領は誰で、選挙はどのくらいの頻度で行われていますか？</td>
  </tr>
  <tr>
    <td>フィボナッチ数列のコードを書いて。</td>
    <td>TypeScriptで効率的にフィボナッチ数列を計算する関数を書いてください。各部分の役割や、なぜそう書かれているかについて、コメントを付けて詳しく説明してください。</td>
  </tr>
  <tr>
    <td>会議の議事録を要約して。</td>
    <td>会議の議事録を1段落でまとめてください。それから、スピーカーごとの主要な点をマークダウン形式のリストで記載してください。さらに、スピーカーが提案した次のアクションアイテムがあればリストにまとめてください。</td>
  </tr>
</table>


OpenAIの公式ページに、ChatGPTに使われているモデルである「GPT」を使う上でのベストプラクティスが公開されていました！

そこで、ここでは、そのベストプラクティス集を参考に、ChatGPTからより良い結果を得る方法を解説していきます！

原文を読みたい方は[こちらの記事](https://platform.openai.com/docs/guides/gpt-best-practices)をご覧ください！

以下の記事では、おすすめのChatGPTのプラグインを紹介しているので、こちらもぜひご覧ください。

https://generativeinfo365.com/?p=369

## 1.明確な指示を出す
ChatGPTは非常に優れたAIですが、さすがに私たちの考えを読み取ることはできません。

したがって、ChatGPTから希望する回答を得るためには、私たちの考えを詳細に伝えるために明確な指示を出すことが大切です。

OpenAIは、この「明確な指示」を出すための具体的なアドバイスを以下の6つのポイントで紹介しています。
1. 詳細な説明をする
1. ペルソナを設定する
1. デリミター（区切り記号）を使用する
1. 必要なステップを指定する
1. 例を挙げる
1. 出力の長さを指定する

### 1-1.詳細な説明をする
より適切な回答を得るためには、やって欲しいことや指示を詳しく説明する必要があります。

もし具体的な情報や背景が不足している場合には、モデルに解釈を任せることになり、適切な回答を得られないことがあります。

以下が、「ダメなプロンプト」の例と「良いプロンプトの例」です。

あなたは普段ChatGPTを使う時はどちらのプロンプトを書いているでしょうか？

もし左のようなプロンプトを書いている場合は、もしかしたらまだあなたはChatGPTの性能を半分も活かせていないかもしれません

<table>
  <tr>
    <th>ダメな例</th>
    <th>良い例</th>
  </tr>
  <tr>
    <td>Excelで数字を追加する方法は？</td>
    <td>Excelでドルの金額が入った行を合計する方法は？これをシート全体に対して自動的に行い、合計が右側の「合計」という列に集約されるようにしたい。</td>
  </tr>
  <tr>
    <td>大統領は誰ですか？</td>
    <td>2021年にメキシコの大統領は誰であり、選挙はどのくらいの頻度で行われるのですか？</td>
  </tr>
  <tr>
    <td>フィボナッチ数列を計算するためのコードを書いてください。</td>
    <td>効率的にフィボナッチ数列を計算するためのTypeScriptの関数を書いてください。各部分がどのような役割を果たしているのか、なぜそのように書かれているのかについては、コードにコメントをたくさん付けて説明してください。</td>
  </tr>
  <tr>
    <td>会議の議事録を要約してください。</td>
    <td>会議の議事録を1つの段落で要約してください。次に、スピーカーとそれぞれの要点をマークダウン形式のリストで書いてください。最後に、スピーカーが提案した次のステップやアクションアイテムがあればリストしてください。</td>
  </tr>
</table>

ここからはより具体的な例を参考に「ダメなプロンプト」と「良いプロンプト」、それぞれから得られるChatGPTの回答を比較してみましょう

#### ❌ダメな例

例えば、「フィボナッチ数列を計算するためのTypeScriptのコードを取得したい」と仮定しましょう。

この時のダメなプロンプトの典型は、「フィボナッチ数列を計算するためのコードを書いてください」というように、最低限の情報だけを含む簡単すぎる指示を出すことです。

![スクリーンショット 2023-06-06 19.07.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/97b403dc-a587-7529-e303-5f4036672468.png)
ChatGPTから得られた回答はパッと見は悪くはないですが、「フィボナッチ数列を計算するためのコードを書く」という指示に対して、最低限の情報しか得られない回答ですね。

また、ChatGPTに「コードを書いて」とだけ指示すると、Pythonのコードを返されることが多いので、今回の回答でもPythonのコードで回答されています。

#### ⭕️良い例

次に、より適切な回答を得るために、使用する言語を具体的に指定し、さらにコードの説明も要求してみます。

![スクリーンショット 2023-06-06 19.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/3f0ac528-d722-b367-adf3-b2d149277cf7.png)
こちらの指示通りに、TypeScriptでコードのコードサンプルと詳細なコメント、解説が付けられた分かりやすい回答が得られましたね！

このように、具体的な指示を出すことで、ChatGPTから得られる回答の質が大幅に向上します。

なので、より良い回答を得るためには可能な限り具体的かつ詳細に指示を出すことが重要です。


### 1-2. ペルソナを設定する
次に紹介する方法はChatGPTに役割を与える方法です。

プロンプトの中でChatGPTに特定のペルソナ（キャラクターや立場）を持たせることで、より一貫性のある回答を得ることが可能になります。

たとえば、「数学の専門家として解説してください」という指示を加えることで、数学に関連したより詳細な回答を得る可能性が高まります。

#### ❌悪い例
フィボナッチ数列について、分かりやすい説明をして欲しいとします。

まず、「フィボナッチ数列とは何ですか？」とシンプルに尋ねてみます。

![スクリーンショット 2023-06-06 19.05.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/c560ea99-3c6d-b720-7a16-9c3bc5d00213.png)
こちらの回答も悪くないですが、数学が嫌いな人にとってはもう少し簡単に説明してほしいですよね。

#### ⭕️良い例

次は、より分かりやすく説明してもらうために、「高校の教員」の立場から「高校生」に向けて説明してもらうように依頼します。

![スクリーンショット 2023-06-06 19.05.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/56319254-8d48-dc4f-64c1-ffc74b3c3691.png)

指示通り、高校生でも分かるくらい簡潔に説明してくれていますね！

逆に、より詳細に知りたい場合は、「数学の専門家」として回答してもらうことで、より深い情報を得られます。

このように、ChatGPTでより良い結果を得るためには、ChatGPTに様々な役割になりきってもらうことで、求める情報の深さや表現スタイルを調整することが可能です。

### 1-3.デリミター（区切り記号）の使用
複雑な指示を出すときには、デリミター（区切り記号）を使用して指示を明確にするのが有効です。

たとえば、次のように「三重引用符」等を用いて、要約してほしい部分を明確に指定することで、ChatGPTにどの部分を要約すべきかをはっきりと理解させることができます。

![スクリーンショット 2023-06-06 22.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/043197cf-0379-4264-b6ba-0fee6f98449f.png)

### 1-4. 必要なステップを指定する
複雑なタスクの場合、タスクを細かく分解して、ChatGPTにはそれぞれ順番に処理してもらうことでより良い結果を得ることができます。

#### ❌悪い例
例えば、「フィボナッチ数列の説明を英語で要約したい」とします。

この場合、良くないプロンプトの例は、英語への翻訳と要約を同時に求めるように指示することです。

![スクリーンショット 2023-06-06 22.16.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/930d0bdf-5909-e118-d326-a93fdf13bd78.png)
ご覧の通り、英語には翻訳されていますが、ほとんど要約されていないですね。

#### ⭕️良い例
そこで、より良い回答を得るためには、英語への翻訳と要約を別々のタスクとして提示し、それぞれを段階的に行うように指示する必要があります。

![スクリーンショット 2023-06-06 22.15.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/ae627fc6-b583-a10b-1a99-b65488d2a11c.png)
要約と翻訳をそれぞれ分けて行うことにより、文章がきちんと要約され、その後、要約された文章が英語へと翻訳されましたね！

このように2つ以上のタスクがある場合や、複雑なタスクを解決する場合は、ステップを分けて指示を出すことで、より良い回答を得ることができます。

### 1-5. 例を挙げる
単純にChatGPTに指示や質問をするだけでなく、具体例を例を挙げながら指示や説明を行うことで、モデルは情報をより具体的に理解しやすくなり、その結果、適切な回答を生成しやすくなります。

たとえば、いくつかのレビューとそれらの感情的評価をサンプルとして提示することで、他のレビューが否定的なものなのか、肯定的なものなのかをより正確に判断できるようになります。
![スクリーンショット 2023-06-07 19.31.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/47cdc0af-87d7-59bf-80b2-cca29e96b264.png)
### 1-6. 出力の長さを指定する
ChatGPTからの回答についてテキストの長さを指定することで、必要な情報を適切な範囲で収集することが可能となります。

#### ❌悪い例
例えば、「フィボナッチ数列についての説明を英語で要約したい」と考えているとしましょう。

この場合、適切でないプロンプトの例は、文字数を指定せずに要約を求めることです。

文字数を指定しない場合、要約の長さをChatGPTに一任することとなり、要約が過剰に長くなったり逆に短すぎたりする問題が起きる可能性があります。

![スクリーンショット 2023-06-07 23.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/da3171e6-1b5e-e443-79e3-c6d3c1fc2941.png)

#### ❌良い例

求める要約の精度を高めるためには、段落や文字数を指定することが非常に効果的です。

簡潔に要点をまとめてほしい場合は文字数を少なく指定し、より詳細な要約を希望する場合は文字数を多く指定することで、ChatGPTからの応答をある程度コントロールし、必要な回答を得ることができます。

![スクリーンショット 2023-06-07 19.50.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/7031a130-bbf6-78b2-8ff1-2317482a11bc.png)

## 2.参考文献を提供する
ご存知の通り、ChatGPTは知らないことや間違っていることでも自信満々に回答することがあります。

これを避けるための一つの方法は、参考文献を用いることで、回答の信頼性を確保する方法です。

具体的には、参考テキストに基づいて回答を要求する、または参考文献を引用して回答を要求するといった方法があります。

例えば、参考テキストに基づいて回答を得るためのプロンプトは以下のようになります。

```text
3つの引用符で区切られた文書と質問を提供します

あなたのタスクは、提供された文書のみを使用して質問に回答し、質問に回答するために使用した文書の一部を引用することです。
文書にはこの質問に回答するための情報が含まれていない場合は、単に"情報が不十分です"と記述してください。

質問に対する回答が提供される場合、それは引用と共に注釈を付けられなければなりません。
関連する部分を引用するための形式は以下の通りです（{"citation": …}）。

"""
文章
"""

質問：<質問文>

```

例として、フィボナッチ数列についての文章があり、その中から回答を探す場合を考えてみましょう。

フィボナッチ数列が日本人が発見したものかどうかを問う質問が出たとします。

この際、参考テキストに情報が含まれている場合には、正確な答えを提示し、また、その答えを裏付ける引用文も提示してくれます。

![スクリーンショット 2023-06-07 6.41.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/23c71a7f-e8b3-bad0-4f7b-cdb1afcf4788.png)


次に、参考テキストからは推測できないことを聞いてみます。

文章から推測できない質問に対しては、嘘の情報を提示するのではなく「情報が不十分です」という回答をしてくれていますね。

![スクリーンショット 2023-06-07 6.52.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/9d5da017-918c-f3a2-2d68-5b227fa860ca.png)

ChatGTPは時として信憑性のない回答を作り出すことがあるため、正確な情報を求める場合はこのように参考文献を提示することをおすすめします。


## 3.複雑なタスクを分割する
GPTは複雑なタスクを処理する際に、回答の精度が低くなることがよくあります。

そういった場合には、問題をいくつかの簡単な問題に分割し、一つずつ解いていくというアプローチが有効になります。

例えば、「フィボナッチ数列について1000文字の記事を書く」というタスクがあるとします。

これを一度に全て書かせるのではなく、まずは記事の全体的な構造を考えるように指示します。

プロンプトは次のようになります:

```
フィボナッチ数列についての1000文字の記事を書くための概要を提案してください。
```

![スクリーンショット 2023-06-07 7.04.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/94472998-f4ce-544a-bf3b-0e83739d6ff8.png)


そしてGPTから提供された概要に基づいて、記事の各部分を書くように指示します。これを一つずつ実行し、結果的には一つの完成した記事が得られることを目指します。

```
1. まずは序論について書いてください
```

![スクリーンショット 2023-06-07 7.05.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/925aaee7-f4df-576d-f55b-1e83328f3c0d.png)

GPTがこの部分について書き終わったら、次の部分について書くように指示します。

```
2. フィボナッチ数列の定義について書いてください
```

![スクリーンショット 2023-06-07 7.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/38d6e814-a506-ab90-2cda-a00f1a56ed25.png)


今回のケースだと、この作業を最後まで続けていき、記事を完成させていきます。

このように、大きなタスクを小さなタスクに分割して処理してもらうことで、ChatGPTが苦手な複雑なタスクに対しても精度の高い回答を得ることができます。

## 4.GPTに「考える」時間を与える
人間と同じように、ChatGPTにも考える時間を長く与えることで、より正確な答えを導き出すことができます

#### ❌悪い例
例として、「学生の数学の解答を評価するモデル」を考えてみましょう。

最も直接的な方法は、「学生の解答が正しいかどうか」をモデルに尋ねることにします。
![スクリーンショット 2023-06-07 22.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/8e56b1d4-c103-f1a8-f9f5-724346cbf3eb.png)
しかし、この直接的なアプローチでは、学生の解答が実際には「間違っている」のにも関わらず、ChatGPTは「正しい」と誤った判定をしてしまいました。

このように、ChatGPTが誤った結果を返してしまうことは決して稀なことではありません。

そのため、こういったChatGPTが間違えた回答をすることを防ぐためには、ChatGPTに自身で考える時間を与えることが大切です。

#### ⭕️良い例
次に、学生の解答の正誤を評価する前に、まずChatGPT自身に問題を解かせてみます。
![スクリーンショット 2023-06-07 22.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/f1e78d11-3695-fe22-bdc9-2d0e1bf1f159.png)
先ほどと違い、モデル自身が計算を行った結果、正しい答えを得ることができました。

このように、モデルが自身で問題を解くことで正しい答えにたどり着き、その上で学生の解答の正誤を評価することが可能となります。

このように、ChatGPTにも一度「考える」時間を与えることで、より正確な結果を得ることができます。

最後に宣伝です！

データサイエンティストのために、CahtGPTをはじめとした生成AIを使ってデータ分析を効率化する情報をまとめたサイトを運営しています！

生成AI×データ分析に興味がある人はぜひこちらも覗いてもらえると嬉しいです！！

https://generativeinfo365.com/