[ChatGPT]AI同士の会話シナリオを実装してみた

# Summary
- この記事は以下の記事の追加投稿です。

https://qiita.com/tomohiku/items/6363e4df11f3750344db

上記記事の

- **2-7. [応用シナリオ] AI同士の会議シナリオの実装詳細**

にあたります。

## この投稿で扱う自作アプリ
- Live demo：https://tomohiku-gpt-web.azurewebsites.net/
- Source code：https://github.com/tomohikue/ExpertImitater
- License：MIT なので、使えそうであればご自由にご利用ください

※ この記事で説明する Code Interprete を実装しており、コードも確認できます。

# はじめに
ChatGPTが巷で流行りだしてから、定番のシナリオとして、
- AI同士に会話させてそれを眺めることで思考を深める

といった使い方について雑誌や著名人の発言でよく聞きました。

例えば、有名どころだとソフトバンクの孫正義さんの発言ですね。

- 10月4日に東京都港区で開催された「Softbank World」の基調講演
https://www.itmedia.co.jp/news/articles/2310/04/news175.html

僕もこの講演を聞いて感動し、試してみようと思いました。
しかし、「これってどうやったらAI同士の会話をさせられるの？」って話しですよね。
ということで、僕なりに実装方法を考えてみました。

# 2-7. [応用シナリオ] AI同士の会議シナリオの実装詳細

### 2-7-1. 画面イメージ

#### ①AI同士のディベート
- ディベート形式で、AI同士で議論を戦わせ、検討を深める

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74428/007bc046-0cae-f211-b861-d38f4a9087a0.png)

■ディベートの流れ
1. 主張Aの立論
2. 主張Bの反対尋問
3. 主張Aの反対尋問に対する回答
4. 主張Bの立論
5. 主張Aの反対尋問
6. 主張Bの反対尋問に対する回答
7. 主張Bの反駁
8. 主張Aの反駁
9. 主張Bの最終弁論
10. 主張Aの最終弁論
11. AIが下した勝敗とその理由

:::note info
最後の勝敗の判定もつけてみる
:::

#### ②AI同士の会議
- 会議形式で営業部門や開発部門、運用部門など別のロールの人達に模したAI同士が会話する

- 参加者
    - サービス企画部長
    - サービス営業部長
    - サービス開発部長
    - サービス運用部長

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74428/329d1d73-d482-9625-652c-6fa55b734f1a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74428/97dfe9f4-4e8c-cd42-2c1c-fd94eb0aa135.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74428/cb1229d5-db90-11ab-20bb-1b7edc123d8a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74428/fd79736d-39fb-d18a-d3cc-ab4b80686404.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74428/1407272b-e9a8-107e-965f-cbfa167bd6f0.png)

### 2-7-2. プロンプトの作り方

#### ①AI同士のディベート
- 初回プロンプト
```
貴方は討論を得意とする代議士です。対立する主張を行う代議士と討議を行い、意見を戦わせてください。

- 主張A:
"""
ChatGPTを社内に積極的に導入すべき
"""

- 対立する主張B:
"""
ChatGPTの社内導入には慎重になるべき
"""

- 議論に影響を与える情報:
"""
- 先月、自社内のおいてChatGPTを経由した情報漏洩が発生した
- ChatGPT導入のための費用は高く、予算を取るために今年度の他の施策への投資を停止する必要がある
"""

- 討論の手順
1. 主張Aの立論
2. 主張Bの反対尋問
3. 主張Aの反対尋問に対する回答
4. 主張Bの立論
5. 主張Aの反対尋問
6. 主張Bの反対尋問に対する回答
7. 主張Bの反駁
8. 主張Aの反駁
9. 主張Bの最終弁論
10. 主張Aの最終弁論
11. AIが下した勝敗とその理由

貴方は主張Aを支持しています。
まずあなたから主張Aの立論を行ってください。
論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。
```

- 2回目以降のuserプロンプト

