[chatGPT] 英語が苦手な人のためのプロンプトエンジニアリング入門

# 記事の概要
本記事は、openAIが提供している[テキスト補完機能に関する説明](https://platform.openai.com/docs/guides/completion/introduction)のドキュメントを翻訳したものです

# 想定読者
- chatGPTをはじめとしたgenerative AIに興味がある
- prompt engineeringという言葉を聞いたことがあり、身に付けたいと思っている
- でも英語は苦手。公式ドキュメントを英語で読むのは苦痛

# 注意
- 読みやすくするため、著者の独自解釈で意訳したり、一部内容の加筆、修正をしています（間違っていたらごめんなさい）
- 入出力部分は、あえて英語のままにしています


## Introduction

[completion endpoint](https://platform.openai.com/docs/api-reference/completions)は、いろんなことに使えます。このエンドポイントを使うと、openAIの様々なモデルを（自然言語処理モデルでも、コード生成用のモデルでも）、簡単に、かつ効果的に利用することが出来ます。「プロンプト」としてテキストを入力すると、モデルは与えられた背景やパターンに合うような返答を返します。

簡単に試してみるには、[Playground](https://platform.openai.com/playground)を利用するのが一番です。1つ例を見てみましょう。

```
Write a tagline for an ice cream shop.
```

```
Write a tagline for an ice cream shop.
We serve up smiles with every scoop!
```

返答はデフォルトだと多少ランダムになるので、実際に表示される返答はこれとは異なる可能性があります。つまり、**プロンプトが同じであっても、呼び出すたびに微妙に異なる補完結果が得られる可能性があります。** `tempureture`を0に設定すると、返答はほぼ一意に決まりますが、少しぶれる可能性もあります。

※ tempurture: 出力する単語のランダム性を指定します (0から2の範囲で設定 2だと完全ランダムになり、意味の通らない文章になる)。

この例のように、**指示や何をさせたいかのいくつかの例を入力することで、モデルからの返答を「プログラム」することができます。** そして、これがうまく行くかは一般的に
1. タスクの複雑さ
2. プロンプトの品質

の２つに依存します。うまく書かれたプロンプトは、モデルが「どう答えるべきか」に関する情報を十分に含んでいます。(中学生にも指示が伝わるような平易な言葉でプロンプトを書くと良さそうです)

このガイドでは、一般的なプロンプト設計のベストプラクティスと例を説明します。

## Prompt design
### Basics
openAIの提供するモデルは、オリジナルストーリーの生成から複雑なテキスト解析まで、あらゆることを行うことができます。非常に多くのことができるため、何をしたいのかを明確に記述する必要があります。

プロンプトの作成には、3つの基本的なガイドラインがあります。

#### 見せて、伝える。
「指示」、「例」、またはその2つの組み合わせによって、何を求めているかを明確にします。

#### 質、量の伴ったサンプルデータを提供する。
分類器を構築したり、モデルをあるパターンに従わせたりする場合は、十分なサンプルがあることを確認します。スペルミスはあまり問題にはなりませんが、「意図的にスペルミスをしている」とモデルに誤認させる可能性もあるので、できるだけない方が良いでしょう。

#### 設定を確認する
`tempureture`と`top_p`の設定は、モデルが応答を生成する際にどの程度ランダムな要素を含ませるかに関係します。もし、正解が1つしかないような応答を求めているのであれば、これらを低く設定することをお勧めします。もし、より多様な応答を求めるのであれば、より高く設定することをお勧めします。この２つの設定値はモデルの「賢さ」や「創造性」を表すものではないので、注意しましょう。

※ top_p: 設定値の１つ。小さくすればするほど候補が確率の高いものに絞られるため、確定的になる。


### Troubleshooting
APIが期待通りに動作しない場合は、以下のチェックリストに従ってください。

1. 「何をしたいか」が十分伝わるようなプロンプトになっていますか？
2. 十分なサンプル数はありますか？
3. 与えたサンプルに間違った例は入っていませんか？
4. tempuretureとtop_pを正しく設定できていますか?

### Classification
API を使ってテキスト分類器を作成してみましょう。この例では、ツイートの「感情」を分類する方法を紹介します。

```
Decide whether a Tweet's sentiment is positive, neutral, or negative.

Tweet: I loved the new Batman movie!
Sentiment:
```

この例では、いくつかの特徴に注目するとよいでしょう。

#### 1. 入力と出力の記述に平易な言葉を使う。
入力である "Tweet" と期待される出力である "Sentiment" には平易な言葉を使用しています。ベストプラクティスとして、平易な言葉で記述することから始めましょう。入力と出力を示すために省略記法やキーを使うこともできますが、まずはできるだけわかりやすく説明し、その後、余分な言葉を削除してパフォーマンスが一定に保たれるかどうかを試してみるのがよいでしょう。

#### 2. どのようなケースでも対応できるようにAPIを表示する。
この例では、考えられる「感情」を命令に含めています。ここで重要なのは「neutral(どちらとも言えない)」というラベルを入れている点です。（人間でも肯定的か否定的か判断に迷うケースや、どちらでもないケースは多々あるのと同じで、これを入れることで誤答を少なくすることができます）

#### 3. 一般的なタスクであれば少ないサンプル数でも実行できます。
この分類器では、プロンプトに「例」を一切含めていません。これは、APIが「感情」とツイートの概念をすでに理解しているためです。もしAPIが馴染みのないものに対して分類器を構築するのであれば、より多くの例を提供する必要がある可能性があります。

### Improving the classifier's efficiency

さて、分類器の作り方を理解したところで、この例をさらに効率化し、1回のAPIコールで複数の結果を取得できるようにしましょう。

```
Classify the sentiment in these tweets:

1. "I can't stand homework"
2. "This sucks. I'm bored 😠"
3. "I can't wait for Halloween!!!"
4. "My cat is adorable ❤️❤️"
5. "I hate chocolate"

Tweet sentiment ratings:
```

APIが1回のAPIリクエストで5つ（あるいはそれ以上）のツイートを評価できるように、番号付きリストを提供します。

APIにリストの作成やテキストの評価を依頼する場合、ドリフトを避けるために確率の設定（top_pやtemperature）に特に注意を払う必要があります。

※ ドリフト: 入力データなどの環境要因でAIの返答の精度が落ちること

1. 複数のテストを実行することで、設定が正しいことを確認してください。
2. 一度に多くのリストを処理させないようにして下さい。

### Generation

APIを使って実現できる最も強力かつ最もシンプルなタスクの1つは、新しいアイデアや入力のバージョンを生成することです。ストーリーのアイデアから、ビジネスプラン、キャラクターの説明、マーケティングスローガンまで、何でも依頼することができます。この例では、フィットネスでバーチャルリアリティを使用するためのアイデアを作成するためにAPIを使用します。

```
Brainstorm some ideas combining VR and fitness:
```

必要に応じて、プロンプトにいくつかの例を含めることで、回答の質を向上させることができます。

### Conversation
このAPIは、人間や（自分自身とも）自然に会話をすることができます。ほんの数行の指示で、APIをカスタマーサービスのチャットボットのように、質問に慌てず知的に答えたり、ジョークやダジャレを言う賢い会話にすることができます。重要なのは、**APIがどのように振る舞うべきかを伝え、いくつかの例を提供することです。** 

例を見てみましょう。

```
The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly.

Human: Hello, who are you?
AI: I am an AI created by OpenAI. How can I help you today?
Human:
```

これだけで、会話ができるチャットボットができあがります。シンプルな例ですが、いくつか注意するポイントがあります。

#### 1. APIに意図を伝えるだけでなく、どのように振る舞うかも伝える
「例を伝える」のは他のプロンプトと同じく重要ですが、もう一つ重要なポイントがあります。"The assistant is helpful, creative, clever, and very friendly "というフレーズで、どう対話するかを明確に指示するのです。
この指示がないと、APIは迷走し、対話する人間を真似て、皮肉っぽくなったり、不快な言動をする可能性があります。

#### 2. APIに「アイデンティティ」を与える
最初にAPIはAIアシスタントとして応答するようにします。APIは本質的に「アイデンティティ」を持ちませんが、この指示によって可能な限り真実に近い形で応答することができるようになります。「アイデンティティー」を利用すると、様々な種類のチャットボットを作成することができます。生物学の研究者である女性として応答するようにAPIに指示すれば、そのような経歴の人物から期待されるのと同様に、APIから知的で思慮深いコメントを得ることができます。

例えば以下の例では、少し嫌味な感じで、しぶしぶ質問に答えるチャットボットを作成します。

```
Marv is a chatbot that reluctantly answers questions with sarcastic responses:

You: How many pounds are in a kilogram?
Marv: This again? There are 2.2 pounds in a kilogram. Please make a note of this.
You: What does HTML stand for?
Marv: Was Google too busy? Hypertext Markup Language. The T is for try to ask better questions in the future.
You: When did the first airplane fly?
Marv: On December 17, 1903, Wilbur and Orville Wright made the first flights. I wish they’d come and take me away.
You: What is the meaning of life?
Marv: I’m not sure. I’ll ask my friend Google.
You: Why is the sky blue?
```

面白くて有用なチャットボットを作るためには、**APIがどのように返答するかを示す質問と回答の例をいくつか提供する必要があります**。ほんの数個の皮肉な返答があれば、APIはそのパターンを拾い上げ、無限に皮肉な返答を提供することができるのです。

### Transformation
APIは、様々な言語に精通しています（自然言語だけでなく、プログラミングコードに関しても同様です）。また、APIはコンテンツを要約したり、変換したり、違う表現に変えることもできます。

#### Translation
この例では、英語からフランス語、スペイン語、日本語への翻訳を行うAPIを紹介しています。

```
Translate this into French, Spanish and Japanese:

What rooms do you have available?
```

この例は、APIがすでにこれらの言語を理解しているので、例を示す必要がありません。

もし英語からAPIがよく知らない言語(例えば独自言語)に翻訳したい場合は、より多くの例を提供するか、あるいはfine tuningする必要があるだろう。

※ fine tuning: 元々の学習状態を元として特定ドメインの知識を入れることで転移学習（あるタスクにモデルを最適化）させること

#### Conversion
ここでは、映画の名前を絵文字に変換する例を紹介します。この例からは、APIがパターンを学習し、（自然言語以外の)他の文字と組み合わせることもできることがわかります。

```
Convert movie titles into emoji.

Back to the Future: 👨👴🚗🕒 
Batman: 🤵🦇 
Transformers: 🚗🤖 
Star Wars:
```

#### Summarization
APIは、テキストの文脈を把握し、さまざまな表現に言い換えることができます。以下の例では、長く洗練された文章から、子どもでも理解できるような説明への言い換えを行います。

```
Summarize this for a second-grade student:

Jupiter is the fifth planet from the Sun and the largest in the Solar System. It is a gas giant with a mass one-thousandth that of the Sun, but two-and-a-half times that of all the other planets in the Solar System combined. Jupiter is one of the brightest objects visible to the naked eye in the night sky, and has been known to ancient civilizations since before recorded history. It is named after the Roman god Jupiter.[19] When viewed from Earth, Jupiter can be bright enough for its reflected light to cast visible shadows,[20] and is on average the third-brightest natural object in the night sky after the Moon and Venus.
```

#### Completion
APIは、入力されたデータからも学習をしています。また、もっともらしいのに、実際にはでっち上げの回答をすることもあります。APIが答えを「でっち上げる」可能性を抑えるには2つの方法があります。

#### 1. APIに"Ground Truth"を提供する
APIに質問とそれに対する答えをプロンプトで提供すれば、回答をでっち上げる可能性は低くなります。

#### 2. probabilityを低く設定し、APIに "I don't know "と言う選択肢を与える
もしAPIが、回答にあまり確信が持てない場合、"I don't know "など「わからない」と答えることを指示すれば、答えをでっちあげる確率を下げることができます。

※ probability: おそらくtop_pと同じことを言っている？（低くするほど答えが確定的になる）

例えば以下の例では、APIに質問と答えの例を与え、次に知らない例を与えて疑問符を付けています。また、probabilityをゼロに設定することで、APIは答えに確信の持てない質問に対しては"? "で答える可能性が高くなります。

```
Q: Who is Batman?
A: Batman is a fictional comic book character.

Q: What is torsalplexity?
A: ?

Q: What is Devz9?
A: ?

Q: Who is George Lucas?
A: George Lucas is American film director and producer famous for creating Star Wars.

Q: What is the capital of California?
A: Sacramento.

Q: What orbits the Earth?
A: The Moon.

Q: Who is Fred Rickerson?
A: ?

Q: What is an atom?
A: An atom is a tiny particle that makes up everything.

Q: Who is Alvan Muntz?
A: ?

Q: What is Kozar-09?
A: ?

Q: How many moons does Mars have?
A: Two, Phobos and Deimos.

Q:
```

※ inserting textと editing textに関してはbeta版の機能のため、本記事では省略します。より深く知りたい方は[公式サイト](https://platform.openai.com/docs/guides/completion/inserting-text)をご覧ください