Prompt Engineering Guide（翻訳）〜私がAIと向き合うための一歩目〜

# はじめに
ChatGPTをはじめとする昨今のAIの進化は凄まじいです。私たちの当たり前が変わる瞬間を感じています。しかしそんな中でも変化に向き合い、エンジニアとして成長したいと思っています。そこでPrompt Engineering Guideの翻訳記事を書き起こしました。私自身は生粋のフロントエンドエンジニアです。AIや機械学習についての理解はほとんどありません。そのため、翻訳の中でも間違った表現がありましたら暖かくご指摘いただけると幸いです。

本記事では、Prompt Engineering Guideの以下の章を扱っています。
- Introduction
- Techniques

https://www.promptingguide.ai/

https://github.com/dair-ai/Prompt-Engineering-Guide

# Prompt Engineering
プロンプトエンジニアリングは、様々なアプリケーションや研究テーマにおいて、言語モデル（LM）を効率的に使用するためのプロンプトを開発・最適化するための比較的新しい学問分野です。プロンプトエンジニアリングのスキルは、大規模言語モデル（LLM）の能力と限界をよりよく理解するのに役立ちます。

研究者は、質問応答や算数推論などの一般的なタスクから複雑なタスクまで、幅広くLLMの能力を向上させるためにプロンプトエンジニアリングを使用します。開発者は、プロンプトエンジニアリングを用いて、LLMや他のツールに対応した堅牢で効果的なプロンプト技術を設計します。

プロンプトエンジニアリングは、単にプロンプトを設計・開発することだけを指すのではありません。LLMとの対話や開発に役立つ幅広いスキルやテクニックを包含しています。LLMの機能を理解するために、インターフェース、ビルド、および理解するための重要なスキルです。プロンプトエンジニアリングを使ってLLMの安全性を向上させたり、LLMをドメイン知識や外部ツールで補強するような新しい機能を構築したりすることができます。

LLMを使った開発への高い関心を受け、プロンプトエンジニアリングに関連する最新の論文、学習ガイド、モデル、講義、参考文献、LLMの新機能、ツールなどをまとめた新しいガイドを作成しました。

# Introduction
このガイドでは、プロンプトの基本を説明し、プロンプトを使って大規模言語モデル（LLM）と対話したり指示したりする方法の概略を説明します。

## LLM Settings

プロンプトを扱う場合、APIを介して、または直接LLMと対話することになります。いくつかのパラメータを設定することで、プロンプトの結果を変化させることができます。

### 温度 
要するに、温度が低いほど結果はより決定的で、最も確率が高い次のトークンが常に選ばれるという意味です。温度を上げると、ランダム性が増し、より多様で創造的な出力が促されます。基本的には、他の可能性のあるトークンの重みを増やしています。応用面では、事実に基づいた質問回答のようなタスクでは、より事実に基づいた簡潔な回答を促すために、低い温度値を使用することが望ましいでしょう。詩の生成や他の創造的なタスクでは、温度値を上げることが有益であるかもしれません。

:::note warn
ここでの「温度」は言語モデルの出力を制御するために使用されるパラメータという意味で使われています。
:::

参考になった資料

https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277

### Top_p 
同様に、核サンプリングと呼ばれる温度によるサンプリング手法であるtop_pでは、モデルが応答を生成する際の決定性をコントロールすることができます。正確で事実に基づいた回答を求めるのであれば、この値を低くしておきます。より多様な回答を求めるのであれば、より高い値にします。

一般的には、両方ではなく、どちらかを変更することをお勧めします。

## プロンプトの基礎
### Basic Prompts

シンプルなプロンプトを使っても多くのことを達成できますが、結果の質はプロンプトがどれだけ効果的に構成されているかや、与える情報の量に依存します。プロンプトには、モデルへの指示や質問のほか、文脈、入力、例などの詳細情報を含めることができます。これらの要素を駆使して、モデルに明確な指示を与えることで、より優れた結果が得られます。

それでは、シンプルなプロンプトの基本的な例を見てみましょう。

Prompt:

```
空は
```

Output:

```
青い
晴れた日の空は青い。曇りの日は、空が灰色や白になることがあります。
```

ご覧の通り、言語モデルは「空は」という文脈に沿った文字列を生成します。しかし、この出力は予期しないものであったり、目的とするタスクに適していなかったりすることがあります。この基本的な例から、目標を具体的に達成するために、より多くの文脈や指示を提供する必要性が浮き彫りになります。

それでは、少し改善してみましょう。

Prompt:

```
文章を完成させてください。
空は
```

Output:

```
今日はとても綺麗です。
```

これで適切でしょうか？ここでは、モデルに文章を完成させるよう指示しています。その結果、私たちが与えた指示（「文章を完成させる」）に忠実に従い、より良い出力が得られます。このように、モデルにタスクを指示するための最適なプロンプトを設計する手法を**プロンプトエンジニアリング**と呼びます。

上記の例は、現在の大規模言語モデルが実現できることの基本的な概要を示しています。現在の大規模言語モデルは、テキストの要約から数学的推論、コード生成に至るまで、多様な高度なタスクを実行する能力を持っています。

### プロンプトのフォーマット

上で非常にシンプルなプロンプトを試しました。標準的なプロンプトは次の形式を持っています：

`<Question>?` or `<Instruction>`

これを、多くのQAデータセットで標準的に使われているQA（question answering）フォーマットにすると、次のようになります。

```
Q: <Question>?
A: 
```

上記のようなプロンプトを提示する場合、Zero-shot Promptingとも呼ばれます。つまり、モデルに達成させたいタスクに関する例やデモンストレーションを一切行わずに、直接モデルに対して応答を促すことになるのです。大規模な言語モデルの中には、Zero-shot Promptingを実行する能力を持つものもありますが、それは手元のタスクの複雑さと知識に依存します。

上記の標準的な形式を考慮すると、プロンプトの一般的で効果的な手法の1つは、模範（すなわちデモンストレーション）を提供するFew-shot Promptingと呼ばれるものです。Few-shot Promptingは、以下のような形式をとることができます。

