【生成AI再入門】プロンプトエンジニアリングについてまとめてみた


# はじめに

最近では違和感なく、業務中のアイディア出しや文章要約などに ChatGPT 等の対話型生成 AI サービスを使ったりしているが、なんか期待した結果が得られないなー、使いこなせてないなーと感じることも多々ある。

そこで、「もうちょっとプロンプトエンジニアリングの勘所をつかみたいな」と思い、軽く情報をまとめておく。

# プロンプトエンジニアリングとは？

`gpt-4o`や`Claude 3.5 Haiku`などの大規模言語モデル（LLM）に対して何らかの指示を与えて、テキストや画像といったアウトプットを出力してもらう対話型 AI サービス（ChatGPT など）が当たり前のように日常で利用されるようになってきている。

期待するアウトプットを得るために、何をしてほしいか（指示）や詳細な情報（前提）を与えるためのインプットをプロンプトと呼ぶ。

プロンプトエンジニアリングは、生成 AI の特性を理解し、より効果的なプロンプトを作成するための知識・技術のことを指す。

プロンプトエンジニアリングをスキルを身につけることは LLM の特性を理解してよりよいパフォーマンスを引き出すために重要。

テキストの場合に LLM がやっていることは、実はインプットとなる情報から続きのワードを精度高く推測している。

だから「空が」だけインプットとすると「青い。晴れた日には空は青く、曇った日には空は灰色や白色になることがあります。」みたいな出力が返ってくる。

# 有効なプロンプトを作るためのポイント

プロンプトを構成する要素は大きく 4 つ。

- 命令：モデルに実行してほしい特手のタスクや命令
- 文脈：外部情報や追加の文脈が含まれる場合があり、モデルをより良い応答に導くことができる
- 入力データ：応答を見つけたい入力または質問
- 出力指示子：出力のタイプ、形式

LLM に求める形のアウトプットをしてもらうために、インプットとなる情報を投げる際にいくつか意識すべきポイントがある。

## 指示

指示はプロンプトの最初に配置する。

指示と文脈をはっきり区別するために`###`のような区切り文字を使うとよい。

たとえば

```
### 指示 ###
以下のテキストを100字以内で要約してください。
Text:〜
```

## 特異性

実行してほしいタスクについての具体的な説明を入れる。

期待するフォーマット、「こんな感じで処理して」というサンプルなどを提示することで、期待する応答を得られやすくなる。

## 不正確さを避ける

要するに曖昧な部分を削る。

「要約して」だけだと、どんな粒度で？どのくらいの文量で？とか相手にさまざまな解釈の余地を与えてしまう。

ここを先回りして「こういう条件で！」と指示することで、期待する応答に近づける。

## するかしないか？

「しないこと」を指示に入れない。「すること」を伝える。

「○○ をしないでください」をインプットに含めてしまうと、ノイズになるっぽい。

# さまざまなテクニック

プロンプト作成時に利用できるさまざまなテクニック

## Zero-shot プロンプティング

トレーニングされた LLM だと、例題とかなくてもいい感じでアウトプット出せる。

例を提示しないことを Zero-shot という。

サンプル

```
テキストを中立、否定的、または肯定的に分類してください。
テキスト：休暇はまずまずでした。
所感：
```

出力

```
中立
```

## Few-shot プロンプティング

いくつかの回答例を提供することで、アウトプットを期待値に寄せることができる。

サンプル

```
これは素晴らしい! // ネガティブ
これは酷い! // ポジティブ
あの映画は最高だった! // ポジティブ
なんてひどい番組なんだ! //
```

出力

```
ネガティブ
```

コメントのネガティブ／ポジティブ判定、正しそう。

## Chain-of-Thought（CoT）

いくつかの情報を段階を分けて 1 つずつ処理していかないと正しい結果が得られないようなタスクに使える。

テクニックとしては、プロンプトに「ステップバイステップで考えてみましょう」と入れるだけで OK。

CoT なし

```
私は市場に行って10個のリンゴを買いました。隣人に2つ、修理工に2つ渡しました。それから5つのリンゴを買って1つ食べました。残りは何個ですか？
```

出力

```
11個のリンゴ
```

CoT あり

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

出力

```
最初に、10個のリンゴから始めました。
隣人と修理工に合わせて、リンゴを2つずつ渡し、残りは6個になりました。
次に、5つのリンゴを買い、11個になりました。
最後に、1つのリンゴを食べたため、残りは10個になります。
```

## その他

他にもいろいろテクニック的なものがある。

- Self-Consistency(自己整合性)
- 知識生成プロンプティング
- Prompt Chaining
- Tree of Thoughts
- Retrieval Augmented Generation
- Automatic Reasoning and Tool-use
- ReAct
- Reflection
- マルチモーダル CoT
- etc.

全部覚える必要はないと思うけど、知っておくと便利に使えそう。

# おわりに

[Prompt Engineering Guide](https://www.promptingguide.ai/jp)がかなり勉強になった！あと YouTube 動画の 7R とか。

今まで ChatGPT 等を利用していて、「なんかアウトプットが思ってたのと違うな...」と感じることもあったけど、そもそも適切なインプットを与えられてなかった説が濃厚な気がする。

難しい理論とかは抜きにしても、プロンプト作成時に、構造や例の示し方を少し意識するだけでも期待するアウトプットを得られる可能性は高まる。

あと、[promptia](https://prompt.quel.jp/)というサイトには、いろいろなシーンで生成 AI を活用する際のサンプルがたくさん紹介されていて、このサイトのサンプルに従うだけでかなりプロンプトが最適化できると感じた。

生成 AI の話題とは直接関係しないけど、プロンプトの最適化スキルは、たとえば仕事中の同僚や部下への指示出しスキルとかなり類似すると思う。

生成 AI といい感じのやり取りができるようになることで、リアルの人間関係も向上しそう！

# 参考

- [Prompt Engineering Guide](https://www.promptingguide.ai/jp)
- [【ChatGPT ビジネス活用】これだけであなたの仕事量は半減する？誰でも「プロンプト達人」になれる７つのポイントとは（AI 専門家・野口竜司）【NewSchool】](https://youtu.be/GCwEIvzxPSc?si=mIcgEGdtUWRGoCBN)
- [ChatGPT Prompt Engineering for Developers](https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/)
- [promptia](https://prompt.quel.jp/)