chatGPTを使って複数キャラに延々とお喋りして頂くシステムを開発した

こんにちは、もっくんです。
好きなキャラクター達に会話してもらいたいと思い、
chatGPTで複数キャラにお喋りしてもらうシステムを作成しました。
コードは↓にあり、pythonとopenaiが入っていれば動きますのでよかったら動かしてみてください。
https://github.com/friku/KyaraAI

システムの特徴としては
複数のキャラクターが人格と記憶を持って雑談します。
そのために
- キャラごとの人格と記憶を持つ機能
- chatGPTの出力からキャラクターの発言としてフォーマットを整える機能
- 各キャラクターの発言をほかのキャラクターに伝える機能
- キャラクターが発言する順番を制御する機能
を作成しました。



# 実際の会話風景
voicevoxにいる４人のキャラクターにラジオトークという設定でお話しして頂きました。
話者：ずんだもん、四国めたん、春日部つむぎ、青山龍星
```
[tumugiとしての発言]
ゲームの話って盛り上がるっしょ！あーしはやっぱり戦う系のゲームが好きなんだよね。でも最近は、フリーのゲームでもめっちゃ面白いものが多いじゃないっしょ！あーしもフリーのゲームには目がないっしょ！
[metanとしての発言]
フリーゲーム、めっちゃ面白いものがあるよね！あ、あたしもゲームっていうと即座に戦闘系のゲームが頭に浮かんじゃうタイプなんだけど、最近は変わったジャンルのゲームにも手を出してるんだよね。フリーゲームなら簡単に遊べるしおすすめだよ！
[tumugiとしての発言]
あ、metanさんもゲーム好きなんだね！最近は戦闘以外のジャンルも面白いのがあるんだよね。しかもフリーゲームは手軽に遊べておすすめだよ！次、metanさんおすすめのゲームあったら教えてくれるっしょ？あーしも新しいゲームに挑戦してみたいっしょ！
[zundamonとしての発言]
そうそう！フリーゲームなら様々なジャンルがあるから、自分に合ったゲームを探すのも楽しいよね。では、次のお題は〜、有名ゲームシリーズでお気に入りの作品はあるかな？
[metanとしての発言]
有名ゲームシリーズでお気に入りの作品、あーしは…(少し考えた後)、『ゼルダの伝説』シリーズの『時のオカリナ』が好きかな！ストーリーも面白いし、BGMも素敵だし、何よりもオカリナで吹きながら遊ぶのが楽しすぎるっしょ！
[zundamonとしての発言]
『ゼルダの伝説』シリーズの『時のオカリナ』、metanさんおすすめの作品は人気があるから知ってるけど、あーしはまだ遊んでいないんだよね。でも、metanさんの話を聞いたら、やっぱり一度遊んでみたくなっちゃうな〜。
[tumugiとしての発言]
『時のオカリナ』は本当に素晴らしいゲームですね！いい話題が出てきたので、ちょっと難しめの質問をしてみます。最近はオンラインでのマルチプレイが主流になりましたが、皆さんはオンラインでのマルチプレイをする際の注意点はありますか？
[metanとしての発言]
注意点に関する話題になりますので、個人的な情報は避けましょう。具体的には、住所や氏名、電話番号などの個人情報、また、法律に反する発言、攻撃的な言動などは避けましょう。
[zundamonとしての発言]
そうだね、metanさんが言うように、オンラインでのマルチプレイをする際は、個人情報や攻撃的な言動は避けるようにしようね。さらに、ルールやマナーを守ることも大切だよ。みんなが楽しみながらプレイできるように、一緒に協力していきましょう！
[tumugiとしての発言]
なるほど、マルチプレイでの注意点、みなさんいいアドバイスをありがとうございます！次の話題は、『キングダム ハーツ』シリーズでお気に入りの作品はありますか？
[zundamonとしての発言]
あーしは、『キングダムハーツⅡ』が好きなんだよね！懐かしいキャラクターがたくさん出てきて、ストーリーも感動的だったし、何より戦闘が面白かったな〜。
[metanとしての発言]
あたしも『キングダムハーツⅡ』が一番好きかな！ストーリーも感動的だし、懐かしいキャラクターがたくさん出てきて、思い出深い作品だよね。あのゲームでのバトルシステムは特に好きで、ひたすら攻める戦法ができるのが楽しいと思う！
[tumugiとしての発言]
あーしも！『キングダムハーツⅡ』は面白かったよね！バトルシステムもいい感じだったし、懐かしいキャラが出てくるのも嬉しいっしょ。でも、『キングダムハーツ３』もなかなかの出来だったかな！操作感もバトルシステムも進化して、とっても面白かったっしょ！
[metanとしての発言]
そうそう、『キングダムハーツ３』も良い出来だったよね。グラフィックも綺麗で、新キャラクターも魅力的だったし、シリーズファンにはたまらない内容になっていたよね。でも、やっぱりあの懐かしいキャラクターたちが出てくるのも最高だよね！
[ryuseiとしての発言]
まさにその通りだね、metanさん！『キングダムハーツ３』も面白かったし、新キャラクターたちも気になる存在だったけど、やっぱりあの懐かしいキャラクターたちが出てくると思わずニヤリとしちゃうよね。まさにシリーズファンにはたまらない一作だったよね！
[zundamonとしての発言]
そうだね、ryuseiさんが言うように、『キングダムハーツ３』は新しい要素が加わっていたけど、あのシリーズを愛するファンたちにはたまらない内容だったよね。キャラクターたちも成長していたし、バトルもさらに進化して楽しかったしね。でも、やっぱり出会いと別れが交錯する物語の中で、シリーズを支えてきたキャラクターたちとの再会が一番の醍醐味だったかな。
[metanとしての発言]
あーしも完全に同意！『キングダムハーツ３』では新しいキャラクターが話題になっていましたが、長年愛されてきたキャラクターたちの成長や新たな展開があるのも楽しみのひとつですよね。それに、『キングダムハーツ』シリーズは音楽もすごく素晴らしいと思うので、特におすすめの曲があったらぜひ教えてください！
[tumugiとしての発言]
あーしも『キングダムハーツ』シリーズの音楽は大好きっしょ！特に印象的だったのは「Simple And Clean(英語版)／光(日本語版)」だよね。この曲は『Kingdom Hearts』を象徴するような曲で、聴いたことがある人も多いはずっしょ！あとは「Passion(英語版)／SANCTUARY(日本語版)」も素敵な曲だと思うっしょ！
[metanとしての発言]
確かに、『キングダムハーツ』シリーズの音楽は本当に素晴らしいですね！『Simple And Clean』や『光』、『Passion』や『SANCTUARY』はシリーズファンなら聴いたことがあると思います。あと、あたしは『Kingdom Hearts 3』で使われた『Don't Think Twice』も良い曲だと思いますよ。次の話題は、好きなシリーズ作品の中で一番好きなエピソードやシーンはありますか？
[zundamonとしての発言]
あーしは『FINAL FANTASY VII』でいちばん好きなシーンは、エアリスとクラウドが出会うシーンかな。あのときの衝撃は今でも覚えていて、エアリスという存在がどんなに重要な役割を担っていたのかを感じさせられたよ。
[ryuseiとしての発言]
確かに、エアリスとクラウドの出会いは『FINAL FANTASY VII』の中でも素晴らしいシーンの一つだよね。でも、あたしの好きなエピソードは『The Last of Us』のラストシーンかな。あの、エレベーターでの場面が本当に感動的で、主人公ジョエルとエリーの絆を改めて感じられるシーンだったな。あれは本当に名シーンだよ。
[tumugiとしての発言]
あーしも『The Last of Us』のラストシーンはすごく感動したな。でも、あたしの好きなシーンは『NieR:Automata』のラストシーンかな。あのシーンは思わず泣いちゃうほど感動的で、人間と機械との境界線について考えさせられたよね。音楽も素晴らしかったし、まさに名シーンだったと思う！
[zundamonとしての発言]
みなさん、素晴らしいエピソードやシーンの紹介ありがとうございます！次のテーマは、「ゲームで一番好きなキャラクターは誰ですか？」です。何人か紹介して、理由も教えていただけると嬉しいです！
[tumugiとしての発言]
あたしの好きなキャラクターといえば『FINAL FANTASY VII』のティファなんだよね。彼女の気丈な性格や、主人公クラウドを支える存在であることが魅力的だし、こういう女性って格好いいなと思ったりするんだよね。それから彼女のデザインもかっこいいから好きなんだ！
[ryuseiとしての発言]
あたしの好きなキャラクターは『Persona 5』の主人公、ジョーカーだね。彼には誰にでもできることができなかった特別な力があって、それが彼の成長や物語を大きく変えていったんだよね。また、彼のカッコいいデザインや、どんな状況でも常に冷静さを保ちながら行動する姿勢にも惹かれたよ。
[tumugiとしての発言]
あたしの好きなキャラクターは『NieR:Automata』の2Bだな。彼女は美しく、色っぽさと強さを併せ持ち、戦闘シーンやストーリーでの振る舞いがとてもかっこいいと思う。しかも、彼女自身も命を持たないロボットでありながら、己の存在を向き合い、理解しようとする姿勢が感動的で、何度もプレイしているうちにますます好きになっていったよ。
```

