オッサンが5分で学ぶ【プロンプトエンジニアリング】

Copilotがどうとか言われ始めて不安になったオッサンが、学んだプロンプトをオッサン視点で解説します。
**（注）※誤解や主観が多く含まれている可能性がありますが、ご了承ください。**

以下のサイトに書かれているプロンプトの用語を要約しています。
https://www.promptingguide.ai/jp

---

## 基礎知識

**プロンプトの基本フォーマット**

**指示** ＋ **文脈**（前提条件）＋ **入力**（データ）＋ **出力**（のフォーマット）」
で構成する。

### 考慮事項

| 考慮事項 | 概要 |
|:-:|:-|
|具体性と明瞭性|人間に指示を与えるのと同様に、曖昧さは、予期せぬ結果につながる可能性がある|
|構造化された入力|JSONやXMLなどの形式を用いて入力を構造化することで、LLMの情報理解・処理能力が大幅に向上する。|
|構造化された出力|出力形式（リスト、段落、コードスニペットなど）を指定することで、回答の関連性が向上する。|
|構造強化のための区切り文字|特殊文字を区切り文字として使用すると、構造が明確に分離されるため、モデルの理解が向上する。|
|複雑な操作のためのタスク分解|LLMに複数のタスクを包含するプロンプトを提示するのではなく、単純なサブタスクに分解することで、モデルが各サブタスクに個別に焦点を合わせることができ、最終的な精度が向上する。|

---

### few-shot

複数の例を与えてLLMが出力を予測できるようにすること。
例を与えない場合は zero-shot、1つだけ与える場合は one-shot と呼ぶ。
続きの指示を繰り返し入力する手法を __Prompt Chaining__ と呼ぶ。

:::note info
確率パラメータを減らし、答えがわからない場合はそれを認める（たとえば、「わかりません」）ように指示することで、モデルが生成する応答の多様性を少なくすることができる。
:::
https://www.promptingguide.ai/risks/factuality

#### 例

```
わからなければ、わからないと答えてください
```


---

## zero-shot CoT (Chain-of-Thought)

「正しい答えを得るために、ステップバイステップで考えてみましょう。」という文言を追加する。(※)
__※zero-shot CoTでは「ステップバイステップで考えてみましょう」が使われる。__
　__"正しい答えを〜" は、より高いパフォーマンスを発揮するプロンプトとしてAPEで発見された。__

```
私は市場に行って10個のリンゴを買いました。隣人に2つ、修理工に2つ渡しました。それから5つのリンゴを買って1つ食べました。残りは何個ですか？
正しい答えを得るために、ステップバイステップで考えてみましょう。
```

:::note warn
すでにGPT-3.5以上では上記文言を入れなくてもCoTしてくれる。
しかしプロンプトとして入力すると明確にCoTを意識した回答を得られる。
:::

zero-shot CoTで期待回答が得られない場合、few-shotで多数の例を提示する。
これにより誤った推論を置き換える手法を __Self-Consistency__ と呼ぶ。


:::note info
「thought」は「ソーｔ」と発音し、日本語では「ソート」とは読みません。﻿
:::

---

## 知識生成プロンプティング＆RAG

LLMに前提とする（新しいルールなどの）知識を注入するプロンプト技法。
「このURLのドキュメントに基づき...」のような外部ソース参照には別名「RAG（Retrieval Augmented Generation）」がついている。
※RAGはVectorStoreのような外部ソースとの接続するケースでよく使われる。

```
質問：ゴルフの一部は、他の人よりも高いポイント総数を得ようとすることです。「はい」か「いいえ」？
知識：ゴルフの目的は、できるだけ少ない打数で一連のホールをプレイすることです。通常、ゴルフのラウンドは18ホールで構成されます。1回のホールは、標準のゴルフコースに1回プレイされます。各打数は1ポイントとしてカウントされ、総打数がゲームの勝者を決定するために使用されます。
説明と回答： 
```

---

## Tree of Thoughts (ToT)

（正確には論文を見るべきだが）人間がLMに追加条件を与えることで、中間回答を自己評価させる。
LM版の壁打ち（LMの1回目の回答→条件を付け加えて再回答→期待値になるまで繰り返し）のこと。

#### プロンプト例

```
この質問について、3人の異なる専門家が回答していると想像してください。
すべての専門家は、自分の思考の1つのステップを書き留め、
それをグループと共有します。
その後、すべての専門家は次のステップに進みます。以後同様です。
もし専門家の中に、いかなる時点で誤りに気づいた場合は、退場します。
質問は...
```

---

## PAL（プログラム支援言語モデル）

:::note info
このプロンプトはプログラマがAIを用いた開発について洞察を得られると思い紹介に含めました。
:::

PAL（Program-Aided Language models）は、言語モデルがプログラムを生成し、その実行結果を用いて問題解決を行う手法です。

```
5人で2万円を割り勘する。負担割合を一人ずつ乱数で決定する前提でPythonプログラムを生成し、結果を1つ例示
```

他にも、以下のような考え方があります。

| プロンプト名 | 効果 | 製品イメージ |
|:-:|:-:|:-:|
| Automatic Reasoning and Tool-use (ART) & ReAct | タスク入力→Agentがツールの使用を求める→ツールが呼ばれる度に一時停止→ツール出力を統合する | Copilot Agent |
| 自動プロンプトエンジニア（APE） | 検索キーワード入力→検索手順を指導→評価スコアに基づいて次の指示を選択 | Perplexity(Proサーチ) |
| Active-Prompt | CoT例をいくつか含めて問い合わせ→k個の可能な回答が生成される→不確実な質問が人間によって注釈付け→新しい注釈付きの例を推論に利用 | (？) |
| 方向性刺激プロンプティング | 小さなポリシーLMを用意→入力をフィルタ→LLMを誘導するヒントを生成  | Copilot等（知財の回答を抑止など） |
| Reflexion | a) タスクを定義する、b) 軌跡を生成する、c) 評価する、d) 反省を行う、e) 次の軌跡を生成する | (?) |

---

## Prompt Function

プロンプトに関数名をつけて再利用する。

```
Memorize the following Prompt Function

function_name: [trans_word]
input: ["text"]
rule: [Translate input text from any language to Japanese]
```

```
trans_word('婆罗摩火山处于享有“千岛之国”美称的印度尼西亚. 多岛之国印尼有4500座之多的火山, 世界著名的十大活火山有三座在这里.')
```

---

## マルチモーダルCoTプロンプティング

テキストとビジョンを2段階のフレームワークに組み込んでいます。最初のステップは、マルチモーダル情報に基づく理由生成です。これに続いて、情報量の多い生成された理由を活用した回答推論が行われます。

![Prompt Engineering Guide](https://www.promptingguide.ai/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmultimodal-cot.a84f6cc1.png&w=1920&q=75)
(引用元) https://www.promptingguide.ai/jp/techniques/multimodalcot