自動操縦のためのChatGPTへのプロンプトの書き方 ～ 条件が増えた場合の工夫と注意点 ～

---

## はじめに

以前の記事で、ChatGPTを使ってPCの自動操作を行う方法を解説しました。

- 画面に「OKボタン」があったら押す  
- 「ERROR」表示があれば停止する  
- など、**画面解析と操作指示**をAIに任せる流れ

本編では、その中でも**ChatGPTへのプロンプト設計**にフォーカスします。特に、**「何々だったら何々の操作指示を出して」**といった**条件が増えていく状況**で、どのようにプロンプトを書けばよいか、**具体例と注意点**をまとめました。

---

## 1. なぜプロンプト設計が重要なのか

ChatGPT（GPT-4など）は、自然言語で指示すると**柔軟に回答**してくれる一方、こちらの意図が曖昧だと**余計な文章**や**想定外の形式**で返してくることがあります。  
自動化システムでは、**確定したフォーマット（例: JSON）**で返してもらうと処理しやすいため、

1. 条件分岐の明示  
2. 応答形式（JSONなど）の強調  
3. 余計な文章を抑える指示

を**プロンプトの中で丁寧に指定**する必要があります。

---

## 2. 条件追加の基本的なやり方

「OKボタンがあったらクリック、CANCELボタンがあったらクリック、ERRORがあったら停止…」など、**条件が1つ増えるごとに**、プロンプトにも追記していきます。たとえば以下のように箇条書きで書くのが簡単です。

```plaintext
あなたは画像解析アシスタントです。
必ずJSON形式で回答してください。

以下の条件をチェックし、それに該当する場合は対応するJSONを返してください:

1) 画面に「OKボタン」がある → {"action":"click","target":"ok_button"}
2) 画面に「CANCELボタン」がある → {"action":"click","target":"cancel_button"}
3) 画面に「ERROR」が見つかった → {"action":"stop","reason":"error_detected"}

上記のいずれにも当てはまらない場合は {"action":"none","target":""} を返してください。

重要: JSON以外の文章や説明は付与せず、
最終的に JSONオブジェクトだけ を出力してください。
```

### 2.1 具体例

- 「OKボタン」と「CANCELボタン」が同時に見つかる場合はどっちを優先する？  
  - その場合のルールを**あらかじめ追記**します。  
- 条件4つ目を追加したい場合、同じ構文で**4) ～～～ → {JSON}**を付け足せばOK。

---

## 3. 条件の増加と表形式

条件が10個、20個…と増えたら、箇条書きが長くなって**読みにくい**ですよね。  
そこで、**表形式**で「(条件) → (JSON出力)」をまとめるのも便利です。  
ChatGPTに対して、**「この表のとおりに出力してください」**と書けば、記述が明瞭になります。

#### 3.1 サンプル（表形式）

```plaintext
あなたは画像解析アシスタントです。
次の表どおりにJSON形式で回答してください。

(条件)                  (JSON出力)
-------------------------------------------------
画面に「OKボタン」      {"action":"click","target":"ok_button"}
画面に「CANCELボタン」  {"action":"click","target":"cancel_button"}
画面に「ERROR」         {"action":"stop","reason":"error_detected"}
該当なし               {"action":"none","target":""}

不要な文章は一切書かず、JSONのみを返してください。
```

このように書くと、ChatGPTは表を見て判断し、**対応するJSONオブジェクト**を返しやすくなります。

---

## 4. 応答形式を厳密に維持するための工夫

### 4.1 「JSONだけで返す」ことを強く求める

LLMは優秀ですが、しばしば「説明文」や「（例: 了解しました）と言った余計なメッセージ」を付けがちです。  
**「一切の文章は書かず、必ずJSONだけで返してください」**と明記し、さらに**例示**も載せると良いです。

```plaintext
重要:
返答は {"action":"click","target":"ok_button"} のような JSON だけで、
前後に文章や改行を付けず、1行に出力してください。
```

### 4.2 複数条件が同時に当てはまる場合のルール

- 例えば、画面に「OKボタン」も「ERROR」も同時に出ていたら、どちらを優先するのか？  
- これも**プロンプト内**で優先順位を決めておきます。

```plaintext
もし複数の条件が同時に該当する場合は、
ERROR > WARNING > OKボタン > CANCELボタン の順に優先してください。
```

LLMは自然言語のやり取りが得意なので、こうした**優先度ルール**を盛り込むと、より的確な応答が得られます。

---

## 5. 大規模な条件分岐になったら？

### 5.1 トークン数の問題

- ChatGPT (GPT-4)には**トークン上限**があり、条件が膨大（数十個以上）になるとプロンプトが長くなりすぎる恐れがあります。  
- その場合、**外部ファイル**や**ローカルのプログラムロジック**で条件をまとめる方法も検討しましょう。  
- ChatGPTには「曖昧な状態の画像だけを送って判断を仰ぐ」、それ以外はローカルで判定、という**役割分担**も有効です。

### 5.2 ローカル制御とのバランス

- 画面から文字列を抽出（OCR）して**if-else**で処理可能なものはローカルでやり、  
- **曖昧な表現**（例: 「ボタンのラベルが英語か日本語か」「ERRORメッセージの詳細によって対処が変わる」など）だけChatGPTに任せる  
といった**ハイブリッド設計**が、実運用ではよく使われます。

---

## 6. 最後に

1. **プロンプト設計**はシステム全体の精度に直結します。  
2. **条件を増やす**場合は、**箇条書き or 表形式**で対応するJSONを明確に示しましょう。  
3. **複数条件が同時に成立**する場合の優先度や、**JSON以外は返さない**指示を徹底するのがコツです。  
4. 規模が大きくなりすぎたら、**トークン数**や**管理性**にも気を配り、**ローカル側との役割分担**を最適化しましょう。

---

## 参考リンク

- [OpenAI (ChatGPT/GPT-4) 公式ドキュメント](https://platform.openai.com/docs/introduction)  
- [プロンプトエンジニアリングに関する他のQiita記事](https://qiita.com/search?q=%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88)  

---

以上