【生成AIを使いこなせ！】プロンプトエンジニアリングの基礎

# はじめに
生成AIが話題になってしばらく経ちますが、どう使えばよいかわからないという方向けにうまく生成AIを使うコツを紹介します。
「絶対こう使え！」ということではなく、「こういう使い方もあるんだ！」レベルの軽い感じで新たな発見になれば幸いです。
生成AIの使い方に正解はないので、自分なりの使い方を見出すのも良いでしょう。

本記事ではGoogle Cloudの生成AIサービスである「Vertex AI Studio」を使って説明します。「Gemini」を使った例とはなりますが、AI基盤モデルが異なるだけでChat GPTなどでも活用できますのでご安心ください。

# Vertex AI Studio
まず、Vertex AIとは予測 AI と生成 AI の両方の機能を備えた包括的な機械学習（ML）開発プラットフォームのことです。予測を目的とする予測 ML モデルをトレーニング、評価、デプロイすることができます。また、このプラットフォームを使用して、生成 AI モデルの検出、チューニング、サービングを行ってコンテンツを生成することもできます。
そして、今回利用するVertex AI Studioは生成 AI モデルを迅速にテストおよびカスタマイズし、モデルの機能をアプリケーションで利用することができます。UI（ユーザー インターフェース）とコーディング例の両方を含むさまざまなツールとリソースが用意されているため、MLに関する知識や経験がなくても生成 AI を簡単に使い始めることができます。

https://cloud.google.com/vertex-ai/docs/start/introduction-unified-platform?hl=ja

https://cloud.google.com/generative-ai-studio?hl=ja

## Vertex AI Studioの使い方
1. Google Cloudコンソールにログインし、画面上部の検索欄に「Vertex AI」と入力してVertex AIの画面を開く
Vertex AIを初めて開いた方は画面中央付近に「すべての推奨APIを有効化」のボタンがあるので押下してください。
2. 左のペインから「Vertex AI Studio > 概要」を選択
下図のような画面となります。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559206/3aaf2133-c72a-95c2-ada9-cbc21f7ab6b1.png)
本記事ではマルチモーダルを利用しますが、Vertex AI Studioを使うと他にも画像生成や音声合成をすることもできます。

https://cloud.google.com/vertex-ai/generative-ai/docs/image/overview?hl=ja

3. 「Geminiを試す」を押下する
Vertex AI Studioのプロンプト画面は下図となります。(2024/08/20現在)
![図2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559206/c82ceeca-0d81-296d-c473-ec4c4ec9260a.png)
中央付近の**Prompt**と記載してある入力欄にテキストやメディアを挿入してGeminiにレスポンスさせます。
現在利用できるメディアのソース元としては下記の4パターンがあります。
- ローカルからアップロード（7MB以下）
- Cloud Storageからインポート
- Googleドライブからインポート
- Youtube動画からインポート（自分が所有している動画出ないとできない）
ローカルからアップロードができるので、つまりほとんどの方法でGeminiにメディアをインプットさせることができます。
また、右のペインにある**モデル**からGemini-1.5-proなど他の生成AI基盤モデルを利用することもできます。
**マルチモーダル**とはテキストだけでなく、動画や画像、音声データなど異なるデータを処理できる性能のことを指し、マルチモーダルなGeminiは実質的にあらゆる入力に対応しています。

# プロンプトエンジニアリング
**プロンプト**とは生成AIからレスポンスを得るために入力する送信する自然言語のリクエストのことを言います。例えば、生成AIに明日の天気を聞きたいときに「明日の天気は？」が該当します。
このプロンプトの内容を工夫することで、効果的に生成AIを使えるようになります。
以下では、プロンプトでよく聞く「ゼロショットプロンプト」と「少数ショットプロンプト」を説明します。

参考記事：

https://cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/introduction-prompt-design?hl=ja#contextual-information

https://cloud.google.com/vertex-ai/generative-ai/docs/prompt-gallery

## ゼロショットプロンプト（zero shot prompt）
ゼロショットプロンプトとはプロンプトに出力の例を含めずに、生成AIにリクエストを送信する方法を言います。例として、以下のプロンプトが該当します。

**プロンプト**
```
Google Cloudのデータベースサービスを教えて
```

この例でも、もちろん生成AIはGoogle Cloudのデータベースサービスを教えてくれますが、出力のフォーマットは生成AIが勝手に判断し、出力します。つまり、表形式や箇条書き、文章などの体裁だけでなく、出力する内容自体がデータベースサービスの概要だけなのか、もしくはそのユースケースまで示すのか、までAIの判断にゆだねられます。そのため、この手法は生成AIを使う明確な目的がなく、単に生成AIに聞きたいときに使えると言えるでしょう。

