各種Prompt Engineeringの日本語実例集（Zero-CoT、mock、ReAct、ToT、Metacog、Step Back、IEPなど）

CoT、Zero-CoT、ToT、mock、ReAct、Step Back、Metacog、IEPなど、各種Prompt Engineering手法の概説と、日本語での実際のプロンプト例をまとめた記事です。

各種Prompt Engineering手法を日本語で実装したい方向けの記事となります。

<br>

本記事で取り扱う手法は以下の通りです。

項目数が多いため、記事右下の目次リンクもご活用ください。

<br>

**本記事の内容**
01: 通常のPrompt
02: Few-shot Learning
03: CoT（Chain of Thought）
04: 出力形式の指定方法
05: Zero-shot CoT（≒ step by step）
06: bothinst
07: mock
08: ReAct
09: ToT（Tree of Thoughts）
10: Metacognitive Prompting
11: Step Back
12: IEP（Inferential Exclusion Prompting）
13: 本記事の参考文献

# はじめに

ネット上では、マーケティング用プロンプト集やデザイン用プロンプト集など、用途を切り口にした記事を多く見かけます。

しかしPrompt Engineeringの観点で各論文ごとの手法をまとめている情報は少ないと感じています（とくに日本語でのプロンプト例が少ない）。

そこで本記事では、各種手法について、その概説とプロンプト例をまとめております。

<br>

【注記】
1. 本記事ではLLMに、Azure OpenAIの「gpt-35-turbo」を使用しています

2. LLMパラメータのうち、```温度（Temperture）= 0```、```上位P = 0```に設定して、極力ランダム性を排除しています

3. プロンプト例は見やすいように改行を入れています。実際にプロンプトを使用する際は不要な改行は削除してください









# 各種Prompt Engineering手法の解説

## 01: 通常のPrompt

通常のプロンプトは、**「Zero-Shot Prompting」** とも呼ばれます。

Zero-Shotと言う名の通り、プロンプトに例は記載しません。

いきなり処理内容を記載して依頼します。

<br>

本記事では参考文献 [1] で使用されている、**「キャリアカウンセラーが、ユーザーが提示した仕事内容について、新卒向けか、中途向けかを判定する」** という文脈でプロンプトの日本語実例を構築してみました。その内容を紹介します。

通常のプロンプトの場合、[1]の英語でのプロンプトを日本語に翻訳すると、次の通りです。

```
以下の仕事について
{job_posting}
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。
答え: 
```

上記のプロンプトの```{job_posting}```部分には、具体的な「仕事内容」を変数で与えます。

適当にオリジナルな仕事・職務を定義します。

例えば変数```{job_posting}```の中身は以下の通りです（このあたりから著者が全部適当に架空の内容にしています）。

```
SIerにおいて先輩社員が構築マネジメントした部分について、
手作業で実施しなければいけないテストを実施する仕事です。
とくに専門的な知識は必要とせず、テストに必要な情報は事前に提供されます。
```

この場合、プロンプトの完成系は以下のようになります。

```
以下の仕事について
SIerにおいて先輩社員が構築マネジメントした部分について、
手作業で実施しなければいけないテストを実施する仕事です。
とくに専門的な知識は必要とせず、テストに必要な情報は事前に提供されます。
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。
答え:
```

上記のプロンプトに対するLLM（GPT3.5 turbo）の回答は、```(A) 新卒に適した仕事``` と、なりました。


<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/a70974da-5123-6057-6152-557d2348471f.png)

<br>

上図の「Azure OpenAIプレイグラウンドのスクリーンショット」でのLLMの回答を確認すると、選択肢が記述されたあと、その理由が続いています。

ここでLLMから選択肢だけを回答して欲しい場合は、出力形式の制御を行います（制御方法は第4節にて解説）。



## 02: Few-shot Learning

Few-shot Learningではプロンプトにいくつか実際の質問と回答例のペアを記載する手法です。

**プロンプトに質問と回答の例を1つから複数個記載した上で、本番の質問を記載します。**

先ほどの01の仕事内容とその判定結果を質問-回答例として、Few-shot Learningのプロンプトを構築すると、以下の通りです。


```
以下の仕事について
SIerにおいて先輩社員が構築マネジメントした部分について、
手作業で実施しなければいけないテストを実施する仕事です。
とくに専門的な知識は必要とせず、テストに必要な情報は事前に提供されます。
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。
答え: (A) 新卒に適した仕事

以下の仕事について
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。
答え: 
```

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/823afbc9-2e18-1d3c-0615-e2243ff2fe4a.png)


<br>

上図のように、```(B) より専門的な経験を必要とする仕事``` と回答してくれます。

**例をひとつ示したので、回答の形式も制御できています。**

Few-Shot Learningは本例のように、回答形式の制御手段としても（ぼちぼち）使えます。

**しかし、Few-Shot Learningの目的は、回答性能自体の向上になります。**


<br>

今回はひとつだけ例をプロンプトに記載しました（One-Shotと呼びます）。

<br>

参考文献 [2,3] によると、