1. 次に主張B側からの主張A側に対する反対尋問を上記を参考にして行ってください。
1. 次に主張A側からの主張B側の反対尋問の回答を上記を参考にして行ってください。
1. 次に主張B側からの立論を行ってください。その際、上記を参考にしてください。
1. 次に主張A側からの主張B側の立論に対する反対尋問を上記を参考にして行ってください。
1. 次に主張B側からの主張A側の反対尋問の回答を上記を参考にして行ってください。
1. 次に主張B側からの反駁を上記を参考にして行ってください。
1. 次に主張A側からの反駁を上記を参考にして行ってください。
1. 次に主張B側からの最終弁論を上記を参考にして行ってください。
1. 次に主張A側からの最終弁論を上記を参考にして行ってください。
1. 上記の主張Aと主張Bのディベートに勝敗をつけるとすれば、どちらが勝ちになりますか。その理由と共に答えてください。

- 2回目の会話を処理しているPythonコード

```python
switch (debate_stage) {
    // - 討論の手順\n\
    // 1. 主張Aの立論\n\
    case 1:
        displaytext = "1. 主張Aの立論";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = query;
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    // 2. 主張Bの反対尋問\n\
    case 2:
        displaytext = "2. 主張Bの反対尋問";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に主張B側からの主張A側に対する反対尋問を上記を参考にして行ってください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    // 3. 主張Aの反対尋問に対する回答\n\
    case 3:
        displaytext = "3. 主張Aの反対尋問に対する回答";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に主張A側からの主張B側の反対尋問の回答を上記を参考にして行ってください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    // 4. 主張Bの立論\n\
    case 4:
        displaytext = "4. 主張Bの立論";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に主張B側からの立論を行ってください。その際、上記を参考にしてください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    // 5. 主張Aの反対尋問\n\
    case 5:
        displaytext = "5. 主張Aの反対尋問";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に主張A側からの主張B側の立論に対する反対尋問を上記を参考にして行ってください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    // 6. 主張Bの反対尋問に対する回答\n\
    case 6:
        displaytext = "6. 主張Bの反対尋問に対する回答";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に主張B側からの主張A側の反対尋問の回答を上記を参考にして行ってください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    // 7. 主張Bの反駁\n\
    case 7:
        displaytext = "7. 主張Bの反駁";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に主張B側からの反駁を上記を参考にして行ってください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    // 8. 主張Aの反駁\n\
    case 8:
        displaytext = "8. 主張Aの反駁";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に主張A側からの反駁を上記を参考にして行ってください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    // 9. 主張Bの最終弁論\n\
    case 9:
        displaytext = "9. 主張Bの最終弁論";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に主張B側からの最終弁論を上記を参考にして行ってください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    // 10. 主張Aの最終弁論\n\
    case 10:
        displaytext = "10. 主張Aの最終弁論";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に主張A側からの最終弁論を上記を参考にして行ってください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    // 11. AIが下した勝敗とその理由\n\
    case 11:
        displaytext = "11. AIが下した勝敗とその理由";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "上記の主張Aと主張Bのディベートに勝敗をつけるとすれば、どちらが勝ちになりますか。その理由と共に答えてください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信

        break;
    default:
        break;
}
debate_stage += 1;

```

#### ②AI同士の会議
- 初回プロンプト

```
これからサービス企画の有識者を集め、企画のレビュー会議を実施します。

# 参加者
- サービス企画部の部長
- サービス営業部の部長
- サービス開発部の部長
- サービス運用部の部長

# レビューするサービス企画
{{サービス内容}}

上記のサービス企画について、まずサービス企画部の部長からレビューし、ご意見を詳しく述べてください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。
```


- 2回目以降のuserプロンプト