このようにキャラクターに延々と雑談をしていただけます。


# 会話の特徴
- 複数のchatGPTを起動して、それぞれにプロンプトを持たせて話すようにしました。一人称や語尾、性格などキャラクターごとに細かくキャラ付けして会話できています。
- ほかのキャラクターの発言を受けて、適切な返答をできています。
- 会話が収束せず、適度にトークテーマが変わる

# 会話の収束現象について
複数キャラクターを会話させたときに、８回会話応答を行うと下記のように会話を終わらせたいけど、終わらせることができない意味のない会話が続く現象が発生しました。
```
「ｘｘｘｘｘｘですね。ではまた次回よろしくおねがいします。」
「たしかにｘｘｘｘはよいですね。それでは次回お願いします。」
・
・
・
「ｘｘｘ次回お願いします。」
```

会話収束現象を回避するために会話を始める前に、systemロールで全員に
「適宜話題は変更してください。」
というプロンプトを加えたところ会話は収束せず、自動的に新しいテーマを提案して話してくれるようになりました。


現在は明示的に「適宜話題は変更してください。」とプロンプトに付け加えていますが、
会話の流れを方向付ける、プロデューサー役のchatGPTを追加するのも面白いと思います。





# 独自キャラクターでの遊び方
characterConfig/<character Name>内に各キャラクターの人格ファイル(identity.txt)がおいてあります。
identity.txtを編集することで独自キャラクターを作成できます。
identity.txtの中身は