- Zero-Shotに比べ、1例追加しただけのOne-Shotで一気に性能が上がる
- One-Shot以降はExampel数に応じて線形に性能が上がるわけではない
- Few Shot Learningの性能はモデルサイズに対して線形に効果が上がる

という性質があるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/9e116a4a-994c-013a-44eb-ae76acaa6e3b.png)

<br>

本記事の例題（仕事分類）は簡単な内容なので、One-Shotの例なしに、Zero-Shotのプロンプトでも解けます。

**しかしながら、「Few-Shot Learning」を使えるようになっておくのは重要だと考えています。**

<br>

Few-Shot Learningは、上記に示したプロンプト例のように、プロンプト自体に書き込む方法もあれば、以下のように会話の履歴として変数に書き込んで用意し、その続きをLLMにcompletionさせる方法もあります（結局はプロンプトになっているのですが）。

```python
messages=[
{"role": "user", "content": <ask1>},
{"role": "assistant","content":<ans1>},
{"role": "user", "content": <ask>}
]
```

それでは続いて、CoTの解説に移ります。


## 03: CoT（Chain of Thought）

CoT（Chain of Thought）[4] は、日本語では「思考の連鎖」と呼ばれることが多いです 。

**CoTは、LLMに「段階的に」推論を行わせることで、高度な推論タスクを可能にするPrompt Engineering手法です。**

<br>

CoTを行うには、この段階的な推論の例を記述する必要があり、必ず1例はサンプルを記載することになるため、必然的にFew-shot Learningでもあります。

<br>

再度、文献 [1] を参考にします。

**プロンプトに「段階的に推論した例」を与え、同じ様に段階的に推論させます。**

今回はその仕事・職務に必要な「経験」というのを1段目に推論させ、そのうえで「新卒向けか否か」を推論させる流れにしました。

CoTのプロンプト例を以下に示します。

```
以下の仕事について
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。
最初にこの仕事に実施するのに必要な経験を述べてください。
そして仕事に必要な経験を踏まえたうえで、答えを教えくてださい。
必要な経験：この仕事は、厳しい環境での経営陣（Cクラスマネジャー）のステークホルダーとの
やりとりの経験が必要だと考えらます。
答え: (B) より専門的な経験を必要とする仕事

以下の仕事について
SIerにおいて先輩社員が構築マネジメントした部分について、
手作業で実施しなければいけないテストを実施する仕事です。
とくに専門的な知識は必要とせず、テストに必要な情報は事前に提供されます。
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。
最初にこの仕事に実施するのに必要な経験を述べてください。
そして仕事に必要な経験を踏まえたうえで、答えを教えくてださい。
仕事に必要な経験を踏まえたうえで、答えを教えくてださい。
```

結果は以下の通りです。

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/961b1ed3-3eb0-770b-7fcb-14311bcfcf37.png)


<br>

```
必要な経験：この仕事では、専門的な知識や経験は必要とされず、
テストに必要な情報が事前に提供されるため、特別な経験は必要ありません。

答え: (A) 新卒に適した仕事
```


と、LLMが答えだけでなく、**その答えに至る思考過程（thought）を回答してくれました（今回は職務に必要な経験を明示的に指定しています）。**

この例ではthoughtが「1 step」ですが、「Chain of Thougt」という名の通り、思考過程が多段のとき、よりその能力を発揮します。

---

**[補注]**
プロンプト内で「自社システム」と記載している部分は、自社から提案するシステムのことを「自社システム」と短縮記載しています。自分の会社で使用しているシステムという意味ではないことは文脈上では、人間には分かりますが、わざと分かりづらくしています。

---

次に出力形式を指定するPrompt Engineeringを解説します。

## 04: 出力形式の指定方法

出力形式の指定にはいろいろな方法があります。ここでは参考サイト [5] よりその方法を紹介します。

**以下の出力形式に従ってください、と記載し、そして実際の出力形式を記載します。**


これで出力形式に従わない場合は、「必ず従ってください」などより強い文章にしてみるなどの工夫もあります。

<br>

本記事の1つ目に紹介した「通常のPrompt」について、回答を選択肢のみに制御し、後から理由などの回答をさせないようにしてみます。

出力形式を制御するプロンプトの例

```
以下の仕事について
SIerにおいて先輩社員が構築マネジメントした部分について、
手作業で実施しなければいけないテストを実施する仕事です。
とくに専門的な知識は必要とせず、テストに必要な情報は事前に提供されます。
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。

以下の出力形式に従って回答してください。
  
###出力形式    
答え：答えを記載
```

<br>

すると以下のような回答となり、きちんと、```答え：(A) 新卒に適した仕事```と、選択肢のみを出力する形式に制御できています。

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/5062380d-b53a-78db-fe07-7a3ce7d3c724.png)


<br>

出力形式の制御手法はいろいろとありますが、**まずはFew-Shot Learning＋明示的に出力形式を指定する**、が一番シンプルであり、試したい方法となります。

<br>

再度、CoTの話に戻り、次は思考過程をサンプル例として記載しないPrompt Engineering手法を紹介します。




