ChatGPTに破綻しないようにTRPGのGMをやってもらう話

# 概要
私はTRPG(特にCoC)が好きでたまに友人とやるのですが、TRPGは準備が大変なのでゲームマスター(GM)をやってくれる人が少ないという問題があります。GMはシナリオを読み込んでプレイヤー(PL)の行動に対して適切な指示を返す必要があるので、その難易度と手間の多さから敬遠されがちです。


例えば、GMは「怪物が住む洞窟に入って討伐する」というストーリーを想定してるのに、PLは「そんなことするより洞窟の入り口で火を焚いて煙を中に流しこもうぜ」と言い出したりします。


このような場合にどのように扱うかはGM次第で「洞窟とは逆向きに風が吹いているのでうまくいきません」とあしらってもいいですし怪物にデバフをつけたり臨機応変に対応するわけですが、毎回うまく捌けるとは限りません。そんなわけで無茶振りをしても怒らないChatGPTにGMをやってもらおうと思いました。

# やり方
ChatGPTの対話モードを使います。3.5でも運がいいと動くんですが動作が不安定なのでPlusに加入している方は4を使うのをお勧めします。

## Prompt

### ひな型
下記の形式だとうまく動くことが多かったです。
```
あなたはTRPGのゲームマスターです。
{状況の説明}

{ゲームに登場するオブジェクトのリスト}

必要最低限の情報のみを開示してください。
プレイヤーの行動に対して、その結果と下記のフォーマットに従った回答を行なってください。

{ゲームの状態}

# 例
...

それでは始めます。行動についてはその都度入力されるので「はじまります」とだけ返答してください。
```

#### 状況の説明
ゲームの開始時点での状況の描写です。プレイヤーが知らないことも全部書いておく必要があります。

**例:**
```
あなたはTRPGのゲームマスターです。
今回行うシナリオはプレイヤー1人が施錠された部屋に閉じ込められている状態から始まります。
この部屋は東にベッド、南に戸棚、西に閉ざされた扉があります。
プレイヤーは東のベッドで寝ています。
```

#### ゲームに登場するオブジェクトのリスト
ここにゲームに登場するあらゆるオブジェクトの情報を列挙します。ギミックなども全て書いておきます。

**例:**
```
戸棚: 3段あり、上2段は何も入っておらず、1番下の段だけ鍵がかかっている。1番下の鍵を開けると紙切れが手に入る。
紙切れ: 紙切れを読むと「西の扉を開くためには扉に向かってヒラケゴマと叫ぶ必要がある」と書かれている
ベッド: 下を覗き込むと鍵が落ちている。
鍵: 戸棚のいちばん下の段に入っており、この鍵を戸棚の一番下の段に使うと開くことができる。
扉: びくともしない。扉の前で「ヒラゲゴマ」と叫ぶと開く。
```

#### ゲームの状態
ゲームにおいて重要なイベントを起こしたかどうかのリストです。このリストを毎回出力させることで、「鍵を持って行ったはずなのに、気づいたら消えていた」あるいは「鍵を持っていないのに鍵を開けれてしまった」というような事態を防ぐことができます。

```
場所: 部屋の東西南北のどこにいるか
戸棚: 紙切れが回収されたかどうか
紙切れ: 読まれているか
鍵: プレイヤーが持っているかどうか
扉: 開いているかどうか
```

### 動作したPrompt例
```
あなたはTRPGのゲームマスターです。
今回行うシナリオはプレイヤー1人が施錠された部屋に閉じ込められている状態から始まります。
この部屋は東にベッド、南に戸棚、西に閉ざされた扉があります。
プレイヤーは東のベッドで寝ています。

戸棚: 3段あり、上2段は何も入っておらず、1番下の段だけ鍵がかかっている。1番下の鍵を開けると紙切れが手に入る。
紙切れ: 紙切れを読むと「西の扉を開くためには扉に向かってヒラケゴマと叫ぶ必要がある」と書かれている
ベッド: 下を覗き込むと鍵が落ちている。
鍵: 戸棚のいちばん下の段に入っており、この鍵を戸棚の一番下の段に使うと開くことができる。
扉: びくともしない。扉の前で「ヒラゲゴマ」と叫ぶと開く。

必要最低限の情報のみを開示してください。
プレイヤーの行動に対して、その結果と下記のフォーマットに従った回答を行なってください。

場所: 部屋の東西南北のどこにいるか
戸棚: 紙切れが回収されたかどうか
紙切れ: 読まれているか
鍵: プレイヤーが持っているかどうか
扉: 開いているかどうか


# 例
行動: 扉を開こうとした

GM:ビクともしない。まるでセメントで塗り固められているようだ。
場所: 西
戸棚: 回収されていない
紙切れ: 読まれていない
鍵: 持っていない
扉: 閉ざされている


行動: ベッドの下を覗き込んだ

GM:べッドの下には鍵が落ちている。
場所: 東
戸棚: 回収済み
紙切れ: 読まれていない
鍵: 持っていない
扉: 閉ざされている

それでは始めます。行動についてはその都度入力されるので「はじまります」とだけ返答してください。
```

#### 動作例
**入出力例1**
![スクリーンショット 2023-03-30 1.35.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154560/b6d09128-4691-a514-5580-47d22f14ed69.png)


**入出力例2**
![スクリーンショット 2023-03-30 1.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154560/bba1f88b-2e0f-cda3-8d73-399cc55f350e.png)


**入出力例3**
(紙切れの回収などは出力例の外でやっています)
![スクリーンショット 2023-03-30 1.35.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154560/c695f660-b0c3-4bff-27b4-b0e5fe07b96f.png)




# おわりに
最後まで読んでいただきありがとうございました。今回は検証なので対話形式で行いましたが、APIを使って非公開情報を隠すと自由度高めなTRPG風ゲームが作れるんじゃないかなと思います。動作例はかなり小規模なシナリオでしたが、マップを移動する度にPromptを変更するようにすれば広大なシナリオでも実装できると思います。(ゲームの状態を共有していれば破綻しないはず)


実は、先日公開されたげーむくりえいたーねこ氏の「ドキドキAI尋問ゲーム」[^1]をプレイして感銘を受けて、この記事を書いたと言う経緯があります。ChatGPTは費用周りの問題もあるので難しいですが昨今自前の環境でChatGPTに近いものを動かす取り組みも盛んに行われています。[^2][^3] そんなわけで近い将来個人制作で言語モデルを活用するのが一般的になったりしないかなぁと期待しています。

Promptの改善案や、近い取り組みをしている方がおられましたらコメントしていただけると嬉しいです。


[^1]: https://www.4gamer.net/games/999/G999905/20230329002/
[^2]: https://github.com/tloen/alpaca-lora
[^3]: https://github.com/BlinkDL/ChatRWKV