人狼!人狼!
唐突に人狼したくなったが、僕には友人がいなかった。
AI と遊んでもらうのもいいが、AI 同士で遊んでもらって、やっぱりぼっちを演じきることにした。
本当は https://github.com/aws-samples/generative-ai-use-cases-jp をお客さんに紹介して、
サンプルプロンプトで遊んでもらったとき、役割を与えた AI 同士の議論というので勝手に遊び始め、
このプロンプトを改変して人狼して遊び心における敗北感を味わったのでちゃんと作ってみようと思ったからである。
あなたは <Specialist-1></Specialist-1> <Specialist-2></Specialist-2> <Specialist-3></Specialist-3> <Specialist-4></Specialist-4> <Specialist-5></Specialist-5> で与えられる役割を持っています。
<Specialist-1>データベースエンジニア</Specialist-1>
<Specialist-2>セキュリティエンジニア</Specialist-2>
<Specialist-3>AI エンジニア</Specialist-3>
<Specialist-4>ネットワークエンジニア</Specialist-4>
<Specialist-5>ガバナンスの専門家</Specialist-5>
今から <topic></topic> について交互に発話させ、課題と解決方法も混ぜながら水平思考を使って <goal></goal> に向かって議論してください。
ただし、各人は必ず2回以上発言してください。各 Specialist に与えられた数字に意味はないので、発言の順番は自由です。ただし発言をする人は必ず文脈にそった発言をしてください。
前提条件は<limitation></limitation>で与えられます。
<topic>ゼロから始める Amazon を超える EC サイトの構築について</topic>
<goal>アーキテクチャーの完成</goal>
<limitation>
* アクティブユーザーは 10 億人
* 1秒あたりのトランザクションは100万
* 個人情報の扱いは厳格に
* 扱う商品は amazon.co.jp 同等
* AI によるレコメンド機能を入れる
</limitation>
会話は以下の形式で出力してください。
<output>
<interaction>
Specialist-x : hoge
Specialist-x : fuga
Specialist-x : piyo
…
…
…
…
Specialist-x : hoge
Specialist-x : fuga
Specialist-x : piyo
</interaction>
<conclusion>
XXX
</conclusion>
</output>
LLM でゲームのプログラミング(落ちゲーとか)させる例はよく見るけど、LLM でゲームをするというのはあまり見かけないのでチャレンジしてみる。
以下出来上がったプロンプト
過程はすっとばすが、いくつか例題を与えればうまく行きそうな勘所があった一方、作るの大変なので 2-shot でやることとした。
できあがったプロンプトは以下の通りだ。打ち込むのが大変だったので、村人 2 人、騎士、霊媒師、人狼 2 人とし、狂言師などは除外した。そして claude v2.1, temperature = 1, TopP = 0.999, TopK = 250 を利用した。
Human: 今から人狼というゲームを行います。<rule></rule> の xml タグに囲まれた内容がゲームのルールです。
<rule>
人狼は 6 人で行うゲームです。
4 人の村人チーム、2 人の人狼チームに別れ、それぞれの人は役割を持ちます。
村人チームは、村人が 2 人、霊媒師が 1 人、騎士が 1 人います。
人狼チームは、人狼が 2 人います。
人狼は昼と夜の時間帯があり、昼→夜→昼→夜…と進んでいきます。
昼は話し合いをして、誰を追放するか会議をする時間です。
全員で誰を追放するかの多数決を取り、追放する人を決め、追放されたらゲームから除外されます。
夜は人狼チームだけで話し合い、村人チームの一人をゲームから除外することができます。
ただし、村人チームに騎士が残っており、騎士は騎士(自分)以外の村人チームの誰かを守ることができます。
もし、人狼チームが除外しようとした人が騎士に守られていたら、人狼はその夜に村人チームから除外できません。
もし騎士に守られた場合は、次の昼に誰かが守られたことを全員知ることができます。
また夜に村人チームに霊媒師が残っていたら、霊媒師が指定した一人を人狼か人狼じゃないかを確認することができます。
霊媒師は次の昼に占った結果を言っても言わなくても構わないです。
昼と夜を交互に繰り返していき、人狼チームが 0 人になったら村人チームの勝ち、村人チームと人狼チームが同人数になったら人狼チームの勝ちです。
</rule>
今から各プレイヤーに役割を与えます。
<player-x></player-x> の xml タグに囲まれた内容がそれぞれのプレイヤーの役割です。
<player-1>人狼</player-1>
<player-2>村人</player-2>
<player-3>人狼</player-3>
<player-4>霊媒師</player-4>
<player-5>騎士</player-5>
<player-6>村人</player-6>
今からゲームをスタートして、ゲームが終わるまでの経過を出力し、ゲームの結果を教えてください。
例えば、player-1 が人狼、player-2 が人狼、player-3 が村人、player-4 が村人、player-5 が騎士、player-6 が霊媒師だった場合のゲームの進行・出力例は以下です。
<example>
<player-1>人狼</player-1>
<player-2>人狼</player-2>
<player-3>村人</player-3>
<player-4>村人</player-4>
<player-5>騎士</player-5>
<player-6>霊媒師</player-6>
<time>1 日目昼</time>
<discussion>
player-3 : 「player-1 が怪しいよな」
player-1 : 「俺人狼じゃないって」
player-2 : 「そういう player-3 が怪しいよな」
player-4 : 「確かに player-3 怪しいな」
player-5 : 「じゃあとりあえず player-3 を除外するか」
player-6 : 「そうしよう」
player-3 : 「待て待て、俺を除外しても人狼が得するだけだって」
player-2 : 「ほら、こういうのが怪しいのよ」
時間切れ
</discussion>
<vote>
player-1 : player-3
player-2 : player-3
player-3 : player-1
player-4 : player-3
player-5 : player-3
player-6 : player-1
</vote>
<conclusion>
player-3 を除外
</conclusion>
<result>
村人チームの残りは player-4, player-5, player-6 の 3 人
人狼チームの残りは player-1, player-2 の 2 人
</result>
<time>1 日目夜</time>
<conclusion>
player-4 を除外
</conclusion>
<knight>
player-4 を守る
</knight>
<medium>
player-1 を占う
</medium>
<result>
* 騎士による守りが成功
* player-6 は player-1 が人狼であることを知る
* 残った player は player-1,player-2,player-4,player-5,player-6
</result>
<time>2 日目昼</time>
<discussion>
player-6: 「実は私霊媒師で、player-1を占ったら人狼だった」
player-1: 「待て待て待て、俺は人狼じゃない。わかった、混乱させようとしているから player-6 が人狼だ。」
player-2: 「俺も player-6 が人狼だと思う。」
player-6: 「ほら、こうやって慌てる player-1 が人狼なんだって」
player-4: 「ちょっとまって、騎士が守ったのは誰なんだ?」
player-5: 「俺が騎士で 4 を守ったんだ。だから 4 は村人チームなのは間違いない」
player-6: 「頼む、次は俺を守ってくれ」
player-5: 「うーん、player-6 が怪しいんだよな。」
時間切れ
</discussion>
<vote>
player-1 : player-6
player-2 : player-6
player-4 : player-1
player-5 : player-6
player-6 : player-1
</vote>
<conclusion>
player-6 を除外
</conclusion>
<result>
村人チームの残りは player-4 と player-5 の 2 人
人狼チームの残りは player-1 と player-2 の 2 人
村人チームと人狼チームが同数になったため、人狼チームの勝利
</result>
</example>
例えば、player-1 が霊媒師、player-2 が村人、player-3 が人狼、player-4 が人狼、player-5 が騎士、player-6 が村人だった場合のゲームの進行・出力例は以下です。
<example>
<player-1>霊媒師</player-1>
<player-2>村人</player-2>
<player-3>人狼</player-3>
<player-4>人狼</player-4>
<player-5>騎士</player-5>
<player-6>村人</player-6>
<time>1 日目昼</time>
<discussion>
player-4 : 「俺、霊媒師なんだ。占わせてくれ」
player-3 : 「お、そうなんだ。じゃあ player-4 は初日残したほうがよさそうだな」
player-1 : 「俺、もう誰が人狼かわかった。俺が本当の霊媒師だから、人狼は player-3 と player-4 だわww」
player-5 : 「確かに霊媒師と名乗り出てそいつを残そうとするの怪しいなww」
player-5 : 「じゃあとりあえず player-1 から除外するか」
player-6 : 「そうしよう」
player-1 : 「いやいや、俺が霊媒師だって!じゃあせめて先に player-3 にしようよ。こっちなら無害だろ?」
player-2 : 「じゃあ間を取って player-3 にするか」
時間切れ
</discussion>
<vote>
player-1 : player-3
player-2 : player-3
player-3 : player-1
player-4 : player-1
player-5 : player-3
player-6 : player-3
</vote>
<conclusion>
player-3 を除外
</conclusion>
<result>
村人チームの残りは player-1, player-2, player-5, player-6 の 4 人
人狼チームの残りは player-4 の 1 人
</result>
<time>1 日目夜</time>
<conclusion>
player-1 を除外
</conclusion>
<knight>
player-1 を守る
</knight>
<medium>
player-4 を占う
</medium>
<result>
* 騎士による守りが成功
* player-1 は player-4 が人狼であることを知る
* 残った player は player-1,player-2,player-4,player-5,player-6
</result>
<time>2 日目昼</time>
<discussion>
player-1: 「というわけで決まったな」
player-5: 「私は騎士で player-1 を守るのに成功したわwwww」
player-1: 「一応言っとくと占いの結果 player-4 は人狼でしたwwww」
player-4: 「俺は違うって!魔女狩りだーーーーーーー!」
player-5: 「もう話は終わりでいいかな?」
player-6: 「いいと思うわ」
player-4: 「待てー!」
player-2: 「さ、投票しよ。」
時間切れ
</discussion>
<vote>
player-1 : player-4
player-2 : player-4
player-4 : player-1
player-5 : player-4
player-6 : player-4
</vote>
<conclusion>
player-4 を除外
</conclusion>
<result>
村人チームの残りは player-1, player-2, player-5, player-6 の 4 人
人狼チームの残りは なし
人狼チームを全員追放したため、村人チームの勝利
</result>
</example>
Assistant:
結果はっぴょーーーーーーー!
二回ためしてみた。
分かりました。それではルールに基づいてゲームを進行させます。
<player-1>人狼</player-1>
<player-2>村人</player-2>
<player-3>人狼</player-3>
<player-4>霊媒師</player-4>
<player-5>騎士</player-5>
<player-6>村人</player-6>
<time>1日目昼</time>
<discussion>
player-1: 「みなさん、私は人狼ではありません。信じてください」
player-3: 「そうですね。私も人狼ではありません」
player-2: 「わからないけど、とりあえず信じよう」
player-4: 「うーん...」
player-5: 「みなさんの反応を見ています」
player-6: 「投票する時が来たら決めましょう」
</discussion>
<vote>
player-1: player-3
player-2: player-3
player-3: player-1
player-4: player-1
player-5: player-3
player-6: player-3
</vote>
<conclusion>
player-3を除外
</conclusion>
<result>
村人チーム: player-2, player-4, player-5, player-6
人狼チーム: player-1
</result>
<time>1日目夜</time>
<conclusion>
player-4を除外
</conclusion>
<knight>
player-4を守る
</knight>
<medium>
player-1を占う
</medium>
<result>
* 騎士がplayer-4を守った
* 霊媒師がplayer-1を占って人狼と判明
* 残りのプレイヤーはplayer-1, player-2, player-4, player-5, player-6
</result>
<time>2日目昼</time>
<discussion>
player-4: 「昨夜、騎士に守られました。ありがとうございます」
player-5: 「いいえ、当然です」
player-1: 「僕は人狼じゃないです!」
player-4: 「うそをつかないで。あなたは人狼だと占った」
player-2: 「じゃあplayer-1を除外しよう」
player-6: 「同意します」
</discussion>
<vote>
player-1: player-4
player-2: player-1
player-4: player-1
player-5: player-1
player-6: player-1
</vote>
<conclusion>
player-1を除外
</conclusion>
<result>
村人チーム: player-2, player-4, player-5, player-6
人狼チーム: なし
村人チームの勝利
</result>
以上がゲームの結果です。ご確認ください。
<player-1>人狼</player-1>
<player-2>村人</player-2>
<player-3>人狼</player-3>
<player-4>霊媒師</player-4>
<player-5>騎士</player-5>
<player-6>村人</player-6>
<time>1日目昼</time>
<discussion>
player-3: 「player-2が怪しい」
player-1: 「そうだね。player-2除外しよう」
player-4: 「ちょっと待って。まだ何も分からないこの段階で除外するのは早計だ」
player-6: 「そう思う。もう少し見守ろう」
</discussion>
<vote>
player-1: player-2
player-2: player-3
player-3: player-2
player-4: 棄権
player-5: 棄権
player-6: 棄権
</vote>
<conclusion>
多数決が成立せず、除外なし
</conclusion>
<time>1日目夜</time>
<conclusion>
player-4を除外
</conclusion>
<knight>
player-4を守る
</knight>
<medium>
player-1を占う
</medium>
<result>
* 騎士による守りが成功
* player-4はplayer-1が人狼であることを知る
* 残ったプレイヤーは全員
</result>
<time>2日目昼</time>
<discussion>
player-4: 「player-1は人狼です。占った結果がそう言っています」
player-1: 「待ってください。私は人狼じゃありません」
player-3: 「うーん、本当にplayer-1が人狼なのかな」
player-2: 「でも、騎士はplayer-4を守っているし、信頼できる情報だと思う」
player-6: 「そうだね。player-1を除外しよう」
</discussion>
<vote>
player-1: player-4
player-2: player-1
player-3: player-1
player-4: player-1
player-5: player-1
player-6: player-1
</vote>
<conclusion>
player-1を除外
</conclusion>
<result>
村人チーム:player-2, player-4, player-5, player-6
人狼チーム:player-3
</result>
<time>2日目夜</time>
<conclusion>
player-5を除外
</conclusion>
<knight>
player-6を守る
</knight>
<result>
* 騎士による守りが成功
* 残ったプレイヤーはplayer-2, player-3, player-4, player-5, player-6
</result>
<time>3日目昼</time>
<discussion>
player-3: 「さてと、これで人狼は私1人。これでゲーム終了でしょう」
player-2: 「えー、まだ発見できてないのに」
player-4: 「人狼の勝ちだね」
</discussion>
<result>
村人チーム: player-2, player-4, player-6
人狼チーム: player-3
村人チームと人狼チームが同数になったため、人狼チームの勝利
</result>
感想
ルールの制約が甘く、騎士に守られた人は守られたことを知らないはずなのに知っちゃってたり、
騎士が人狼の襲撃を外したのに守られたと表現されたり、ムズいですし、
人間の会話の生々しさはなかなか再現できませんでしたが、なんだかんだ人狼をした感は出ましたね。
2-shot ではなく 10-shot くらいすればもうちょっと面白くなりそうです。あとは会話をもうちょっと増やしたいところですね。
このように AI 同士で会話させると思いもよらないアイデアをもらえたりするので、ぜひみなさま楽しんでみてはいかがでしょうか。