## 05: Zero-shot CoT（≒ step by step）

Zero-shot CoT（Chain of Thought）は **「CoTとは異なり、プロンプト内に推論ステップの例示なしで、段階的に推論させる方法」** です [6]。

<br>

**[補注]** こちらの論文は [6] は松尾研の小島さんが1stであり、日本発のLLM系の論文では非常にインパクトが高い論文の一つに感じています。

<br>

Zero-shot CoT（≒ step by step）は、推論段階の例示をなしにするために、**プロンプトに「step by step」と記載し、プロンプト自体に段階的に推論せよ、と明示します。**


また、最近では、**「Take a deep breath」** も合わせて使用すると、さらに良くなる例も示されています [7]。

<br>

プロンプトには、```Take a deep breath and work on this problem step-by-step.```と追加します。これだけでZero-shotでもLLMがより良い感じに回答してくれると提案されています。



---

**注意**
「think step by step」や「Take a deep breath」をプロンプトに加えるとなぜ良くなるのか、きちんとした理由・証明を、著者（私）は見たことがありません。

私が英語圏で育っていないので分からないのですが、**「英語の文章にはこうした文言が要所・要所で使われているからなのかな？」** と思っています。

そのため、日本語の処理でもこれらのプロンプトを追加するだけで性能が大幅アップするのかは不明です（確かめている論文も見たことがなく、誰がご存知であれば教えて下さい）。

---

この、```Take a deep breath and work on this problem step-by-step.```のプロンプトへの追加方法ですが、
- 英語のまま追加
- 日本語に直訳
- 日本語に意訳

の3パターンが考えられます。

著者は、GPT-3.5以降であれば、日本語、英語が混在していてもよしなに処理してくれるので、英語のままプロンプトに記載するのが良いと感じています。

無理に日本語直訳すると、良くない気がします。同じ意味の日本語に意訳して使用するのは良いかもしれません。本節の後半で試してみます。

<br>

では、Zero-shot CoT（≒ step by step）のプロンプト例を以下に示します。

今回は仕事内容に経験が必要そうな新卒では難しそうな方を使用しています。


```
以下の仕事について
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。
Take a deep breath and work on this problem step-by-step.
以下の出力形式に従って、回答してください。
  
###出力形式    
必要な経験：業務に必要だと思われる経験を記載    
答え：答えを記載  
```

<br>

結果、以下のように必要な経験について回答してくれました（Zero-Shotでも常識的に？考えて）

<br>



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/199ae02b-ec45-a215-a2a2-5edcac769ecc.png)

```
必要な経験：顧客企業の経営陣とのコミュニケーション能力、ビジネス知識、営業経験、
システム導入に関する知識
答え：(B) より専門的な経験を必要とする仕事
```


<br>

なお、上記のプロンプトから

[A] Take a deep breath and work on this problem step-by-step.の1文を抜いた場合

[B] 深呼吸をして、この問題に一歩一歩取り組んでください。と日本語に直訳した場合

[C] ゆっくりと落ち着いて、そして段階的に考えて取り組んでください。と日本語にした場合

の3通りの回答は以下のようになりました。

<br>

[A]

```
必要な経験：ビジネスコンサルティングや営業経験、
企業のシステム導入に関する知識や経験が必要とされます。

答え：(B) より専門的な経験を必要とする仕事
```


[B]

```
必要な経験：顧客企業の経営陣とのコミュニケーション能力、自社システムの知識、営業経験、
プレゼンテーションスキル
答え：(B) より専門的な経験を必要とする仕事
```

[C]

```
必要な経験：顧客企業の経営陣とのコミュニケーション能力、自社システムの知識、営業経験、
プレゼンテーションスキル
答え：(B) より専門的な経験を必要とする仕事
```


<br>

[A] の1文がない場合はダメですね。

[B]、[C]は同じ様な回答になりましたが、英語をそのまま使用していた時は、

「システム導入に関する知識」と記載されていましたが、今回は **「自社システムの知識」** と記載されています。

SIerが販売したいシステム導入であって、自身の会社の自社システムの知識は不要です（前節の補注で解説した通り）。


以上より、Zero-shot CoT（≒ step by step）をする場合は、

- 直訳は良くない
- 無理に日本語にしても微妙そう。。。

<br>


**たとえ日本語の文章を扱っていても、（gpt-35-turboの場合は）、Take a deep breath and work on this problem step-by-step. と英語で入れるのが良さそう**


となりました。

Zero-shot CoT（≒ step by step）は、1文追加するだけであり、悪影響もほぼ考えられないので、これ以降のPrompt Engineeringnの論文では基本的に含まれている手法となっています。

## 06: bothinst

「bothinst」は参考文献[1]で命名されている手法ですが、OpenAIのAPIとしては一般的な話になります。

具体的には、**「プロンプトに依頼内容を全て書くのではなく、果たして欲しい役割とタスクの概要はroleのsystem message（content）に記載し、実際の具体的タスク内容はroleのuserのmessage（content）にと、分割して書きましょう」**、という手法が「bothnist」です。