```
<Question>?
<Answer>
<Question>?
<Answer>
<Question>?
<Answer>
<Question>?
```

QAフォーマットの場合はこのような感じになります。

```
Q: <Question>?
A: <Answer>
Q: <Question>?
A: <Answer>
Q: <Question>?
A: <Answer>
Q: <Question>?
A:
```

QA形式であることが必須ではないことを念頭に置いてください。プロンプトの形式は、その時のタスクによって異なります。例えば、簡単な分類作業を行い、その作業を示す模範解答を次のように与えることができます。

Prompt:

```
これはすごいことです! // ポジティブ
これは良くない！。// ネガティブ
あの映画は最高だった! // ポジティブ
なんて恐ろしい番組なんだ //
```

Output:

```
ネガティブ
```

数発のプロンプトは、言語モデルが数回のデモンストレーションでタスクを学習する能力である、インコンテキスト学習を可能にします。

## プロンプトの要素
プロンプトエンジニアリングを通じて可能な事例や応用例を紹介する中で、プロンプトを構成する要素が決まっていることがわかります。プロンプトには、以下のいずれかの要素が含まれます。

1. **命令** - モデルに実行させたい特定のタスクや命令。
2. **コンテキスト** - モデルがより良い反応を示すために役立つ外部情報や追加のコンテキスト。
3. **入力データ** - 応答を見つけることに関心のある入力や質問。
4. **出力インジケータ** - 出力のタイプや形式を示す。

プロンプトにすべての構成要素が必要なわけではありません。形式はタスクによって異なります。具体的な例は、今後のガイドで取り上げていきます。

## プロンプトデザインに関する一般的なコツ
### Start Simple
プロンプトの設計を始める際には、最適な結果を得るために反復プロセスで多くの実験が必要だということを念頭に置く必要があります。OpenAIやCohereのようなシンプルなプレイグラウンドを使うことは、良いスタート地点です。

シンプルなプロンプトから始め、要素やコンテキストを追加しながらより良い結果を目指すことができます。そのためには、プロンプトを段階的に改善していくことが重要です。このガイドを通じて、具体性、シンプルさ、簡潔さが、より良い結果を生むことが多いことがわかります。

大規模なタスクにいくつかのサブタスクが含まれる場合、タスクをよりシンプルなサブタスクに分解し、それらを組み合わせてより良い結果が得られるようにすることができます。このアプローチによって、プロンプトデザインプロセスの初期段階での複雑さの増加を避けることができます。

### The Instruction
「書く」「分類する」「要約する」「翻訳する」「順番に並べる」など、目的に応じたコマンドをモデルに指示することで、多様な単純作業に効果的なプロンプトを設計できます。

また、最も効果的な方法を見つけるために、多くの実験が必要であることを忘れずにおきましょう。キーワード、文脈、データを変えてさまざまな指示を試し、特定のユースケースやタスクに最適なものを見つけます。一般的に、コンテキストが実行しようとしているタスクに対して具体的で関連性が高ければ高いほど、効果的です。サンプリングの重要性や、より多くのコンテキストを追加することについては、今後のガイドで詳しく述べられています。

さらに、指示はプロンプトの先頭に置くことが推奨されることがあります。また、「###」のような明確なセパレータを使用して指示とコンテキストを分けることも良い方法とされています。

Prompt:

```
### Instruction ###
以下の文章をスペイン語に翻訳してください。
Text: "hello!"
```

Output:

```
¡Hola!
```

### 特異性
モデルに具体的な指示とタスクを実行させることが重要です。プロンプトがより説明的で詳細であればあるほど、より良い結果を得ることができます。これは、求める結果や生成のスタイルが決まっている場合に特に重要です。特定のトークンやキーワードが良い結果をもたらすわけではなく、良いフォーマットと説明的なプロンプトを用意することが重要です。実際、プロンプトに例を示すことは、特定のフォーマットで望ましい出力を得るために非常に効果的です。

プロンプトをデザインする際には、プロンプトの長さにも注意が必要です（プロンプトの長さには制限があります）。どの程度具体的で詳細に書くべきかを考慮する必要があります。不必要な詳細を盛り込みすぎることは、必ずしも良いアプローチではありません。詳細は、関連性があり、目の前のタスクに貢献するものでなければなりません。これは、何度も試してみる必要があります。プロンプトをアプリケーションに最適化するために、多くの実験と反復を行うことをお勧めします。

例として、テキストから特定の情報を抽出する簡単なプロンプトを試してみましょう。

Prompt:
```
以下のテキストから地名を抽出する。
期待する形式:
場所: <comma_separated_list_of_company_names>
入力データ: "Although these developments are encouraging to researchers, much is still a mystery. “We often have a black box between the brain and the effect we see in the periphery,” says Henrique Veiga-Fernandes, a neuroimmunologist at the Champalimaud Centre for the Unknown in Lisbon. “If we want to use it in the therapeutic context, we actually need to understand the mechanism.""
```

Output:
```
場所: Champalimaud Centre for the Unknown, Lisbon
```

### 不正確な表現を避ける
上記のように、詳細な説明や形式を改善するためのヒントがあるため、プロンプトがあまりにも複雑になりすぎて、不正確な記述をする可能性があるという罠に陥りがちです。具体的で直接的な表現が良い場合もあります。この例は、効果的なコミュニケーションに非常に似ています。

例えば、プロンプトエンジニアリングという概念に興味を持った場合、以下のようなシンプルなプロンプトを試してみることができます。

```
プロンプトエンジニアリングという概念を説明してください。説明は短く、数センテンスにとどめ、あまり説明的にならないように。
```

確かに、上記のプロンプトでは文体や文の数に関する具体的な指示がありません。より良いプロンプトを設計するために、期待する文体や文の数を指定することが役立ちます。例えば、以下のようなプロンプトに変更することができます。

```
プロンプトエンジニアリングの概念を高校生に説明するために、2～3つの文章を使用してください。
```

### To do or not to do?
プロンプトをデザインする際のもう一つのコツは、「やってはいけないこと」を言わず、「やるべきこと」を言うことです。こうすることで、より具体的な指示を出すことができ、モデルから良い反応が得られるような細部に焦点を当てることができます。

