ChatGPTプロンプトエンジニアリングのコツ8箇条～OpenAI公式のベストプラクティスから学ぶ～

# はじめに

OpenAI API (ChatGPT含む) のプロンプトエンジニアリングのベストプラクティスが公式から出ているのを知り、和訳しながら読んでいきたいと思います！

https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api

# プロンプトエンジニアリング8箇条 (忙しい人向け)
- 最新のモデルを使用する
- 指示をプロンプトの最初に配置し、###または"""で指示と文脈を分ける
- 望む文脈、結果、長さ、形式、スタイルなどについて具体的で詳細に記述する
- 例を使って望む出力形式を明示する
- ゼロショットから始め、効果がなければファインチューニングを行う
- 曖昧で不正確な表現を減らす
- やってほしくないことだけでなく、代わりにやってほしいことも記述する
- コード生成には、特定のパターンに誘導する「leading words」を使用する


# How prompt engineering works (プロンプトエンジニアリングの仕組み)

インストラクション・フォロー・[モデル](https://platform.openai.com/docs/models)の学習方法や学習させたデータにより、特に効果的でタスクに適したプロンプトのフォーマットがあります。以下に、私たちが信頼性の高いプロンプトのフォーマットをいくつか紹介しますが、あなたのタスクに最も合うかもしれない、さまざまなフォーマットを自由に探ってみてください。

# Rules of Thumb and Examples (経験則と実例)

注：「{テキスト入力はこちら}」は、実際のテキスト/コンテキストのプレースホルダーです。

## 1. Use the latest model (最新モデルを使用する)

最良の結果を得るためには、一般的に最新で最も性能の高いモデルを使用することをお勧めします。2022年11月現在、テキスト生成には「text-davinci-003」[モデル](https://platform.openai.com/docs/models)、コード生成には「code-davinci-002」モデルがベストです。

(ちょっと古い情報かも？)

## 2. Put instructions at the beginning of the prompt and use ### or """ to separate the instruction and context (プロンプトの先頭に指示を入れ、##または"""で指示と文脈を区切る。)

### 良くない例❌

```
以下の文章を、最も重要な点を箇条書きにして要約する。

{文章の中身}
```

### より良い例✅

```
以下の文章を、最も重要な点を箇条書きにして要約する。

Text: """
{文章の中身}
"""
```

## 3. Be specific, descriptive and as detailed as possible about the desired context, outcome, length, format, style, etc (望ましい文脈、成果、長さ、形式、スタイルなどについて、具体的かつ説明的で、できるだけ詳細に説明すること。)
文脈、成果、長さ、形式、スタイルなどについて具体的に説明する。

### 良くない例❌

```
OpenAIについて詩を書く。
```

### より良い例✅

```
OpenAIについて、最近のDALL-E（DALL-Eはテキストから画像へのMLモデル）の製品発表に焦点を当て、{有名な詩人}のスタイルでインスピレーションを与える短い詩を書いてください。
```


## 4. Articulate the desired output format through examples ([example 1](https://platform.openai.com/playground/p/DoMbgEMmkXJ5xOyunwFZDHdg), [example 2](https://platform.openai.com/playground/p/3U5Wx7RTIdNNC9Fg8fc44omi)). 例（例1、例2）を通して、望ましい出力形式を明確にする。

### よくない例❌

```
以下のテキストに記載されているエンティティを抽出する。以下の4つのエンティティタイプ：会社名、人名、特定のトピック、テーマを抽出する。

Text: {文章の中身}
```

### より良い例✅

```
以下のテキストに記載されている重要なエンティティを抽出する。まずすべての会社名を抽出し、次にすべての人名を抽出し、次に内容に合った特定のテーマを抽出し、最後に一般的な包括的テーマを抽出する。

希望するフォーマット:
会社名: <コンマで区切られた会社名のリスト>
人名: -||-
特定のテーマ: -||-
一般的なテーマ: -||-

Text: {文章の中身}
```

## 5. Start with zero-shot, then few-shot ([example](https://platform.openai.com/playground/p/Ts5kvNWlp7wtdgWEkIAbP1hJ)), neither of them worked, then fine-tune ゼロショットから始め、次に少数ショット（例）、どちらもうまくいかず、その後微調整

### ✅ Zero-shot 

```
以下のテキストからキーワードを抽出する。

テキスト: {文章の中身}

キーワード: 
```

### ✅ Few-shot - provide a couple of examples (Few-shot-2つの例を提供します)


```
以下の対応するテキストからキーワードを抽出する。

テキスト1：Stripeは、Web開発者がWebサイトやモバイルアプリケーションに決済処理を組み込むために使用できるAPIを提供しています。
キーワード1：Stripe、決済処理、API、Webデベロッパー、Webサイト、モバイルアプリケーション
##
テキスト2：OpenAIは、テキストの理解と生成に非常に優れた最先端の言語モデルを訓練しています。私たちのAPIは、これらのモデルへのアクセスを提供し、言語処理を伴うほぼすべてのタスクを解決するために使用することができます。
キーワード2：OpenAI, 言語モデル, テキスト処理, API.
##
テキスト3：{文章の中身}。
キーワード 3：
```

## 6. Reduce “fluffy” and imprecise descriptions "ふわっと"した不正確な記述を減らす

### よくない例❌

```
この製品の説明文は、かなり短く、数文のみで、それ以上にはならないようにします。
```

### より良い例✅

```
この製品について、3～5文の段落で説明すること。
```

## 7.Instead of just saying what not to do, say what to do instead やってはいけないことを言うだけでなく、代わりに何をすべきかを言う

### よくない例❌

```
以下は、エージェントとお客様との会話です。ユーザー名やパスワードを尋ねないでください。繰り返さないでください。

お客様：自分のアカウントにログインできないんだけど。
代理店：
```

### より良い例✅

```
以下は、エージェントとお客様との会話です。エージェントは、問題の診断と解決策の提示を試みますが、PIIに関連する質問は控えてください。ユーザー名やパスワードなどのPIIを尋ねる代わりに、ヘルプ記事（www.samplewebsite.com/help/faq）を紹介する。

お客様：自分のアカウントにログインできないんだけど。
代理店：
```
## 8.  Code Generation Specific - モデルを特定のパターンに誘導するための「リーディングワード」を使用する。

### よくない例❌

```
# Write a simple python function that
# 1. Ask me for a number in mile
# 2. It converts miles to kilometers
```

以下のコード例では、"import "を追加することで、モデルがPythonで書き始めるべきことを示唆しています。(同様に "SELECT "はSQL文の開始を示す良いヒントとなります)。

### より良い例✅

```
# Write a simple python function that
# 1. Ask me for a number in mile
# 2. It converts miles to kilometers
 
import
```

## Parameters 

一般的に、モデル出力を変更するために最もよく使われるパラメータは、`model`と`temperature`であることが分かっています。

|パラメータ名|説明|
|---|---|
|model|高性能モデルはより高価で、レイテンシも高くなります。|
|temperature|モデルがあまり起こりそうもないトークンを出力する頻度を表します。temperatureが高いほど、出力はランダム（通常はクリエイティブ）になりますが、「真実性」とは異なります。データ抽出や真実的なQ&Aなどの事実関係のあるユースケースでは、temperatureは0が最適です。|
|max_tokens（最大長）|出力の長さを制御するものではなく、トークン生成のハードカットオフ制限です。理想的には、モデルが完了したと判断するか、定義したストップシーケンスに到達すると、この制限にはあまり達しないようになります。|
|stop（ストップシーケンス）|生成されたときにテキスト生成を停止させる一連の文字（トークン）です。|