## 少数ショットプロンプト（few shot prompt）
前述したゼロショットプロンプトからこちらの説明に察しが付くと思いますが、少数ショットプロンプトとはプロンプトにいくつかの出力の例を含めて、生成AIにリクエストを送信する方法と言います。特に、1例だけ出力例をプロンプトに含めるときは「ワンショットプロンプト」とも言います。例として、以下のプロンプトが該当します。

**プロンプト**
```
Google Cloudのデータベースサービスを以下の例を参考に教えて
例（下表）
```
| DBサービス | DBの種類 | 機能 | ユースケース |
| :-: | :-: | :-: | :-: |
| hoge | hoge | hoge | hoge |

この例では、出力のフォーマットを表形式に指定し、出力させる内容もDBサービス名のほか、DBの種類、機能、ユースケールに絞っています。この手法で生成AIにリクエストを送信すると、このフォーマットに沿って出力してくれます。そのため、この手法は生成AIを使う明確な目的がある時に、極力その出力結果をそのまま流用したいときに使うと便利です。私もこの方法で生成AIにコードを作成してもらったり、表を作ってもらったりしています。

https://cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/few-shot-examples?hl=ja

# 試したこと
GeminiにGoogle Cloud認定資格Professional Cloud Architectの問題を作ってもらいます。それを上で説明した「ゼロショットプロンプト」「少数ショットプロンプト」によって出力がどう異なるかを比較してみます。

## ゼロショットプロンプト
まずは、単に「Google Cloud認定資格Professional Cloud Architectで出題されそうな問題1つ作成してください。」と資格名が分かるようにして、作問してもらいます。
![図3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559206/7edc08ff-1568-5f0c-647a-e5c43122bf85.png)

**Response**
```
Google Cloud認定資格 Professional Cloud Architect 模擬問題
問題:

ある企業が、グローバルに展開するオンラインゲームサービスをGoogle Cloud上に構築しようとしています。このゲームは、世界中のプレイヤーが同時にプレイできることを目指し、低レイテンシーと高可用性が求められます。

この要件を満たすために、以下のGoogle Cloudサービスの中から適切なものを選択し、その理由を具体的に説明してください。

Compute Engine
Kubernetes Engine
Cloud Run
Cloud Functions
Cloud Load Balancing
Cloud CDN
Cloud SQL
Cloud Spanner
Cloud Storage
Cloud Armor
補足:

プレイヤー数は数百万人に達する可能性があります。
ゲームデータは頻繁に更新され、リアルタイムでのアクセスが必要です。
障害発生時のサービス停止時間を最小限に抑える必要があります。
世界各地にプレイヤーが存在するため、レイテンシーを考慮したサービス構築が必須です。
解答例:

選択したサービス:

Kubernetes Engine: コンテナベースのアプリケーションをスケーラブルかつ高可用性で実行するために。
Cloud Load Balancing: 複数のインスタンスへのトラフィック分散と、障害発生時の自動フェイルオーバーを実現するために。
Cloud CDN: 世界中のエッジロケーションにコンテンツをキャッシュし、プレイヤーへのレイテンシーを削減するために。
Cloud SQL: ゲームデータの保存に。グローバルなレプリケーション機能で高可用性を確保。
Cloud Spanner: リアルタイムでデータ更新が必要なゲームデータの保存に。世界中のプレイヤーからの同時アクセスをサポート。
Cloud Storage: ゲームアセット（画像、サウンドなど）の保存に。高可用性とスケーラビリティを実現。
Cloud Armor: DDoS攻撃などからの保護。
理由:

Kubernetes Engine: コンテナ化されたゲームサーバーを柔軟にスケールし、負荷変動に対応できます。また、自動化されたデプロイやロールアウト機能で、サービスの可用性を高めます。
Cloud Load Balancing: トラフィックを複数のインスタンスに分散することで、個々のインスタンスの負荷を軽減し、高可用性を確保します。また、ヘルスチェック機能で障害発生時に自動的にトラフィックを健全なインスタンスに振り分けます。
Cloud CDN: 世界中のエッジロケーションにゲームアセットやコンテンツをキャッシュすることで、プレイヤーへのレイテンシーを大幅に削減できます。
Cloud SQL: 従来型のデータベースとして、ゲームデータの保存に適しています。グローバルなレプリケーション機能により、世界各地にデータのコピーを作成し、障害発生時のデータ損失を防ぎます。
Cloud Spanner: リアルタイムで更新が必要なゲームデータ（プレイヤーの状態、スコアなど）を保存するのに最適です。世界中のプレイヤーからの同時アクセスをサポートし、高いデータ整合性を保ちます。
Cloud Storage: ゲームアセット（画像、サウンドなど）の保存に適しています。高可用性とスケーラビリティが確保されており、大量のデータを効率的に管理できます。
Cloud Armor: DDoS攻撃など、外部からの攻撃からサービスを保護します。
注記: これはあくまで一例であり、具体的なサービスの選定はゲームの規模や特性、セキュリティ要件など、様々な要因を考慮して決定する必要があります。
```