例えば、映画の推薦チャットボットが、「やってはいけないこと」に焦点を当てた命令の書き方をしてしまうと、まさに「やってほしくないこと」に失敗することがあります。

Prompt:

```
以下は、顧客に映画を勧めるエージェントです。趣味を尋ねない。個人情報を求めない。
Customer: 私の興味に基づいた映画を推薦してください。
Agent: 
```

Output:

```
もちろん、あなたの趣味に合わせた映画をおすすめします。どんな映画を観たいですか？アクション、コメディ、ロマンス、その他、どれがお好みでしょうか？
```

良いプロンプト

Prompt:
```
以下は、顧客に映画を推薦するエージェントです。このエージェントは、世界のトップトレンドの映画から映画を推薦する責任があります。ユーザーの好みを聞いたり、個人情報を聞いたりすることは避けなければなりません。もし、おすすめする映画がない場合は、"Sorry, couldn't find a movie to recommend today. "と応答する必要があります。
Customer: 私の興味を踏まえた上で、おすすめの映画を紹介してください。
Agent:
```

Output:
```
申し訳ありませんが、あなたの興味についての情報がありません。しかし、今世界のトップトレンドの映画のリストはこちらです。あなたの好きなものが見つかるといいですね。
```

## プロンプトの例
前節では、LLMのプロンプトの出し方について紹介し、基本的な例を挙げました。

このセクションでは、プロンプトがさまざまなタスクを達成するためにどのように使用されるかについて、より多くの例を提供し、その過程で重要な概念を紹介することにします。概念を学ぶのに最適な方法は、例を通して学ぶことであることが多いです。以下では、プロンプトをうまく使ってさまざまな種類のタスクを実行する例をいくつか取り上げます。

### テキスト要約
テキストの要約は、自然言語生成の一般的なタスクの1つであり、多様な趣向やドメインが存在します。実際、言語モデルの最も有望な応用例の1つは、記事や概念を迅速に読みやすい要約にまとめる能力です。プロンプトを用いた基本的な要約タスクを試してみましょう。例えば、抗生物質について学ぶことに興味がある場合、次のようなプロンプトを試すことができます。

Prompt:
```
抗生物質について説明して。
A:
```

Output:
```
抗生物質は、細菌感染症の治療に使用される薬の一種です。抗生物質は、細菌を殺すか、細菌の繁殖を防ぐことで、体の免疫システムが感染症を撃退できるようにする働きがあります。抗生物質は通常、錠剤、カプセル、液剤の形で経口投与され、時には静脈内投与されることもあります。ウイルス感染には効果がなく、不適切な使用は抗生物質耐性をもたらす可能性があります。
```

A:は、質問回答において明示的なプロンプト形式として使用され、モデルに予想される続きを伝える役割があります。この例では、その利点が明確でないものの、後の例では役立つでしょう。情報が多すぎる場合、モデルに1文にまとめるよう指示してさらに要約することが可能です。

Prompt:
```
抗生物質は、細菌感染症の治療に使用される薬の一種です。抗生物質は、細菌を殺すか、細菌の繁殖を防ぐことで、体の免疫システムが感染症を撃退できるようにする働きがあります。抗生物質は通常、錠剤、カプセル、液剤の形で経口投与され、時には静脈内投与されることもあります。ウイルス感染には効果がなく、不適切な使用は抗生物質耐性をもたらす可能性があります。
以上のことを1文で説明してください。
```

Output:
```
抗生物質は、細菌を殺すか、細菌の繁殖を止めることで細菌感染症の治療に使われる薬ですが、ウイルスには効果がなく、使い過ぎると抗生物質耐性を持つようになります。
```

上の出力の正確さには焦点を当てず、後のガイドで詳しく取り上げますが、このモデルは段落を1文にまとめようとしました。指示をより緻密にすることもできますが、それは後の章で扱います。ここで一旦立ち止まって、自由に実験してみて、より良い結果が得られるかどうか試してみてください。

### 情報の抽出
言語モデルは自然言語の生成とそれに関連するタスクを実行するために学習されますが、分類やその他のさまざまな自然言語処理（NLP）タスクを実行する能力も非常に高いです。

ここでは、与えられた段落から情報を抽出するプロンプトの例を示します。

Prompt:

```
研究論文の著者紹介や謝辞では、原稿作成や分析にChatGPTなどのAI技術をどの程度使用したか、明確かつ具体的に記載する必要があります。また、どの大規模言語モデル（LLM）を使用したかも明記すべきです。これにより、編集者や査読者は潜在的な偏見や不正確さ、不適切な出典の記載がないかどうかをより注意深くチェックできます。同様に、科学雑誌も投稿原稿の選考時などに、LLMの使用に関する透明性を確保すべきです。
上記の段落で取り上げた大規模言語モデルに基づく製品について触れてください。
```

Output:

```
上の段落で紹介した大規模な言語モデルベースの製品がChatGPTです。
```

上記の結果を改善する方法はたくさんありますが、これはすでに非常に便利なものです。

何をすべきか指示するだけで、モデルにさまざまなタスクを実行させることができることは明らかでしょう。これは、AI製品の開発者がすでに強力な製品や体験を構築するために使っている強力な能力です。

### 質問回答
モデルに特定の回答を得るための最善の方法の1つは、プロンプトの形式を改善することです。前述の通り、プロンプトは指示、コンテキスト、入力、および出力指標を組み合わせることで、より良い結果が得られます。これらの要素は必須ではないものの、指示が具体的であればあるほど、より良い結果が得られるため良い習慣です。以下は、より構造化されたプロンプトを使用した際の例です。

Prompt:

```
以下の文脈に基づき、質問に答えてください。回答は短く、簡潔に。答えに自信がない場合は、「Unsure about answer」と答えてください。
背景: テプリズマブのルーツは、ニュージャージー州のオーソ・ファーマシューティカルという製薬会社です。そこで科学者たちは、OKT3と呼ばれる抗体の初期バージョンを作りました。この分子はもともとマウスから採取されたもので、T細胞の表面に結合し、その殺傷能力を制限することができた。1986年には、腎臓移植後の臓器拒絶反応を防ぐ目的で承認され、ヒトへの使用が許可された最初の治療用抗体となりました。
質問: OKT3はもともと何から調達されましたか？
回答:
```