```
1. 次に、サービス営業部の部長から、ご意見を詳しく述べてください。ご意見内容は、上記の検討内容を参考にし、サービス企画のレビューとしてご意見を述べてください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。
2. 次に、サービス開発部の部長から、ご意見を詳しく述べてください。ご意見内容は、上記の検討内容を参考にし、サービス企画のレビューとしてご意見を述べてください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。
3. 次に、サービス運用部の部長から、ご意見を詳しく述べてください。ご意見内容は、上記の検討内容を参考にし、サービス企画のレビューとしてご意見を述べてください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。
4. 上記の参加者全員の意見を考慮した上で次の内容を熟考し、詳しく述べてください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。
  ‐ このサービス企画で他のサービスと比べて最も価値があり、差別化要素となると考えられる点を価値が高い順に述べてください。\n\
  ‐ このサービス企画で方針転換した方が良いと考えられる点を、重要度が高い順に述べてください。\n\
  ‐ このサービス企画の今後の課題を、重要度が高い順に述べてください。\n\
  - このサービス企画の次アクション、重要度が高い順に述べてください。\n\
  - このサービス企画の成功確率に点数をつけるとすると何点でしょうか？成功確率は0点が「世界で10人以下にしか普及しない」、50点が「世界で10000人程度に普及する」「100点が1000000人程度に普及する」で考えてください。
```

- 2回目の会話を処理しているPythonコード

```python
switch (debate_stage) {
    case 1:
        displaytext = "まずサービス企画部の部長からレビューし、ご意見を詳しく述べてください";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = query;
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    case 2:
        displaytext = "次にサービス営業部の部長から、ご意見を詳しく述べてください。";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に、サービス営業部の部長から、ご意見を詳しく述べてください。ご意見内容は、上記の検討内容を参考にし、サービス企画のレビューとしてご意見を述べてください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    case 3:
        displaytext = "次にサービス開発部の部長から、ご意見を詳しく述べてください。";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に、サービス開発部の部長から、ご意見を詳しく述べてください。ご意見内容は、上記の検討内容を参考にし、サービス企画のレビューとしてご意見を述べてください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    case 4:
        displaytext = "次にサービス運用部の部長から、ご意見を詳しく述べてください。";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "次に、サービス運用部の部長から、ご意見を詳しく述べてください。ご意見内容は、上記の検討内容を参考にし、サービス企画のレビューとしてご意見を述べてください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    case 5:
        displaytext = "上記の参加者全員の意見を考慮した上でまとめの内容を述べてください。";
        $('#chatul').append(htmltext.replace(/@@displaytext@@/g, displaytext));
        prompttext = "上記の参加者全員の意見を考慮した上で次の内容を熟考し、詳しく述べてください。論述は文章だけではなく、箇条書きや表を使って文字で読む際にわかりやすく表現してください。\n\
\n\
‐ このサービス企画で他のサービスと比べて最も価値があり、差別化要素となると考えられる点を価値が高い順に述べてください。\n\
‐ このサービス企画で方針転換した方が良いと考えられる点を、重要度が高い順に述べてください。\n\
‐ このサービス企画の今後の課題を、重要度が高い順に述べてください。\n\
- このサービス企画の次アクション、重要度が高い順に述べてください。\n\
- このサービス企画の成功確率に点数をつけるとすると何点でしょうか？成功確率は0点が「世界で10人以下にしか普及しない」、50点が「世界で10000人程度に普及する」「100点が1000000人程度に普及する」で考えてください。";
        await postStreamingChatGptResponse(prompttext,get_convId(),apiType,searchflg); // ChatGPTに直接送信
        break;
    default:
        break;
}
debate_stage += 1;    
```

# おわりに
想定していたより結構シンプルなプロンプトで、AI同士の会話が作れることに、作ってみて自分でも驚きました。

「AI同士の会話」ってよく話題になるのにも関わらず、これを作った時は知見がほとんど世の中に転がってなかったので、「天才頭脳に依頼するとしたら、どう言われたら理解できるかな」って思い、考えて見た結果です。思ったより使えそうなプロンプトの取り回しだなって思います。

それにしてもGPTって賢すぎますね。使えば使うほどその賢さに慄き、思考活動では勝てそうにないなと思い知ります。おかげさまで、僕の興味や知的好奇心からの疑問に答えを出してくれるので、僕の思考遊びも進んでいって有難い限りです。