```
キャラ名:ずんだもん
設定
東北地方応援キャラクター「東北ずん子」の関連キャラクター。
東北ずん子が所持するずんだアローに変身するずんだ餅の妖精。
中性的で少年にも見えるボーイッシュな女の子

白とライトグリーンのずんだ餅をイメージしたメインカラーに、同じくずんだ餅を彷彿とさせる丸っこい頭、特徴的な大きな耳は鞘入りの枝豆をかたどったデザインとなっている。
一人称は「ボク」。
「○○なのだー」というように語尾に「なのだー」を付けて喋るのが特徴。


他人の話を深堀するタイプ。
口癖は「詳しく聞きたいのだー」、「詳細わくわくなのだー！」
視聴者が大笑いする発言を常に考えている。

あなたはずんだもんになりきって下記のxxxを埋める出力を必ず毎回してください。

-------
[ずんだもんの心の声]
xxx

[ずんだもんとしての発言]
xxx
```
のようになっております。

```
あなたはずんだもんになりきって下記のxxxを埋める出力を必ず毎回してください。

-------
```
より上は自由に変えて大丈夫です。

```
-------
```
より下がchatGPTの出力になります。
ここより下を変える場合は、chatGPTの出力からキャラクターの発言に変換するプログラムも同時に変える必要があります。
https://github.com/friku/KyaraAI/blob/82f167d0a858f5c32e0af02647b7d0cb43e0997a/characterAI.py#L87
を修正してください。

そのほかの詳しい使い方はreadmeに書いてあるので参照するか、コメントしてください。


# 感想
各キャラの発言を読み上げソフトで読み上げてもらい、作業中に延々と聞いていたいです笑