Output:

```
マウス
```

### テキストの分類
これまでは、簡単な指示でタスクをこなしてきました。プロンプトエンジニアとして、より良い指示を出せるようになることが必要です。しかし、それだけではありません。より難しいユースケースになると、ただ指示を出すだけでは不十分であることに気づくでしょう。そこで、プロンプトのコンテキストと、プロンプトに使用できるさまざまな要素について、より深く考える必要があります。入力データや例文など、他の要素を提供することもできます。

ここでは、テキストの分類を例に挙げて、これを実証してみよう。

Prompt:

```
テキストをneutral, negative, positiveに分類する。
テキスト：　料理はまあまあだったと思います。
感情:
```

Output:
```
Neutral
```

テキストを分類するように指示したところ、モデルは「Neutral」と答え、これは正しいです。しかし、私たちが本当に求めているのは、モデルが望む正確な形式でラベルを提供することです。つまり、「Neutral」ではなく、「neutral」と返すようにしたいのです。これを実現する方法はいくつかあります。ここでは具体性が重要であるため、プロンプトに提供できる情報が多ければ多いほど、より良い結果が得られます。正しい動作を指示するために、例を示すことも効果的です。もう一度試してみましょう。

Prompt:
```
テキストをneutral, negative, positiveに分類する。
テキスト：　休暇はまあまあでした。
感情: neutral
テキスト：　料理はまあまあでした。
感情:
```

Output:
```
neutral
```

素晴らしいです。今回、モデルは私が求めていた具体的なラベル「neutral」を返してくれました。これは、プロンプトで示された例がモデルの出力を具体化するのに役立ったと考えられます。

### 会話
プロンプトエンジニアリングで達成できる興味深い点の1つは、大規模言語モデル（LLM）システムに、振る舞い、意図、アイデンティティを指示できることです。これは、顧客サービスのチャットボットのような対話型システムを構築する際に特に効果的です。

例として、質問に対してより専門的で科学的な回答を生成する会話システムを作成してみましょう。指示を通じて、どのように振る舞うべきかを明示的に示している点に注目してください。これは、ロールプロンプティングとも呼ばれることがあります。

Prompt:
```
以下は、AIリサーチアシスタントとの会話です。アシスタント口調は技術的、科学的です。
人間:こんにちは、あなたは誰ですか？
AI:こんにちは! 私はAIの研究助手です。今日はどのようなご用件でしょうか？
人間:ブラックホールの生成について教えてください。
AI:
```

Output:
```
もちろん！ブラックホールとは、重力が非常に強く、光さえも逃げられない時空の領域のことです。超巨大な星が死に、その核が自ら崩壊し、無限密度の特異点が形成されることで生まれます。この特異点の強い重力によって、周囲の物質や放射線が引き込まれ、ブラックホールとなります。
```

私たちのAI研究アシスタントは少し専門的すぎるようですね。それでは、この振る舞いを変更し、もっと分かりやすい回答をするようにシステムに指示しましょう。

Prompt：
```
以下は、AI研究アシスタントとの会話です。アシスタントの回答は、小学生でも理解しやすいようにしてください。
人間：こんにちは、あなたは誰ですか？
AI：こんにちは！私はAI研究アシスタントです。今日は何でお手伝いしましょうか？
人間：ブラックホールの誕生について教えてもらえますか？
AI：
```

Output:
```
もちろん！ブラックホールは、非常に大きな星が燃料を使い果たして自分自身に崩壊するときにできます。星の重力は非常に強いため、光さえも逃げられないほどです。これにより、非常に強い重力力を持つ宇宙空間の点がブラックホールとして作られます。
```

少し進歩したと思います。さらに改善していくことができます。もっと例を追加すれば、さらに良い結果が得られるかもしれません。

### コード生成
LLMが非常に効果的な応用例の1つは、コード生成です。Copilotはその素晴らしい例です。巧妙なプロンプトを使って実行できるコード生成タスクはたくさんあります。以下にいくつかの例を見てみましょう。

まず、ユーザーに挨拶する簡単なプログラムを試してみましょう。

Prompt:
```
/*
ユーザーに名前を尋ねて、「こんにちは」と言う
*/
```

Output:
```js
let name = prompt("What is your name?");
console.log(Hello, ${name}!);
```
言語を指定する必要すらありませんでした。

もう少しレベルを変えてみましょう。プロンプトの設計にもう少し努力を入れることで、LLMがどれだけ強力であるかを示したいと思います。

Prompt:
```
"""
Table departments, columns = [DepartmentId, DepartmentName]
Table students, columns = [DepartmentId, StudentId, StudentName]
コンピュータサイエンス学部のすべての学生のMySQLクエリを作成してください
"""
```

Output:
```sql
SELECT StudentId, StudentName 
FROM students 
WHERE DepartmentId IN (SELECT DepartmentId FROM departments WHERE DepartmentName = 'Computer Science');
```

これは非常に印象的です。このケースでは、データベーススキーマに関するデータを提供し、有効なMySQLクエリを生成するように依頼しました。

### 推論
現代のLLMにとって最も難しい課題の1つは、何らかの形で推論を必要とするものでしょう。推論は、LLMから生まれる複雑なアプリケーションの種類によって、私が最も期待している分野の1つです。

数学的能力を伴うタスクについては、ある程度の改善が見られます。しかし、現在のLLMは推論タスクの実行に苦労しているため、さらに高度なプロンプトエンジニアリング技術が必要であることに留意する必要があります。このような高度な技術については、次のガイドで説明します。今回は、算数の能力を示すいくつかの基本的な例を取り上げます。

Prompt:
```
9,000 * 9,000は？
```

Output:
```
81,000,000
```

もう少し難しい課題を解きましょう。

Prompt:
```
15, 32, 5, 13, 82, 7, 1. このグループの奇数を足すと偶数になる。
```

