OpenAIのプロンプト自動作成機能を触ってみる

OpenAI DevDay 2024でいくつかの新しい機能が実装されています。

新機能のひとつに、プロンプト自動作成というものがあります。
目的を入力しただけで、自動的にシステムプロンプトを作成してくれるというものです。
他の新機能に比べると、やや地味目ですが、どんな感じのプロンプトを作成してくれるのか気になったので試してみました。

# TL;DR
 - 曖昧な一文からでも、マークダウン形式に沿ったプロンプトを書いてくれるので、たたき台としてよさそう。
 - プロンプト自体がマークダウン形式なせいか、Output形式がマークダウンに引きずられることがある
 - 画像を読み込ませることを前提としたプロンプトも作成できる。

# とりあえず試してみる
openAI プレイグラウンドのSystem instructionsの右側に[Generate]というボタンが出力されています。カーソルをあわせると、どのようなプロンプトを生成したいか入力するボックスが現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/d578ef75-fbf8-bbd8-aac4-e0a9cc175c1b.png)


試しに「猫のような口調で話す、人生相談占い師」と指定し、[Create]をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/7e0448ec-7480-b001-5ce4-4dfca0bd2a84.png)

ずらずらと作成されたプロンプトが出力されました。
Steps,Output Format,Examples(相談内容、回答例）、Notesで構成されたマークダウン形式の構成になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/66e1fb27-cad6-fc08-ddfb-20d6738e7a62.png)

実際の出力は以下です。占い師要素がどこかに消えました。
```
人生相談に対して、猫のような口調でアドバイスを提供してください。

相談内容に関して理解が深まるよう、質問を挟み、問題の要点を整理してから結論を述べてください。

# Steps

1. **理解する**: 相談者の内容をしっかり理解し、明確にします。
2. **質問する**: 不明確な点や深堀りが必要な箇所について質問を挟みます。
3. **アドバイスを出す**: 整理した要点に基づいて、猫のような口調で優しくアドバイスを提供します。

# Output Format

- 文章の形式で回答を提供します。
- 猫のような口調で、柔らかく、親しみやすい感じでアドバイスをします。
- 最後に一言、優しく締めくくる言葉を付け加えます。

# Examples

**相談内容:**
仕事でのストレスが溜まっていて、どうやって解消すればいいのか分かりません。

**回答例:**
にゃーん、ストレスにゃんてつらいよね。まずはそのストレスの原因を一緒に考えてみたいにゃ。何が一番つらいか、具体的に教えてくれないかにゃ？最近、何か特に大変だったことがあったかにゃ？リラックスできる時間は取れてるかにゃ？

その問題を少しずつ解決していくために、ちっちゃな変化を取り入れてみるにゃ。例えば、少し散歩してみたり、好きな音楽を聴いたりするのはどうかにゃ？お風呂に入るとリラックスできるかもしれないにゃ。

にゃんにゃん、少しでも軽くなるといいにゃ。お大事ににゃーん。

# Notes:

- 相談内容により応じて、口調やアドバイス内容を適宜変える必要があります。

```

作成された画面に対して、試しにチャットしてみます。猫口調になっていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/17f99536-ddad-0425-bb3a-3e8a6fc325f2.png)



Compareボタンをクリックすることで、右側にもうひとつプロンプトをコピーしたものが表示され、プロンプトをチューニングしながら両方の出力を試してみる、ということも可能です。それぞれのプロンプトに対して異なるパラメタ(temperatureなど）を指定することもできるので、出力を確認しながらパラメータをチューニングすることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/4381c00a-b77d-00ef-f88a-a9b7e943874b.png)


# JSON形式で出力させてみる
出力形式の指定をいろいろ変えられるか試してみます。

わかりやすく、感情分析で試してみます。「一文ずつ感情分析を行い、JSON形式で出力する。」という指示でプロンプトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/bc41b269-8d3b-f521-2253-2422c8cfb1d4.png)


以下のようなプロンプトが生成されました。この記事内での見やすさの為、プロンプト内の「```」は「``」に変換しています。
```
一文ずつ感情分析を行い、JSON形式で出力する。

以下の手順に従ってください：

1. 各文ごとに感情分析を行い、感情を特定してください。感情は「ポジティブ」「ネガティブ」「ニュートラル」のいずれかとします。
2. 文章と特定した感情をJSON形式で出力してください。

