【初心者向け】基本的なプログラミング思考で精度が上がるChatGPTのプロンプトの作り方

この記事は[**Ateam LifeDesign Advent Calendar 2023 シリーズ3**](https://qiita.com/advent-calendar/2023/ateam-life-design) の 1日目の記事になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/d6289a6f-0e62-231d-8853-16c8644974aa.png)
※この画像は本記事を元に DALL-E 3 で生成されたものです

[株式会社エイチームライフデザイン](https://life-design.a-tm.co.jp/)の @kopug です。

ChatGPTを含めた生成系AIは、技術界隈だけでなく、さまざまな業界で広く注目を集めています。
周りを見渡しているとそれを使いこなしている人もいれば、まだそこまで使えていない人もいると思います。
今回は初心者けに、プロンプトを書く上で基礎的なノウハウをまとめてみました。

求めていることをそのままプロンプトに書くだけでも一定の結果を返してくれますが、質問者（自分）の意図に合った役割を設定し、入力と出力を定義し、前提条件に応じて結果を求める事で遥かに結果の精度が上がっていきます。
プログラミングの経験がある方ならこれをみてピンと来るものがあると思います。関数(function)を作る時と同じです。

この記事ではプログラミングの経験が無い方向けに、プログラミング思考のエッセンスを取り入れてプロンプトを書くことで、ChatGPTをこれまでよりも扱いやすいものにするためのノウハウを紹介しています。


## 明確な目的と出力の定義
プログラミングにおける関数とChatGPTのプロンプトは、明確な目的と出力を持つという点で共通しています。関数は特定の入力に基づいて特定の出力を生成するよう設計されており、ChatGPTのプロンプトも同様に、ユーザーからの特定の入力（質問やコマンド）に対して、関連性の高い情報や応答を出力します。

料理に例えると、レシピ（関数）は必要な材料（入力パラメータ）とその量を指示します。例えば、ケーキを焼くレシピでは、卵、小麦粉、砂糖の量が指定されています。これらの材料と量（入力パラメータ）によって、ケーキ（出力）の味や大きさが決まります。材料の量を変えれば、ケーキの出来栄えも変わるのと同じように、プログラミングにおいても、関数に渡す入力の種類や量によって、その結果（出力）が変わってきます。したがって、何を、どれだけ入力するかを正しく理解することが、期待通りの結果を得るために重要です。

効果的なプロンプトは、ユーザーの質問に対する直接的かつ関連性の高い応答を目指すべきです。以下にプロンプトの例を書きます。

```sample pronpt
貴方は優秀な翻訳家です。
以下の日本語を英語に訳して出力してください。
----
基本的なプログラミング思考で精度が上がるChatGPTのプロンプトの作り方
----
またなぜそのように翻訳したのかを説明してください。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/c8f6bbd5-400a-0f04-86bf-d369addeb25b.png)


## パラメータと引数
プログラミングの世界において「パラメータ」と「引数」は、関数や命令が適切に動作するために必要な情報を指します。これをChatGPTのプロンプト作成に当てはめて考えると、プロンプトにおけるキーワードや条件がパラメータや引数に相当します。このセクションでは、この概念をより理解しやすい形で解説し、効果的なパラメータと引数の設定方法を見ていきます。

### プロンプトと関数の引数の比較
プロンプト作成では、ユーザーが特定の情報を求める際に使用するキーワードや条件を設定します。これらはプロンプトの「パラメータ」と考えることができ、プログラミングの関数における「引数」と同じ役割を果たします。たとえば、レストランの予約システムにおける「日時」と「人数」という入力情報は、予約を処理する関数の引数として機能します。同様に、ChatGPTに特定の情報を求める際に「日時」や「人数」などの具体的な情報をプロンプトに含めることで、より精度の高い回答を得ることができます。

### 効果的なパラメータと引数の設定方法
効果的なパラメータや引数を設定するには、以下の点を考慮することが重要です：

1. **明確性**：入力するパラメータや引数は、明確で理解しやすいものである必要があります。あいまいな情報や不完全なデータは、正確な結果を得るのを困難にします。
2. **関連性**：パラメータや引数は、求める結果や回答と直接関連しているべきです。関連性が低い情報は、役に立たない結果を引き起こす可能性があります。
3. **簡潔性**：必要な情報のみを提供することで、プロセスを効率化します。余分な情報は、処理の複雑さを増やし、時には誤った結果をもたらすことがあります。

このように、プロンプトのキーワードや条件、関数の引数を効果的に設定することで、より精度の高い結果を得ることが可能になります。これは、ChatGPTのプロンプト作成だけでなく、一般的なプログラミングやデータ処理においても同様の原則が適用されます。

以下に消費したい食材と食事をとる人数をパラメータにしレシピを出力するプロンプト例を示します。
```
あなたは料理研究家です。毎日の献立を支えるためのサポートをしてもらいたいです。

・メインで使いたい食材は白菜
・人数は2人です

上記以外に必要な情報があれば教えてください。
これらの情報を元にレシピを提案してください。
またレシピには分量も記載してください。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/774b370c-0047-7c04-ceb3-b15605400248.png)

## 出力フォーマットを定義する

プログラミングおよびChatGPTのプロンプト作成において、出力フォーマットを定義することは、情報が整理され、予測可能な形で提供されます。出力フォーマットを事前に定義することで、応答の一貫性と理解しやすさが向上しますので、サンプルにあるように記事作成のサポートを求める場合や、特定のフォーマットで議事録を作ってもらいたい場合等に有用です。今回はフォーマットを作成する上で決まった構文を繰り返すループも加えております。

サンプルプロンプト例
ChatGPTでは直接的なプログラミングのループ構文を使用することはできませんが、繰り返しの要求を反映したプロンプトを作成することは可能です。以下にその例を示します。

```
以下のテーマのブログ記事のための5つの異なるセクションを作成してください。各セクションは以下のフォーマットに従ってください：

テーマ：継続してBlogを書き続ける方法

h1. [記事タイトル]

[導入文]

{{以下のh2 ブロックを繰り返してください}}
h2. [見出し]
   [関連する内容]

h2.  [結論]
　[本記事の結論]

上記のフォーマットで骨子を作成してください。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34731/642c3d76-7344-d76d-2ac4-bb34326733da.png)

このプロンプトは、一定のフォーマットに従った繰り返しの要求を示しており、ChatGPTに対してそれぞれ異なる内容を含む複数のセクションを作成するよう指示しています。これにより、繰り返し処理のような効果を得ることができますが、プログラミングのような動的なループ処理とは異なります。

## まとめ
- ChatGPTに期待する明確な役割（ロール）を定義し、求める結果を出す上で必要な情報をパラメーターとして渡し、出力フォーマットを定義し、欲しい情報を扱いやすい形にすることで、自身が求める結果に近づいていくプロンプトが作りやすくなります。
- MyGPTsなどでカスタマイズされたChatbotを作る場合は、役割（ロール）を可能な限り詳細に入れることで、対話をする際のレスポンスの精度が向上していきます。