Output:
```
いいえ。このグループの奇数を足すと119になります。
```

不正解です! プロンプトを改良して改善してみましょう。

Prompt:
```
15, 32, 5, 13, 82, 7, 1. このグループの奇数を足すと偶数になる。
問題をステップに分割して解きます。まず、奇数を特定し、それらを足し算し、その結果が奇数か偶数かを示してください。
```

Output:
```
奇数: 15, 5, 13, 7, 1
合計: 41 
41は奇数です。
```

ずっと良くなっていますね？ところで、何度か試してみたのですが、時々失敗します。例と組み合わせたより良い指示を出せば、より正確な結果を得ることができるかもしれません。

このガイドのセクションでは、一般的なアプリケーションの例をより多く掲載していきます。

次のセクションでは、これらすべての、そしてより難しいタスクのパフォーマンスを向上させるための、さらに高度なプロンプトエンジニアリングのコンセプトとテクニックを取り上げます。

# テクニック
この段階で、さまざまなタスクでより良い結果を得るためにプロンプトを改良することが有益であることは明らかです。これがプロンプトエンジニアリングの全体的な考え方です。

基本的な例は楽しかったですが、このセクションでは、より複雑で興味深いタスクを達成することを可能にする、より高度なプロンプトエンジニアリングのテクニックを取り上げます。

## Zero-Shot Prompting
大量のデータで訓練され、指示に従うように調整された今日のLLMは、Zero-shot Promptingでタスクを実行することが可能です。前節でいくつかのZero-shot Promptingの例を試しました。ここでは、私たちが使用した例の一つを紹介します。

Prompt:

```
テキストをneutral, negative, positiveに分類する。
テキスト：　料理はまあまあだったと思います。
感情:
```

Output:
```
Neutral
```

上のプロンプトでは、モデルに例題を与えていないことに注意してください。

インストラクションチューニングは、Zero-shot Prompting学習を改善することが示されています。インストラクションチューニングとは、本来、命令で記述されたデータセット上でモデルを微調整する概念です。さらに、RLHF（人間のフィードバックからの強化学習）は、人間の好みに合わせてモデルを調整するインストラクションチューニングを拡張するために採用されています。これは、ChatGPTのようなモデルを強化するものです。これらのアプローチや方法については、次のセクションで説明します。

Zero-shot Promptingでうまくいかない場合、プロンプトの中でデモや例を提供することが推奨され、それがfew-shot promptingにつながります。次のセクションでは、数発のプロンプトのデモを行います。

### Few-Shot Prompting
大規模言語モデルは顕著なZero-shotの能力を示しますが、Zero-shotの設定を使用した場合、より複雑なタスクではまだ不十分です。Few-shot promptingは、文脈内学習を可能にする技術として使用することができ、プロンプトの中でデモンストレーションを提供し、モデルをより良いパフォーマンスへと導きます。このデモは、モデルに応答を生成させる後続の例の条件付けとして機能します。

Brown et al. 2020で紹介された例で、Few-shot promptingを実演してみましょう。この例では、文中で新しい単語を正しく使用することが課題となっています。

Prompt:
```
「whatpu」は、タンザニア原産の小さな毛皮の動物です。whatpuという言葉を使った文章の例は、次のようなものです：
アフリカを旅行していたとき、とてもかわいいwhatpuを見かけました。

「farduddle」をするということは、とても速く上下に跳ねることを意味します。「farduddle」という言葉を使った文章の例は、以下の通りです：
```

Output:
```
試合に勝つと、みんなで祝杯をあげてfarduddleをするようになりました。
```

モデルは、たった1つの例（つまり1ショット）を与えることで、何らかの方法でタスクを実行する方法を学んだことがわかります。より難しいタスクの場合、デモンストレーションを増やすことで実験することができます（例：3ショット、5ショット、10ショットなど）。

Min et al.（2022）の調査結果に基づいて、Few-shot Promptingでデモンストレーションや事例を行う際のいくつかのヒントを紹介します：

- デモンストレーションで指定されたラベル空間と入力テキストの分布は、どちらも重要です（個々の入力に対してラベルが正しいかどうかに関係なく）
- 使用するフォーマットも、パフォーマンスに大きな役割を果たします。たとえランダムなラベルを使用したとしても、これはまったくラベルがない場合よりもはるかに良いです。
- さらなる結果では、真のラベル分布からランダムにラベルを選択すること（一様分布ではなく）も助けになります。

いくつかの例を試してみましょう。まず、ランダムなラベルの例を試してみます。

Prompt:

```
これはすごいことです! // ネガティブ
これは良くない！。// ポジティブ
あの映画は最高だった! // ポジティブ
なんて恐ろしい番組なんだ //
```

Output:

```
ネガティブ
```

ラベルがランダム化されても、正しい答えが得られます。また、フォーマットも保持していることに注意してください。実際、さらに実験を進めると、私たちが実験している新しいGPTモデルは、ランダムなフォーマットに対してもより強固になってきているようです。

Prompt:
```
ポジティブ。これはすごいことです!
これは良くない！ネガティブ。
わぁ！あの映画すごいな！
ポジティブ。
なんて恐ろしい番組なんだ
```

Output:
```
ネガティブ
```

上記の形式には一貫性がありませんが、それでもモデルは正しいラベルを予測しました。この結果が、プロンプトのバリエーションの違いなど、より複雑なタスクでも成り立つかどうかを確認するためにはより詳細な分析を行う必要があります。

### Few-shot Promptingの限界
標準的なFew-shot promptingは多くのタスクでうまく機能しますが、特に複雑な推論タスクを扱う場合には、まだ完璧なテクニックではありません。では、その理由を説明しましょう。前回の例で、次のようなタスクを提供したのを覚えていますか？

Prompt:
```
15, 32, 5, 13, 82, 7, 1. このグループの奇数を足すと偶数になる。
```

Output:
```
いいえ。このグループの奇数を足すと119になります。
```

これは正しい回答ではありません。これはシステムの限界を浮き彫りにするだけでなく、より高度なプロンプトエンジニアリングが必要であることを示しています。

