見出し画像

【実験】ChatGPTにゲームキャラを行動させてみた。【動画あり】

以前、GIGAZINEの記事を紹介しましたが、掲載論文を読んで興味が湧き、自分で自律的NPCを作ってみました。目指すのはChatGPTにNPCの行動を決めさせる仕組みです。研究チームと同じPhaser3というフレームワークを使用しています。

『ゲームのNPCにChatGPTを仕込んだら勝手にパーティーの計画を立て始めた - GIGAZINE』


この記事のポイントは次の通りです。
1、現在ゲーム業界ではNPCの会話を人口知能によって自動生成させる取り組みが進んでいる。

2、スタンフォード大学やGoogleの共同研究チームによって「ChatGPTを活用してNPCの行動を自動決定する仕組み」が開発された。

3、どのような仕組みかというと、「研究チームは各NPCの全行動を記録した「メモリーストリーム」を作成し、メモリーストリームの内容から「今の行動の判断に必要な過去の行動」を選び出してChatGPTに入力する仕組みを構築。これにより、各NPCはこれまでの経験を元にした行動を実行できるようになった」とのこと。

筆者が作ったのは論文と同様に環境と自らの行動を知覚し、記憶し、計画を立て、行動するNPCです。ただ論文では25人のNPCを動かしているのに対し、筆者は1人しか動かしていません。また元の研究では記憶に様々な処理を加えていますが、筆者は加工をせずにNPCの記憶をChatGPTに送信しています。
ですから研究内容の、「メモリーストリームの内容から『今の行動の判断に必要な過去の行動』を選び出してChatGPTに入力する仕組み」はまだ出来上がってません。ですが、メモリーストリームと言える代物は出来たので今後、継続して開発していくつもりです。
今のところゲーム内時間で6日~7日まで自律的に行動させられています。それ以上はエラーがでてしまい進められません。筆者のコードが悪いか、OpenAI側の仕様なのか原因はまだ分かってません。

論文で紹介されているテクニックを参考にプログラミング初心者が最低限の自律的NPCの仕組みを作ってみた、という感じです。

出来たのがこちら。


画面の見方

登場人物は3人。
アッシュ:強く勇敢な戦士で、モンスターとの戦いに身を捧げている。金髪。
ハンナ:勤勉なビジネスウーマンで、経営する道具屋ではさまざまな商品を取り扱っている。
ジョセフ:熱情的な男性で、剣や槍などの武器を提供している。

画面左上がアッシュの小屋とその内装。その東にはジョセフの武器屋、南にはハンナの道具屋。論文では村が舞台でしたが遊び心からドラクエ風RPGのフィールドを作りました。各地に洞窟といったダンジョンが設置されています。

フィールドにはちゃんとモンスターを出没させています。(動画で四角い枠線がチカチカ表示されてますがそれがモンスターの位置です。)アッシュがモンスターと接触すると「アッシュはモンスターを倒した」という記憶が保存されChatGPTに送信されています。

NPCが指定された地点に到達した時点で行為を完了させているので、絶えず移動しているように見えます。あとで移動後NPCを停止させるコードを追加するつもりです。そうすればちょっとは自然になるはず。

この動画内でアッシュはChatGPTが立てた予定に従って二日目を次のように過ごしました。ここでは活動名と位置が時系列順で記録されてます。これをNPCの記憶と見なしてChatGPTに送信し、翌日の計画を立ててもらっています。ちなみにtemperatureは1.0です。

「目を覚ます(20,150)」
「料理(380,60)」
「キャビンにキッチンがある。」
「朝食(320,130)」
「リビングルームにテーブルがある。」
「トレーニング(30,250)」
「ベッドルームに防具がある。」
「野外探索(900,780)」
「モンスター狩り(1550,90)」
「アッシュはスライムを倒した。」
「ダンジョン1がある。」
「帰宅(220,350)」
「料理(380,60)」
「夕食(320,130)」
「読書(50,80)」
「ベッドルームに本棚がある。」
「眠る(20,140)」

これで論文に掲載されているMemory Streamっぽいものが出来ました(下画像左図)。

Generative Agents: Interactive Simulacra of Human Behavior(2023)より


筆者が作成した仕組みではアッシュはChatGPTの立てた計画通りに行為しますが、論文では計画と異なる行動もできるようにしているようです。これができればもっと面白くなりそう。

ゲーム内時間で5日間行動させるとだいたい100~110項目の記憶が保存されます。

3日目にはジョセフと次のような会話をしています。原文は英語です。

アッシュ「 ジョセフ!久しぶりだな、友よ! 」
ジョセフ「 アッシュ!会えて嬉しいよ。今日は何の用事で来たんだい?」
アッシュ「 ただ新しい装備があるかチェックしに来たんだ。いつも君のところには最高のギアが揃ってるからね。」
ジョセフ「 ちょうど新しい剣と槍が入荷したんだ。それと、特別なアイテムも作ったんだけど、君のために特別に用意したものだよ。」
アッシュ「 もちろん!いつも君の職人技には信頼してるよ。見せてもらおうか。」
ジョセフ「 ほら、この剣を見てごらん。最高級の鋼で作られていて、どんなモンスターでも有効なんだ。」
アッシュ「 これはぴったりだな。で、君が作った特別なアイテムは何だい?」
ジョセフ「 それは戦闘中に力と速さをアップさせるポーションさ。僕しか作れないもので、君にとって役立つこと間違いなしだよ。」
アッシュ:「それはすごい!ありがとう、ジョセフ。いつも君のサポートに感謝してるよ。」
ジョセフ:「どういたしまして、アッシュ。いつだって君を支えてるからね。危険な目に遭わないよう気をつけてね。」

この会話はChatGPTに作らせています。アッシュが指定された位置にくると自動的に作成されます。ただ、前後の会話を考慮させていないため会話に発展がみられません。ですから毎回こんな単発の会話が出力されます。この点も今後の改善点です。

まだまだ書きたいことはありますが長くなってしまうので今回の記事はここまでにします。次回は使用したプロンプトについて書きたいと思います。


この記事が気に入ったらサポートをしてみませんか?