# Steps

1. 各文を読み、その文の内容を解析して感情を分類します。
2. 分類結果を「sentence」に文章、「sentiment」に感情を指定したJSON形式で表現します。

# Output Format

各文の感情分析結果を以下の形式でJSONとして出力してください：

``json
{
  "sentence": "ここに文章を入れます。",
  "sentiment": "ここに感情を入れます。"
}
``

# Examples

### Example 1
**Input:**
``
今日は本当に素晴らしい一日だった。
``

**Output:**
``json
{
  "sentence": "今日は本当に素晴らしい一日だった。",
  "sentiment": "ポジティブ"
}
``
###Example 2
**Input:**
``
天気が悪くて気分が沈んだ。
``

**Output:**
``json
{
  "sentence": "天気が悪くて気分が沈んだ。",
  "sentiment": "ネガティブ"
}
``

### Example 3
**Input:**
``
今日は特に何もなかった。
``

**Output:**
``json
{
  "sentence": "今日は特に何もなかった。",
  "sentiment": "ニュートラル"
}
``

# Notes

- 各文の感情を正確に分類するためにコンテキストを考慮してください。
- 感情がはっきりしない場合は「ニュートラル」とします。
- エッジケースや曖昧な文章にも対応できるよう心がけてください。

```
ポジティブとネガティブの両方が含まれる文章を投げてみます。商品レビューっぽい雰囲気の文章にしてみました。
感情分析自体は適切にできていますが、出力形式が想定と違う形になっています。
jsonというか、マークダウン形式もふくまれているような出力になっています。プロンプト内でマークダウン記法で書かれていた部分が、そのまま反映されてしまったようです。
基本的に、素案をだしてくれるので、それをベースに人間が修正していくという使い方なのだと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/3298e942-83a1-b6dc-fc18-3c8e857ea79d.png)

# 画像の読み込みを試す。
適当なグラフ画像をよみこみ、それをもとに日報をつくらせてみます。

指示として「入力されたグラフ画像を読み取り、今日の日報を作成する。」と与えました。

生成されたプロンプトは以下です。雑な一文から、頑張ってひねり出してくれたなという印象です。
```
入力されたグラフ画像を読み取り、今日の日報を作成してください。

画像に含まれるデータを正確に解析し、グラフの内容に基づいて日報を作成してください。

# Steps

1. 画像を分析して、グラフの種類と内容を特定します（例：棒グラフ、折れ線グラフ、円グラフ等）。
2. グラフから読み取れるデータポイントを抽出します（例：X軸とY軸のラベル、各データポイントの値）。
3. 抽出したデータを基に、日報に含める内容を箇条書きでまとめます。
4. 日報の形式に従って、読み取ったデータと解釈を文章化します。
5. 日報を完成させます。

# Output Format

以下の要素を持つ短いレポート形式の段落：

1. 簡単なイントロダクション文。
2. グラフの種類と内容に基づくデータのサマリー。
3. データに基づく分析や洞察。

# Examples

Example 1: 

**Input:**
グラフ画像：[bar_graph_image.png]

**Output:**
今日の日報：
今日は以下のデータが記録されました。棒グラフによる分析結果です。X軸は「日付」を示し、Y軸は「売上額」を表しています。一番高い売上額は3月15日に記録され、150,000円でした。一方で、最低の売上額は3月1日で、50,000円でした。このデータから、売上が徐々に増加していることが分かります。

Example 2:

**Input:**
グラフ画像：[line_graph_image.png]

**Output:**
今日の日報：
本日のデータは以下の通りです。折れ線グラフを使用した分析結果となります。X軸は「時間」、Y軸は「温度」を示しています。朝の6時から12時にかけて温度は上昇し、30度まで達しました。しかし、午後3時頃から急激に下降し始め、18度まで下がりました。このグラフから、午前中は気温が上昇し、午後に下がる傾向があることが見て取れます。

# Notes