Few-shot promptingで結果が改善されるかどうか、いくつか例を加えてみてみましょう。


```
4, 8, 9, 15, 12, 2, 1. このグループの奇数を足すと偶数になる。
A. いいえ
17,  10, 19, 4, 8, 12, 24.このグループの奇数を足すと偶数になる。
A. はい
16,  11, 14, 4, 8, 13, 24.このグループの奇数を足すと偶数になる。
A. はい
17,  9, 10, 12, 13, 4, 2.このグループの奇数を足すと偶数になる。
A. いいえ
15, 32, 5, 13, 82, 7, 1. このグループの奇数を足すと偶数になる。
A. 
```

Output:
```
はい
```

うまくいかなかったようです。Few-shot promptingだけでは、このタイプの推論問題に対して信頼性のある回答を得るには十分ではないようです。上記の例では、タスクに関する基本的な情報を提供しています。より詳しく見ると、紹介したタスクのタイプには、もう少し推論ステップが含まれています。つまり、問題をステップに分解し、それをモデルに示すことが助けになるかもしれません。最近では、chain-of-thought (CoT) promptingが、より複雑な算数、常識、および記号的推論タスクに対処するために普及しています。

全体として、例を提供することは、一部のタスクを解決する上で有益であることがわかります。Zero-shot PromptingやFew-shot Promptingが十分でない場合、モデルが学習した内容がタスクをうまくこなすのに十分でないことを意味するかもしれません。ここからは、モデルのfine-tuningや、より高度なプロンプト技術を試すことをお勧めします。次に、Chain-of-Thought Promptingという人気のあるプロンプティング技術について説明します。

## Chain-of-Thought Prompting

![スクリーンショット 2023-03-18 16.13.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071889/f536ce2a-521d-a3cf-2213-e879f08b249c.png)

Chain-of-Thought(CoT)Promptingは、中間推論ステップを通して複雑な推論能力を可能にします。Few-shot　Promptingと組み合わせることで、回答前に推論が必要なより複雑なタスクで、より良い結果を得ることができます。

Prompt:
```
4, 8, 9, 15, 12, 2, 1. このグループの奇数を足すと偶数になる。
A. 奇数の (9, 15, 1)を足すと25になるので、いいえ
17,  10, 19, 4, 8, 12, 24.このグループの奇数を足すと偶数になる。
A. 奇数の (17, 19)を足すと36になるので、はい
16,  11, 14, 4, 8, 13, 24.このグループの奇数を足すと偶数になる。
A. 奇数の (11, 13)を足すと24になるので、はい
17,  9, 10, 12, 13, 4, 2.このグループの奇数を足すと偶数になる。
A. 奇数の (17, 9, 13)を足すと39になるので、いいえ
15, 32, 5, 13, 82, 7, 1. このグループの奇数を足すと偶数になる。
A. 
```

Output:
```
奇数の (15, 5, 13, 7, 1)を足すと41になるので、いいえ
```

すごい! 推論ステップを提供することで、完璧な結果を見ることができます。実はこの課題は、さらに少ない例、つまり1つの例で十分だと思われる例を提供することで解決できるのです。

Prompt:
```
4, 8, 9, 15, 12, 2, 1. このグループの奇数を足すと偶数になる。
A. 奇数の (9, 15, 1)を足すと25になるので、いいえ
15, 32, 5, 13, 82, 7, 1. このグループの奇数を足すと偶数になる。
A. 
```

Output:
```
奇数の (15, 5, 13, 7, 1)を足すと41になるので、いいえ
```

### Zero-shot COT Prompting
最近登場したアイデアとして、Zero-shot CoT（Kojima et al.2022）がありますが、基本的には、元のプロンプトに「ステップごとに考える」というものを追加することです。簡単な問題に取り組んで、モデルの性能を確認しましょう。

Prompt:

```
私は市場に行って10個のリンゴを買いました。近所の人に2個、修理工に2個あげました。その後、さらに5個のリンゴを買って、1個を食べました。私は何個のリンゴを残しましたか？
```

Output:
```
11個
```

答えは不正解です! では、特別なプロンプトで試してみましょう。

Prompt:
```
私は市場に行って10個のリンゴを買いました。近所の人に2個、修理工に2個あげました。その後、さらに5個のリンゴを買って、1個を食べました。何個のリンゴが残ったでしょうか？
一歩一歩考えてみましょう。
```

Output:
```
まず、あなたは10個のリンゴを持ってスタートしました。
隣の人に2個、修理屋さんに2個あげたので、残り6個になりました。
次に、さらに5個のリンゴを買ったので、11個のリンゴが残りました。
最後にリンゴを1個食べたので、10個のリンゴが残ることになります。
```

このシンプルなプロンプトがこのタスクに効果的であることは印象的です。特に、プロンプトに使える例文があまり多くない場合に有効です。

## Self-Consistency
プロンプトエンジニアリングにおいて、より高度な技術の1つはSelf-Consistencyでしょう。Wangら（2022）が提案したSelf-Consistencyは、「思考連鎖プロンプトで使用される素朴な貪欲デコードを置き換える」ことを目的としています。これは、少数のCoTで複数の多様な推論経路をサンプリングし、その生成物を利用して最も一貫性のある答えを選択するというものです。これにより、算数や常識的な推論を伴うタスクにおいて、CoTプロンプティングの性能を高めることができます。

算数の推論については、次のような例で試してみましょう。

Prompt:
```
私が6歳の時、妹は私の年齢の半分でした。今私は70歳です。妹は何歳ですか？
```

Output:
```
35
```

出力が違います! これをSelf-Consistencyで改善するにはどうしたらいいのでしょうか？

（長いため原文のまま記載）

<details>
<summary>Prompt</summary>