<br>

GPTシリーズは昔のAPIや、OSSのLLMの場合がそうなのですが、APIの入力形式が単に「文章入力」になっている場合にはこの「bothinst」を活用すると良いでしょう。

またGPTシリーズのようなAPI形式、roleとcontextに分ける方法はセキュリテイ面でも重要です（おそらく、そのためにGPTシリーズのAPI形式は途中で変更されました。JSON形式にし、roleとcontextに分けないと、sytem messageのプロンプトなどがリークしていました）。


参考文献[1] では「bothnist」形式にすることで性能が一気に向上しています。

<br>

ただし本記事でははじめからGPT-35-Turboを使用しているため、「bothnist」になっています。

ここまでroleのsytem message（content）は、デフォルトの

```You are an AI assistant that helps people find information.```
を使用していました。

ここを以下のように書き換えます [1]。

```
You are an AI expert in career advice. You are
tasked with sorting through jobs by analyzing their content
and deciding whether they would be a good fit for a recent
graduate or not.
```

日本語の場合は以下とします。

```
あなたはAIによるキャリアアドバイスの専門家です。
あなたは役割は、提示された仕事について、その内容を分析し、
新卒者に合うか合わないかを判断することです。
```

このようにsystem messageを書き換えると回答はどのように変化するのでしょうか？

---

**【注記】**
system messageについては日本語の文章をメインに扱う場合でも、日本語と英語とどちらが良いのかは、私には判断がついていません。 GPT3.5以降であれば英語の方が良いのでは？という感覚を個人的には持っています。

実際には、運用するシステムで日本語の場合と英語の場合でテストするのが良いでしょう。


---

それでは、「bothinst」として、日本語で上記のsystem messageを与え、step by stepなしでは微妙であったプロンプトを使用してみます。

```
以下の仕事について
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。
以下の出力形式に従って、回答してください。
  
###出力形式    
必要な経験：業務に必要だと思われる経験を記載    
答え：答えを記載 
```

<br>

結果は以下の通りです。少し良くなった感はありますが、そこまででもなく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/32d2c0b4-58b5-fa50-c604-f4d5794945e6.png)


<br>

英語の場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/4b9b1a7c-6adb-99dc-fdf2-b3413ee72240.png)

<br>

日本語より英語でのsystem messageの方が良い回答になっています（不十分ですが）

<br>

以上、「bothinst」の紹介でした。

**「bothinst」は、OSSのLLMを使用する場合には非常に重要になる手法となります。**

続いては同じく論文[1] で性能向上に貢献していたmockを紹介します。

## 07: mock

以降、system messageはdefaultの、
```You are an AI assistant that helps people find information.```に戻します。


「mock」も参考文献[1]で、命名されている手法です。

論文中で「mock」とは

「Give task instructions by mocking a discussion where it acknowledges them」
と紹介されています。

**mockという英単語の意味は、「模擬、演習」です。**

<br>

そのため、mockというPrompt Engineering手法とは、**ユーザーとLLMの間で演習し、承諾したディスカッション内容に沿って、指示を与える手法** となります。

これだけを聞くと、CoTと同じ？と思うかもしれませんが、実施するタスク内容についてメッセージを1往復させてから本番のタスクに入るという内容であり、異なります。

- CoTは推論の段階、手順をユーザーがプロンプト内に記述する
- mockはユーザーが実施するタスクをLLMに確認し、自身に実施する内容を承諾・発言させる

となります。

<br>

具体的には、会話の最初にuserから

```
新卒者にふさわしい仕事とは 下級職で、豊富な職業経験を必要としない仕事です。
私は仕事の情報を渡します。
あなたはその仕事が新卒者に適したものであるかどうかを分析し、
新卒にふさわしいポジションかどうかを判定します。
分かりましたか？
```

と与え、asssistantの回答として

```
はい、理解しました。提供された職務内容が新卒者に適しているかどうかを判定します。
```

と、一度、役割とタスクについて内容を一度再確認するメッセージを一往復させておきます。

そのため、CoTよりはbothnistに近いかもしれません。

<br>

それではmockのプロンプト例を紹介します。

```
以下の仕事について
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。
以下の出力形式に従って、回答してください。
  
###出力形式    
必要な経験：業務に必要だと思われる経験を記載    
答え：答えを記載 
```

と尋ねると、以下のように、より、しっかりとした回答になります

（Azure OpenAIのチャットプレイグラウンドで、会話を手動で一往復させれないので、左下の例に入れています。これで会話1往復の代わりにはなっていないかもしれませんが、ひとまず）。


<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/2a4fd4de-9727-8319-34a2-2b102cd4143e.png)


<br>

回答は以下の通りです。回答内容に「顧客との関係構築能力」が追加されています。

```
必要な経験：コンサルティングや営業の経験、ビジネス知識、プレゼンテーションスキル、
顧客との関係構築能力などが必要とされます。

答え：(B) より専門的な経験を必要とする仕事
```