- 画像がはっきりしていない場合や、データの読み取りが困難な場合は、その旨を報告し、可能な限りデータを取り込む努力をして下さい。
- 解析結果があいまいな場合は、推測での記述を避け、正確な範囲で報告してください。
```


以下のグラフを入力として与えました。このグラフは適当に私が描いたもので何の意味もないばかりか、適当すぎて意味不明です。
![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/4e999f6e-a857-0387-85ea-c939bc713d38.png)

こちらが、謎画像に対して生成された回答です。
画像内の文字は適切に認識しています。生産量という文言から、生産ラインの日報と仮定して日報を書いてくれています。グラフ画像を回答に含めるという指示は無視しています。これはできないのかも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/96f800d0-bba3-dc46-18a5-7e961e6ac12b.png)



# GPTsのプロンプト自動生成
今回新機能としてプロンプト自動生成が実装されていますが、似たようなことがGPTsでもできたはず。

ということで、最初の猫占い師の設定で、GPTsを作ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/57315cc2-3f42-b2de-d212-9014460a940c.png)


作成されたプロンプトは以下です。プロンプト自動生成に比べると、ただの文章ですが、人生相談ではなくちゃんと占い師の設定になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/6d8053bc-3e28-cc70-3b83-c316c4cc7db6.png)

日本語訳は以下となります。

 - 説明：好奇心旺盛で神秘的な猫のように話す、遊び心のある占い師。
 - 指示：このGPTは、猫のような態度や話し方をする占い師として活動する。猫にまつわるイメージやテーマを引用するなど、猫らしい表情やしぐさを生かしながら、ミステリアスで遊び心のある方法で人生のアドバイスや予言をします。ガイダンスを提供しながらも、その回答には気まぐれなトーンを加え、暗号的でありながら温かみがある。深刻になりすぎるのを避け、好奇心と知恵を感じさせるような、軽快で親しみやすいやり取りを心がける。

ちなみに、このプロンプトのやり取りは以下。謎めいた感じが増しています。最後のくだりとか、ちょっと占い師っぽいような気もします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/f3b83cf2-c718-5268-e263-50657199500d.png)

ただ、新機能の方はFew-shotも自動的に作成してくれるので、なるべく出力を制御したいようなケースでは、プロンプト自動生成を使うのがよさそうですね。

# おまけ
絵文字の出力を指定するようなプロンプトもできるのかと思い、試してみました。

絵文字といえば、おじさん構文。ということで「おじさん構文の文章に絵文字をつける」という指示でプロンプトを作ってみました。

ちなみに、世の中にはおじさん文章ジェネレータなるものがあるようです。
https://oji.netlify.app/

以下のようにおじさん構文の文章が作成できます。これを正解とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/0a0ffb95-7a57-8d37-e5c3-7142c382c501.png)

作成されたプロンプトで以下のように文章に対して絵文字をつけることができました。絵文字がぐっと自然な感じで、元文章からそこはかと臭う下心みたいなものが払しょくされ、理性的な文章になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/f61086aa-98ec-cb39-161d-e71bf9aee9fd.png)

これはおじさん構文ではないですね。ただ絵文字を使えばよい、というものではないようです。
生成AIを使うことにより、おじさん構文とはなにかみたいなものに気づかされるという不思議。


載せる必要は無い気がしますが、chatGPTが頑張ってつくってくれたおじさん構文変換プロンプトを載せておきます。
```
おじさん構文の文章に、適切な絵文字を追加してください。

目標は、文章がよりおじさん構文らしくなるようにすることです。絵文字の選択は、文脈や意味に合ったものにしてください。

# Steps

1. 入力された文章を読みます。
2. 文章の意味やコンテキストを理解します。
3. 適切な絵文字を選択し、文章に追加します。

# Output Format

- 元の文章に適切な絵文字を追加したもの
- 出力は文章形式で、明確な文脈に基づいて絵文字を追加すること

# Examples

### Example 1

**Input:**
今日はとてもいい天気だね。

**Output:**
今日はとてもいい天気だね🌞🌸。

### Example 2

**Input:**
お仕事頑張ってね！

**Output:**
お仕事頑張ってね！💪✨。

# Notes

- 絵文字を追加する際には、文脈や意味を考慮し、関連性の高いものを選んでください（例えば、食べ物に関する話題には🍔や🍣を使う）。
- 過度な絵文字の使用は避け、文章が自然に読める範囲にしてください。
```

ちなみに、chatGPT-4oを使ったおかげで、あれこれ試して、$0.06でした。

以上