```
Q: There are 15 trees in the grove. Grove workers will plant trees in the grove today. After they are done,
there will be 21 trees. How many trees did the grove workers plant today?
A: We start with 15 trees. Later we have 21 trees. The difference must be the number of trees they planted.
So, they must have planted 21 - 15 = 6 trees. The answer is 6.
Q: If there are 3 cars in the parking lot and 2 more cars arrive, how many cars are in the parking lot?
A: There are 3 cars in the parking lot already. 2 more arrive. Now there are 3 + 2 = 5 cars. The answer is 5.
Q: Leah had 32 chocolates and her sister had 42. If they ate 35, how many pieces do they have left in total?
A: Leah had 32 chocolates and Leah’s sister had 42. That means there were originally 32 + 42 = 74
chocolates. 35 have been eaten. So in total they still have 74 - 35 = 39 chocolates. The answer is 39.
Q: Jason had 20 lollipops. He gave Denny some lollipops. Now Jason has 12 lollipops. How many lollipops
did Jason give to Denny?
A: Jason had 20 lollipops. Since he only has 12 now, he must have given the rest to Denny. The number of
lollipops he has given to Denny must have been 20 - 12 = 8 lollipops. The answer is 8.
Q: Shawn has five toys. For Christmas, he got two toys each from his mom and dad. How many toys does
he have now?
A: He has 5 toys. He got 2 from mom, so after that he has 5 + 2 = 7 toys. Then he got 2 more from dad, so
in total he has 7 + 2 = 9 toys. The answer is 9.
Q: There were nine computers in the server room. Five more computers were installed each day, from
monday to thursday. How many computers are now in the server room?
A: There are 4 days from monday to thursday. 5 computers were added each day. That means in total 4 * 5 =
20 computers were added. There were 9 computers in the beginning, so now there are 9 + 20 = 29 computers.
The answer is 29.
Q: Michael had 58 golf balls. On tuesday, he lost 23 golf balls. On wednesday, he lost 2 more. How many
golf balls did he have at the end of wednesday?
A: Michael initially had 58 balls. He lost 23 on Tuesday, so after that he has 58 - 23 = 35 balls. On
Wednesday he lost 2 more so now he has 35 - 2 = 33 balls. The answer is 33.
Q: Olivia has $23. She bought five bagels for $3 each. How much money does she have left?
A: She bought 5 bagels for $3 each. This means she spent 5
Q: When I was 6 my sister was half my age. Now I’m 70 how old is my sister?
A:
```
</details>

Output1:
```
When I was 6 my sister was half my age, so she was 3. Now I am 70, so she is 70 - 3 = 67. The answer is 67.
```

Output2:
```
When the narrator was 6, his sister was half his age, which is 3. Now that the narrator is 70, his sister would be 70 - 3 = 67 years old. The answer is 67.
```

Output3:
```
When I was 6 my sister was half my age, so she was 3. Now I am 70, so she is 70/2 = 35. The answer is 35.
```

最終的な答えの算出にはいくつかのステップがありますが、簡単に説明すると、すでに多数派の答えが出現しているので、それが最終的な答えになるという考えです。

## Generated Knowledge Prompting

![スクリーンショット 2023-03-18 16.35.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071889/55350b55-4cea-309c-5f49-8c68d9b6b7d4.png)

LLMは改良が続けられており、人気のある手法の1つは、モデルがより正確な予測を行うために知識や情報を取り入れる機能があります。

同様の考え方で、予測する前にモデルを用いて知識を生成することもできるのでしょうか。Liuらの2022年の論文では、これが試みられています。特に、コモンセンス推論のようなタスクにどの程度役立つのでしょうか。

Prompt:
```
ゴルフの一部には、他人より高いポイント数を得ようとする特徴がある。Yes or No?
```

Output:
```
Yes
```

この種の間違いは、世界に関するより多くの知識を必要とするタスクを実行するためのLLMの限界を明らかにするものです。知識生成でこれを改善するにはどうしたらいいのでしょうか？

まず、いくつかの「知識」を生成します。


（長いため原文のまま記載）

<details>
<summary>Prompt</summary>

```
Input: Greece is larger than mexico.
Knowledge: Greece is approximately 131,957 sq km, while Mexico is approximately 1,964,375 sq km, making Mexico 1,389% larger than Greece.
Input: Glasses always fog up.
Knowledge: Condensation occurs on eyeglass lenses when water vapor from your sweat, breath, and ambient humidity lands on a cold surface, cools, and then changes into tiny drops of liquid, forming a film that you see as fog. Your lenses will be relatively cool compared to your breath, especially when the outside air is cold.
Input: A fish is capable of thinking.
Knowledge: Fish are more intelligent than they appear. In many areas, such as memory, their cognitive powers match or exceed those of ’higher’ vertebrates including non-human primates. Fish’s long-term memories help them keep track of complex social relationships.
Input: A common effect of smoking lots of cigarettes in one’s lifetime is a higher than normal chance of getting lung cancer.
Knowledge: Those who consistently averaged less than one cigarette per day over their lifetime had nine times the risk of dying from lung cancer than never smokers. Among people who smoked between one and 10 cigarettes per day, the risk of dying from lung cancer was nearly 12 times higher than that of never smokers.
Input: A rock is the same size as a pebble.
Knowledge: A pebble is a clast of rock with a particle size of 4 to 64 millimetres based on the Udden-Wentworth scale of sedimentology. Pebbles are generally considered larger than granules (2 to 4 millimetres diameter) and smaller than cobbles (64 to 256 millimetres diameter).
Input: Part of golf is trying to get a higher point total than others.
Knowledge:
```
</details>

Knowledge 1:
```
The objective of golf is to play a set of holes in the least number of strokes. A round of golf typically consists of 18 holes. Each hole is played once in the round on a standard golf course. Each stroke is counted as one point, and the total number of strokes is used to determine the winner of the game.
```

Knowledge 2:
```
Golf is a precision club-and-ball sport in which competing players (or golfers) use many types of clubs to hit balls into a series of holes on a course using the fewest number of strokes. The goal is to complete the course with the lowest score, which is calculated by adding up the total number of strokes taken on each hole. The player with the lowest score wins the game.
```

次のステップは、知識を統合して予測を得ることです。質問の内容をQA形式に整形して、回答形式を導き出します。

Prompt:
```
Question: Part of golf is trying to get a higher point total than others. Yes or No?
Knowledge: The objective of golf is to play a set of holes in the least number of strokes. A round of golf typically consists of 18 holes. Each hole is played once in the round on a standard golf course. Each stroke is counted as one point, and the total number of strokes is used to determine the winner of the game.
Explain and Answer: 
```