Azure OpenAIプレイグラウンドで会話を手動で1往復できないので、上記結果が正しいとは限りません。

ただ、少し良くなった気がします。

---
[補注]

著者（私）の感覚。

この「mock」やこれ以降のPrompt Engineering手法（ReAct、ToT、Metacog、Step Back、IEPなど）について共通するのですが、**LLMに自ら、これから自分がやることやその関連情報を回答させる（文字出力させる）** という点が非常に重要だと感じています。

LLMは汎用人工知能でもなんでもなく、ただのどでかいベイジアン推論器であり、訓練データをベースにTransformer機構でベイジアン計算し、プラス、**与えられたプロンプトと自分の出力から、次に出力するべき文字（トークン）を順番に選択しているだけです。**

この自己回帰的な手法において、自分でこれからやるタスクの情報をLLMに一度出力させる行為はかなりの影響力を持つのではと思っています（その自分の出力に、その後の自分の出力が自己回帰的に引っ張られる）。このエッセンスが様々な良いPrompt Engineeringに繋がっていると（著者は）考えています

<br>

それでは、次にReActについて解説・日本語実例を紹介します。


## 08: ReAct

**ReActは、「Reason（判断理由）≒Thought（思考・推論）」と「Action（行動）」を交互に繰り返すPrompt Enginearing手法です。**

とくにActionを何度も繰り返すLLMにおいて頻繁に使用されます [8, 9]。


<br>

今回のお題は繰り返し行動をしないのでReActには適していないのですが、試してみましょう。

プロンプトは
・Thought（思考・推論）、Action（判断・行動）、Observation（観察・洞察）を繰り返すように指示
・Few-Shotで例をいくつか提示

という構成になります。

```
ユーザーからの質問に対して、
1. Thought（思考・推論）、2. Action（判断・行動）、3. Observation（観察・洞察）
の3ステップを繰り返し、最終的に回答してください。

例
以下の仕事について
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。

1. Thought（思考・推論）: 
この仕事は、厳しい環境での経営陣（Cクラスマネジャー）の
ステークホルダーとのやりとりの経験が必要だと考えらます

2. Action（判断・行動）: 
新卒には難しそうだ

3. Observation（観察・洞察）:
他にもシステム導入の知見も必要ではないであろうか。

答え：(B) より専門的な経験を必要とする仕事


以下の仕事について
SIerにおいて先輩社員が構築マネジメントした部分について、
手作業で実施しなければいけないテストを実施する仕事です。
とくに専門的な知識は必要とせず、テストに必要な情報は事前に提供されます。
---------
この仕事は
(A) 新卒に適した仕事
(B) より専門的な経験を必要とする仕事
のどちらですか。
なお、以下の出力形式に従ってください。          
      
###出力形式
1. Thought（思考・推論）：仕事に必要な経験を検討
2. Action（判断・行動）：新卒に適しているかいないかの判定
3. Observation（観察・洞察）：Actionの結果について洞察を記載
答え：答えを記載
```

結果は以下の通りです。

今回は行動がなく外界が変化しないため、CoTとほぼ結果は変わらないのですが、**ActionでLLMの外部・内部環境が変化する場合に、Observationが本質的な機能を果たします**。

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/c9154f28-c72e-dd33-2d27-94e20b02c08d.png)



<br>


ReActは、行動を繰り返す場合に効果的である点を覚えておいてください。
（Langchainは基本ReActを実施しています）


## 09: ToT（Tree of Thoughts）

思考の木（Tree of Thoughts、ToT）と呼ばれるPrompt Engineeringです。

その名前の通り、Chain of Thought（CoT）と似た概念です。

**ToTとCoTの異なる点は、CoTが推論経路（chain）が一本道に対して、ToTは複数の推論経路（Chain）を保持し、最終的な回答を得る手法です（グラフの探索に似ている）** [10, 11]。

最初に提案されたときはグラフ探索アルゴリズムと併用していましたが、単純にPromptだけで実現する方法も提案されています [12]。

<br>

ToTのプロンプト例（簡易版）は以下のようになります。

```
3人の異なる専門家がユーザーの「質問」に回答すると想定してください。
すべての専門家が自分の考え方の1ステップを書き出し、それをグループで共有します。
次に、すべての専門家が次のステップに進みます。
どの専門家も、どこかの時点で他の専門家の回答の方が正しく、
自分の回答が間違っていることに気づいたら、その時点で退出します。
すべての専門家が回答し、退出した後、あなたは全専門家の回答をすべて分析し、
合意された回答、もしくはあなたの最良の回答を提示してください。

「質問」
以下の仕事について          
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、       
システム導入を取締役会にて通していただくまでをコンサル営業する職務
---------
この仕事は
(A) 新卒に適した仕事          
(B) より専門的な経験を必要とする仕事  
のどちらですか。  
以下の出力形式に従って、回答してください。        
      
###出力形式
専門家1の意見：各専門家の推論です
専門家2の意見：各専門家の推論です
専門家3の意見：各専門家の推論です
（※上記の意見は各専門家が退出するまで繰り返されます）
最終回答：答えを記載
```