問題自体は成り立っていますが、論述問題が返ってきました。
実際のProfessional Cloud Architectの試験では選択問題しか出題されないため、本問題は試験に近い内容と言っても試験レベルとは言えなさそうです。

## 少数ショットプロンプト
今度は、ゼロショットプロンプトで入力したプロンプトに対して、例だけでなく試験ガイドに記載されていることも付加してより本番レベルに近い問題を作問してもらいます。例として記載した問題はGoogle Cloud公式ドキュメントにある模擬問題から引用しています。
**プロンプト**
```
Google Cloud認定資格では下記6つのセクションについて問われます。
（ここに試験ガイドに記載されているセクションを記載）
上記セクションの内容を満たすような問題を、以下の<例>を参考に1つ作成してください。
<例>
<問題>
組織には、同じ Google Cloud VPC にデプロイされた 3 階層ウェブ アプリケーションがあります。（中略）最小限の手順でネットワークを構成するにはどうすればよいですか。
A. 各階層を異なるサブネットワークに追加する。
B. 個別の VM にソフトウェアベースのファイアウォールを設定する。
C. 各階層にタグを追加し、目的のトラフィック フローを許可するようにルートを設定する。
D. 各階層にタグを追加し、目的のトラフィック フローを許可するようにファイアウォール ルールを設定する。
<解答>
（略）

```
模擬問題の引用元

https://cloud.google.com/learn/certification/cloud-architect?hl=ja

![図4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559206/160e6938-6ce5-1403-c40f-738cb5722f65.png)

**Response**
```
問題
あなたは、オンライン小売業者向けの e コマースアプリケーションをGoogle Cloudに移行するプロジェクトを担当しています。このアプリケーションは、ユーザーの閲覧履歴や購入履歴に基づいて、パーソナライズされた製品推奨を提供するために、ユーザーデータの分析に大きく依存しています。このデータは、信頼性の高いストレージソリューションで安全に保存し、リアルタイム分析に使用できる必要があります。以下の選択肢から、この要件を満たすために最も適した Google Cloud ストレージソリューションはどれですか？

A. Google Cloud Storage (GCS) B. Cloud SQL C. Cloud Spanner D. Cloud Bigtable

解答
D が正解です。 Cloud Bigtable は、高性能でスケーラブルな NoSQL データベースであり、リアルタイム分析に最適です。e コマースアプリケーションで発生する大量のユーザーデータを処理し、パーソナライズされた製品推奨を生成するために必要な迅速なクエリとデータ分析を実現できます。

A は不正解です。 Google Cloud Storage (GCS) は、オブジェクトストレージサービスであり、大規模なデータの保存に適していますが、リアルタイム分析には適していません。

B は不正解です。 Cloud SQL は、従来の SQL データベースであり、構造化されたデータの保存には適していますが、リアルタイム分析には適していません。

C は不正解です。 Cloud Spanner は、グローバルに分散された、高可用性で強く一貫したデータベースであり、トランザクション処理には適していますが、リアルタイム分析には適していません。

理由:

Cloud Bigtable は、行指向の NoSQL データベースであり、リアルタイム分析に必要な迅速なクエリを処理できるように設計されています。
Cloud Bigtable は、自動スケーラビリティと高可用性を備えているため、大量のユーザーデータの処理にも対応できます。
Cloud Bigtable は、データを保存するためのデータ モデルに柔軟性があり、ユーザーの閲覧履歴や購入履歴などのデータを効率的に保存できます。
他の選択肢は、e コマースアプリケーションのリアルタイム分析の要件を満たすために必要な機能を提供していません。
```

出力例を与えたことで、より本番に近い問題が出力されました。
ちなみに、今回は理由が記載されていますが、何回か試したところ解説がない場合もあるので、毎回解説が欲しい場合はプロンプトで「不正解の選択肢についても解説して」と追加すると良いでしょう。

# さいごに
今回は同じような内容のプロンプトでも工夫次第で出力結果が異なることを示しました。どちらの手法が良い、優れている、ということは決してなく、自分が生成AIを使う目的次第で使い分けるのが良いと思います。
他にも工夫すると良い点はあると思いますので、見つけ次第記事にまとめようと思います。