Answer 1 (confidence very high):
```
No, the objective of golf is not to get a higher point total than others. Rather, the objective is to play a set of holes in the least number of strokes. The total number of strokes is used to determine the winner of the game, not the total number of points.
```

Prompt:
```
Question: Part of golf is trying to get a higher point total than others. Yes or No?
Knowledge: Golf is a precision club-and-ball sport in which competing players (or golfers) use many types of clubs to hit balls into a series of holes on a course using the fewest number of strokes. The goal is to complete the course with the lowest score, which is calculated by adding up the total number of strokes taken on each hole. The player with the lowest score wins the game.
Explain and Answer:
```

Answer 2 (confidence is a lot lower):
```
Yes, part of golf is trying to get a higher point total than others. Each player tries to complete the course with the lowest score, which is calculated by adding up the total number of strokes taken on each hole. The player with the lowest score wins the game.
```

この例では、実に興味深いことが起こりました。最初の答えでは、モデルは非常に自信を持っていましたが、2番目の答えではそうではありませんでした。デモのためにプロセスを単純化いたしましたが、最終的な答えにたどり着くまでには、さらにいくつかの詳細を考慮する必要があります。

## Automatic Prompt Engineer (APE)

![スクリーンショット 2023-03-18 16.44.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071889/ace981c2-3d8a-e1fd-9e49-f4954ff6d552.png)

Zhouら（2022）は、自動的な命令生成と選択のためのフレームワークであるAutomatic Prompt Engineer（APE）を提案しています。命令生成問題は、自然言語生成の一種として扱われ、候補解の生成と探索のために大規模言語モデル（LLM）を用いたブラックボックス最適化問題として扱われます。

最初のステップでは、大規模な言語モデル（推論モデルとして）がタスクに対する命令候補を生成するための出力実証を与えられます。これらの候補解は、探索手順の指針となります。ターゲットモデルを用いて命令を実行し、計算された評価スコアに基づいて最も適切な命令を選択します。

APEは、人間が設計した「step by step」プロンプト（Kojima et al., 2022）よりも優れたzero-shot CoTプロンプトを発見することができます。

「正確な答えを得るために、一歩一歩確かめていきましょう。」というプロンプトは、連鎖的推論を引き出し、MultiArithおよびGSM8Kベンチマークでパフォーマンスを向上させます。

本稿では、プロンプトエンジニアリングに関連する重要なトピック、すなわちプロンプトを自動的に最適化するという考え方に触れています。本ガイドではこのトピックに深入りすることはありませんが、このトピックに興味がある方は、いくつかの重要な論文をご覧ください。

https://arxiv.org/abs/2010.15980

https://arxiv.org/abs/2101.00190

https://arxiv.org/abs/2104.08691

## Active-Prompt

思考連鎖（CoT）手法は、人間が注釈を付けた固定された模範解答セットに依存しています。この問題点は、模範解答が異なるタスクに対して最も効果的でない可能性があることです。この問題に対処するために、Diaoら（2023）は最近、異なるタスク固有の例プロンプトに大規模言語モデル（LLM）を適応させる新しいアプローチであるActive-Promptを提案しました。このアプローチは、人間が設計したCoT推論で注釈されたものです。

以下は、そのアプローチの概要です。最初のステップは、LLMにいくつかのCoT例があるかどうかに関わらず質問を投げかけることです。k個の回答に基づいて、不確実性のメトリックが計算されます（不一致が使用されます）。最も不確実な質問が選ばれ、人間による注釈が付けられます。その後、新たに注釈付きの模範解答が、各質問の推論に使われるようになります。

![スクリーンショット 2023-03-18 17.37.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071889/59c69d23-9858-1338-0848-229f6d395898.png)

## Directional Stimulus Prompting
Liら（2023）は、大規模言語モデル（LLM）が望ましい要約を生成するのをより効果的に導くための新しいプロンプト技法を提案しています。

調整可能なポリシーLMがプロンプトやヒントを生成するために学習されます。LLMの最適化において強化学習（RL）がより多く使用されることが分かります。

下図は、Directional Stimulus Promptingと標準的なプロンプトとの比較を示しています。ポリシーLMは、ブラックボックス化されたLLMをガイドするヒントを生成するために、効率的に最適化することができます。

![スクリーンショット 2023-03-18 17.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071889/de3ec3cc-81cb-8f25-f9ae-293e823fef22.png)

## ReAct
大規模言語モデル（LLM）を使用して、推論トレースとタスク固有のアクションを交互に生成するフレームワークを紹介しています。推論トレースを生成することにより、モデルはアクションプランの誘発、追跡、更新を行い、さらに例外処理も可能になります。アクションステップでは、知識ベースや環境などの外部ソースとのインタフェースや情報収集が行えます。

ReActフレームワークにより、LLMが外部ツールと対話し、より信頼性の高い事実に基づく追加情報を取得することで、適切な応答を導くことができます。

![スクリーンショット 2023-03-18 17.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071889/396165b8-0c01-aed0-31a5-bb0980c80de3.png)

## Multimodal CoT Prompting

Zhangら（2023）は最近、マルチモーダルな思考連鎖プロンプティングアプローチを提案しています。伝統的なCoTは言語モダリティに焦点を当てているのに対して、マルチモーダルCoTはテキストと視覚を二段階のフレームワークに組み込んでいます。第1段階では、マルチモーダルな情報を基に根拠を生成します。その後、第2段階として、生成された根拠に基づいて回答推論を行います。

マルチモーダルCoTモデル（1B）は、ScienceQAベンチマークにおいてGPT-3.5を上回る性能を示しています。

![スクリーンショット 2023-03-18 17.42.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1071889/7320bb4d-a7ed-6c1c-0391-532be693650e.png)

# 終わりに
以上、Prompt Engineering Guideの一部を翻訳しました。この翻訳記事が皆さんのPrompt Engineeringを学ぶ一歩目になれば幸いです。

https://www.promptingguide.ai/