結果は以下の通りです。

専門家1と3は(B) のより専門的な経験を必要とすると回答しましたが、専門家2は新卒が良く、その理由を「新鮮な視点と柔軟なアプローチが必要だから」としています。

それが新卒にできるか？はともかく、その観点そのものは的外れではないと感じるところです。

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/3f4cae3c-96bb-8ec8-3adf-6178e3da9263.png)


<br>

**最終的には(B)の、より専門的な経験を必要とする仕事が選択されました。**

回答形式（フォーマット）が、これまでの想定からはずれてしまいました。

この点はプロンプトをもう少し工夫すれば修正できるでしょう。

上記のToTはひとつのLLMで複数の専門家を担わせていますが、マルチエージェントで会話を回す場合にはさらに良い結果になる（と思われます）。

<br>

**またToTは推論が多段で複数分岐に分かれる場合の網羅性・探索性のためのPrompt Engineeringというのが本質であるため、本記事の用途では微妙なところがあります。**

より多段で複雑な問題の推論・回答でその能力を発揮するでしょう。


## 10: Metacognitive Prompting

Metacognitive Promptingは日本語では「メタ認知プロンプティング」とも呼ばれます。

**人間がメタ認知をするときの過程に沿って、LLMを動作させる手法となります。**

少し複雑な図ですが、以下の5項目から構成されます [13, 14]。

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/6b9a9be4-ca08-2251-231c-93d07a07a74a.png)

<br>

重要な点は、人間は、
- Self-understanding（自己認識）
- Reflection（振り返り・考察）
- Self-regulation（自己統制・修正）
の3 stepでメタ認知を実現している点です

（上記の日本語訳が臨床？での専門用語と一致していない点はご容赦ください）

<br>

要はLLMに、
1. ●●と理解し回答した（自己認識）
2. ●●と理解し回答したが、本当にそうなのか？（振り返り・考察）
3. ●●と理解し回答したが、改めて考えるとこういう理由でやはり回答はこうである（自己統制・修正）

的な流れになります。

<br>

本家論文 [13] では5往復の会話で構成されていますが、ちょっと面倒で大変なので、以下には3つに短縮したプロンプト例を示します。



```
あなたはユーザーが質問する仕事内容について、
(A) 新卒に適した仕事          
(B) より専門的な経験を必要とする仕事  
のどちらなのか、判定して回答します。

あなたは最初に判定とその理由を回答します（Preliminary Judgment）。
次にあなたは、自分の判定理由に対して、批判的な評価を回答します（Critical Evaluation）。
そして最後に、最初の判定理由と批判的評価の両面を考慮し、
最終的な回答を判断し、その理由を答えます。
またその回答に関する自信（confidence）について、(0 – 100%)で回答します。

「質問」
以下の仕事について          
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務          
---------          
この仕事は          
(A) 新卒に適した仕事          
(B) より専門的な経験を必要とする仕事  
のどちらですか。  
以下の出力形式に従って、回答してください。         
      
###出力形式          
最初の判定：答えを記載
最初の判定の理由：最初の判定をした理由を記載
批判的評価：最初の判定理由に対する批判的評価を記載
最終的な答え：最初の判定理由と批判的評価の両面を考慮した最終的な回答
最終的な答えの理由：最初の判定理由と批判的評価の両面を考慮した最終的な理由を記載
最終的な答えに関する自信：(0 – 100%) で記載
```

<br>

以下のようにきちんと、出力形式通りに回答してくれました。

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/8deba131-f6b2-c732-03af-61e7bb5688c1.png)

<br>

回答部分を抽出します。

```
###出力形式
最初の判定：(B) より専門的な経験を必要とする仕事
最初の判定の理由：この仕事は、顧客の経営陣に対して自社システムの重要性を解説・納得して
いただき、システム導入を取締役会にて通していただくために、高度な専門知識と経験が必要です。
顧客の経営陣に対して説得力のあるアプローチを行い、
システムの利点やROI（投資収益率）を的確に説明する必要があります。

批判的評価：この仕事は新卒にも適した仕事と言えるかもしれません。
新卒が研修やトレーニングを受けて専門知識を習得し、経験を積むことで、
将来的にこの職務を遂行する能力を持つことができる可能性もあります。

最終的な答え：(B) より専門的な経験を必要とする仕事
最終的な答えの理由：この仕事は高度な専門知識と経験が必要であり、
顧客の経営陣に対して説得力のあるアプローチを行う必要があります。
新卒はまだ経験や実践の機会が少ないため、この職務を遂行するには専門的な経験を積む必要があります。

最終的な答えに関する自信：80%

```


最初の判定と批判的評価の両面を述べ、それを統合し最終的な結論を解説し、その確信度を80%と回答しています。

<br>

**ここで、回答の確信度80%が高いのか低いのか？は不明です。**

検証データセットで確信度と正解率などの指標の関係性を確認する必要があります。

そのうえで、確信度を変数にし、アプリケーション内で確信度が低い回答に関しては、別途処理や人間が直接再度確認するなどの手段をとると良いでしょう。


長い記事ですが、残るはあと2つ、Step BackとIEPになりました。





## 11: Step Back

Step Backとは、**LLMに対して、最初に「Abstraction（抽象化・法則化）」を行わせ、その後「Reasoning（推論・回答）」をさせる、という手法です** [15]。

Take a Step Backとも呼ばれます。


<br>

本記事の例ですと、(A) 新卒に適した仕事、か、(B) より専門的な経験を必要とする仕事 かを判断する法則、抽象化を回答させ、その上で、最終的に回答させます。

参考文献[15] の論文内では会話を2往復に分けていますが、今回は一往復版のプロンプトを以下に紹介します。

```
あなたはユーザーが質問する仕事内容について、
(A) 新卒に適した仕事          
(B) より専門的な経験を必要とする仕事  
のどちらなのか、その答えを回答します。

答えを回答するまえに、新卒に適した仕事なのか否かを判断するための、
一般的・普遍的な観点・ポイントについて回答してください。
その後、「質問」そのものに対する回答をしてください。

「質問」
以下の仕事について          
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務          
---------          
この仕事は          
(A) 新卒に適した仕事          
(B) より専門的な経験を必要とする仕事  
のどちらですか。  
以下の出力形式に従って、回答してください。         
      
###出力形式          
一般的・普遍的な観点・ポイント：新卒に適した仕事なのか否かを判断する普遍的なポイントを記載
答え：答えを記載
```


以下が回答例となります。少し小さくて見づらいので、回答部分を抜き出します。

<br>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/e774a98b-8067-ec2e-cfe4-a6fd3c47a0d5.png)

<br>


回答内容

```
一般的・普遍的な観点・ポイント：
新卒に適した仕事かどうかを判断するためには、以下のポイントを考慮することが重要です。

1. 経験や知識の有無：新卒の場合、まだ実務経験や専門的な知識が不足していることが多いため、
    初歩的な業務内容やトレーニングが提供される仕事が適しています。
2. 責任の度合い：新卒の場合、責任の度合いが高い仕事は適していないことがあります。
   組織やチームの一員として学びながら成長できる環境が望ましいです。

    回答：
    この仕事は、(B) より専門的な経験を必要とする仕事です。
    顧客の経営陣に対して自社システムの重要性を解説し、
    システム導入を取締役会にて通すためには、十分な専門知識や経験が必要とされます。
    新卒の場合、まだこれらの要件を満たすことが難しいかもしれません。
```

<br>

**このように「判断理由や使用した法則」をLLM自身に回答させる手法は、AIやLLMの解釈性・説明性・透明性に役立つ重要なポイントです。**

そのため、Prompt Engineeringの手法としてStep Backはぜひとも使えるようになっておきたい手法だと（著者は）感じています。


それでは最後にIEPについて実例を紹介します。

## 12: IEP（Inferential Exclusion Prompting）


**IEP（Inferential Exclusion Prompting）とは非線形な推論を可能にするPrompt Enginerring手法です** [16]。


参考文献 [16] のタイトルにLLMs' Non-linear Thinkingと記載されているように、線形ではなく、非線形な思考をさせるのですが、「思考の線形・非線形とはどういう意味ですか？」と疑問に感じるのが普通であり、よく分からないです。

<br>


論文読んで感じたことは、
- 一度考え始めると、そのままその方向に考えていくのを線形（な思考）
- 一度考え始めた、その方向が違うと思ったら、別の方向を考えることを非線形（な思考）

と表現しているようです。

<br>
論文中にも「人間の思考のように、LLMに推論させたい」と記載があります。

確かに人間も、一度「こうかな？」って考えて、「うーん、やはり違うな」と思い、考え直す。その試行錯誤の繰り返しをしています。

<br>

これをLLMのPromptで実現したいという手法がIEP（Inferential Exclusion Prompting）、直訳すると「推論しては除外するプロンプト」です。


IEPのプロンプト例は以下のようになります。


```
あなたはユーザーが質問する仕事内容について、
(A) 新卒に適した仕事          
(B) より専門的な経験を必要とする仕事  
のどちらなのか、その答えを回答します。

最初に、ユーザーが質問した仕事内容を、(A) 新卒に適した仕事だと仮定してください。
もしそれが本当に正しいとしたら、その前提は何になりますか？

次に、ユーザーが質問した仕事内容を、(B) より専門的な経験を必要とする仕事
だと仮定してください。
もしそれが本当に正しいとしたら、その前提は何になりますか？

次に、ユーザーが質問した仕事の前提を記載してください。

ユーザーが質問した仕事の前提とより一致するのは（A）と（B）のどちらか回答してください。
そして満たせていない選択肢を除外し、残った選択肢を答えとして回答してください。

「質問」
以下の仕事について          
顧客の経営陣に対して、自社システムの顧客企業における重要性を解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務          
---------          
この仕事は          
(A) 新卒に適した仕事          
(B) より専門的な経験を必要とする仕事  
のどちらですか。  
以下の出力形式に従って、回答してください。

###出力形式          
(A) が正しいとした場合の前提：(A) が正しいとした場合の前提を記載
(B) が正しいとした場合の前提：(B) が正しいとした場合の前提を記載
ユーザーが質問した仕事の前提：ユーザーが質問した仕事の前提を記載
前提に反していて除外する答え：前提をより満たせていない答え
答え：答えを記載
```
<br>


回答結果は以下の様子です。新卒に任せられる場合の前提とそうでない前提を回答し、そして排除される選択肢を選んで、残った選択肢を答えにしてくれています。

<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/d0a419e5-9679-0541-7df7-ae3db36c6ec0.png)


<br>

回答が長いので、文章を記載します。

```text
(A) が正しいとした場合の前提：新卒に適した仕事であるため、経験や専門知識は必要最低限であり、
入社後の研修や指導により業務を遂行できることを前提とします。

(B) が正しいとした場合の前提：より専門的な経験を必要とする仕事であるため、
顧客企業の経営陣とのコミュニケーション能力やビジネス知識、
システム導入に関する専門知識が必要とされます。

ユーザーが質問した仕事の前提：顧客の経営陣に対して、自社システムの顧客企業における重要性を
解説・納得していただき、
システム導入を取締役会にて通していただくまでをコンサル営業する職務です。

前提に反していて除外する答え：(A) 新卒に適した仕事

答え：(B) より専門的な経験を必要とする仕事
```

<br>

今回の例の場合、IEPの結果はStep Backと似ており、プロンプト自体も似ています。

**本来のIEPは回答の選択肢そのものをLLMに生成させ、その選択肢ごとに前提を確認し、より一致しているものを残して、前提（premises）から外れている選択肢を除外していきます。**

<br>

今回のお題ははじめから選択肢が与えられている＋2択問題であるため、Step Backと似たものになってしまいました。


**Step Backはその問題を解く一般法則を確認させる（問題の解き方に焦点が当たっている）**

対して、

**IEPは回答候補の各選択肢ごとにその前提を確認させる（回答候補に焦点が当たっている）**
（そして候補について一度「こうかな？」って考えて、「うーん、やはり違うな」と思ったものはexclusionする）

と、2つの手法は「焦点を当てている場所が異なる」という違いが重要です。



# さいごに

本記事を執筆途中に同じような想いの記事が公開されました。
こちらの記事もぜひご参考・ご一読くださいませ　:grinning:

[Qiita: LLMのプロンプト技術まとめ (2023年10月25日)](https://qiita.com/fuyu_quant/items/157086987bd1b4e52e80)

<br>

以上、ご一読いただき、ありがとうございました。

小川 雄太郎


# 参考文献

[1] Large Language Models in the Workplace: A　Case Study on Prompt Engineering for Job Type Classification [[link](https://arxiv.org/abs/2303.07142)]
[2] Language Models are Few-Shot Learners [[link](https://arxiv.org/abs/2005.14165)]
[3] [Flan-PaLMの学習に使われているpromptの手法を使ってAIに褒めてもらう](https://note.com/oshizo/n/nc694607c1593)
[4] Chain-of-Thought Prompting Elicits Reasoning in Large Language Models [[link](https://arxiv.org/abs/2201.11903)]
[5] [ChatGPTのプロンプトデザインの秘密を解明｜深津式・シュンスケ式・ゴールシークプロンプトを紹介](https://weel.co.jp/media/chatgpt-prompt-design)
[6] Large Language Models are Zero-Shot Reasoners [[link](https://arxiv.org/abs/2205.11916)]
[7] Large Language Models as Optimizers [[link](https://arxiv.org/abs/2309.03409)]
[8] ReAct: Synergizing Reasoning and Acting in Language Models [[link](https://arxiv.org/abs/2210.03629)]
[9] [ReAct Prompting: How We Prompt for High-Quality Results from LLMs | Chatbots & Summarization](https://www.width.ai/post/react-prompting)
[10] Tree of Thoughts: Deliberate Problem Solving with Large Language Models [[link](https://arxiv.org/abs/2305.10601)]
[11] Tree of Thoughts (ToT) [[link](https://www.promptingguide.ai/jp/techniques/tot)]
[12] [Hulbert (2023), tree-of-thought-prompting](https://github.com/dave1010/tree-of-thought-prompting)
[13] Metacognitive Prompting Improves Understanding in Large Language Models[[link](https://arxiv.org/abs/2308.05342)]
[14] [メタ認知をさせてLLMの能力を上げる手法「メタ認知プロンプティング」](https://aiboom.net/archives/54435)
[15] Take a Step Back: Evoking Reasoning via Abstraction in Large Language Models
[[link](https://arxiv.org/abs/2310.06117)]
[16] Eliminating Reasoning via Inferring with Planning: A New Framework to Guide LLMs' Non-linear Thinking [[link](https://arxiv.org/abs/2310.12342)]

<br>

【免責】
本記事の内容は執筆者の意見/発信であり、執筆者が属する企業等の公式見解ではございません