その他
    ホーム 職種別 エンジニア ChatGPTをAPIサーバー化しつつ恋愛したかった件
    ChatGPTをAPIサーバー化しつつ恋愛したかった件
     

    ChatGPTをAPIサーバー化しつつ恋愛したかった件

    今回は、アピリッツの知識共有サイト「ナレッジベース」で公開されている内容をアピスピでも紹介します。
    ゲームエンジニアとして活躍されている鳴澤秀夫さんの記事です。
    ChatGPTについてユーモアを交えながら興味深く説明いただいています!
    是非最後まで読んでください!(初版:2023年3月30日)

    エンジニア兼二次元を愛する者、鳴澤です。

    さて、ここ1年ほど毎日IT界隈を騒がせているチャットツール「ChatGPT」は、もうご存知ですか?

    OpenAIが開発した大規模言語モデル(LLM)を用いたチャットbotで、利用者の問いかけに完璧かつ柔軟に回答してくれる優れものです。なんならコードまで書いてくれるんだから便利ですね。

    私もゲーム開発者なので、ChatGPTを利用したゲームを作ってみたいな〜なんて思っていたところに「ChatGPTのAPI公開」のニュースが飛び込んできました。

    これは………作るしかない!ゲームを!!

    OpenAIのAPIでゲームを作ろう

    私はChatGPTでこんなことを試した事があります。

    私:あなたはこれから「ツンデレ」になって私と会話してください。
    さて、最近ゲームを買いすぎる割に全然遊べなくて困っています。一緒に遊んでくれませんか?
    
    ChatGPT:な、なんで私があなたに付き合わなくちゃならないのよ!
    でも、確かにゲームが好きだから、少しだけ付き合ってあげてもいいわよ。
    でも、私の時間も大切だから、ちゃんと進められるように準備はしっかりとしてね!

    若干アレな気もするけど、良い感じにロールプレイしてくれてると思います。

    ……そうだ、ChatGPTと恋愛するゲームにすれば面白そう!

    実際にゲームからChatGPTのGUIを操作する事はできないので、開発元のOpenAIが公開しているChatGPTやGPT4のAPIを叩くことになりそうです。

    処理方針

    これでChatGPTと恋愛するゲームが完成するはずです。

    ここで重要となるのは工程1の「役割の説明とセリフの依頼」です。
    ここはゲーム側で表示せずに裏でAPIにメッセージを送って”仕込みをする”形で良いでしょう。

    それでは早速実装…と言いたいところですが、APIは従量課金らしいのでAPIを実際に利用する前に、ChatGPTのGUI(基本無料)でやりとりの動作確認をしてから実装に入っていこうと思います。

    私:これからあなたを幼馴染の美少女キャラクターと見立てて、恋愛シミュレーションゲームのようなやり取りをします。
    あなたと私はとある高校生の生徒で、2人の家は隣り合っています。
    あなたは毎朝、私と一緒に通学するために私を家まで起こしに来てくれます。
    
    まずは、あなたの方から私に声をかけてください。

    と「役割の説明とセリフの依頼」をしたら、ChatGPTからはちゃんと期待通りのレスポンスがきました。

    ChatGPT:おはよう、今日も一緒に学校行こうね!起きてる?

    うん!とても可愛い! じゃあさっそく返信文を書こうかな〜!………

    思ったんだけど、これゲームアプリなんか準備せず、各自でChatGPTのGUI上で会話してればよくない?

    ゲームっぽくしたい

    好感度や喜怒哀楽の数値化

    恋愛シミュレーションゲームについて考えてみます。

    選択肢があって、登場人物には好感度といったパラメーターが存在し、その値によってその後が左右されるゲームもあるはずです。
    AI側でそういった感情面のパラメーターを持つ事ができるのならば、それをゲームに応用する事ができるかもしれないと考えました。

    私:これから毎日、返信時に文章に込められた喜怒哀楽と私への好感度をそれぞれ1~10の値で表してください。
    1は最低で、10が最高とします。
    
    今日も仕事が大変なんだ、慰めておくれよ。

    で、こちらが返信。

    ChatGPT:大変そうですね。一緒に頑張りましょう!
    喜:3、怒:1、哀:7、楽:2、好感度:8

    ちゃんと指定した基準は達成していますね。

    この文字列から「喜:3、怒:1、哀:7、楽:2、好感度:8」の部分を文字列取得してアプリ側で処理すれば、ルート分岐の生成であったり立ち絵の表情差分の切り替えなんかが実現できるかもしれません!

    …でもこの文字列のパースをするのって結構面倒くさそうだし、万が一フォーマットがちょっとでも崩れたらゲームが止まってしまいますね。困りました。

    そうだ、ChatGPTにjsonを書かせて、それをパースすれば良いのではないか!?

    ChatGPTを”APIサーバー化”すればいい!

    ChatGPTのAPIを利用しつつ、さらにjsonを返してもらう事で「ソシャゲのAPIサーバー」的な働きをさせれば完璧なんじゃないでしょうか。
    (実際のOpenAIのAPIはレスポンスがjson形式なので、jsonの返信パラメーター内に更に独自規格のjsonを書いてもらうイメージです。)

    日頃の業務経験が生きた感じがして素晴らしいですね。

    …といった感じで、私が考えた「ChatGPTに絶対jsonを書かせる長ったらしいプロンプト」が以下となります。

    私:これからあなたを幼馴染の美少女キャラクターと見立てて、恋愛シミュレーションゲームのようなやり取りをします。
    まずはあなたの方から私に声をかけてください。
    
    なお、あなたの回答は以下のようなJsonフォーマットとします。これはあなたから届いた文字列をそのままゲームアプリに組み込むからです。
    なので、以下のjson範囲外の文字は1文字たりともレスポンスに加えないでください。
    {
        "message": "あなたからのメッセージ",
        "choice": {
            "1": "選択肢A",
            "2": "選択肢B"
        },
        "favorability": 0,
        "emotions": {
            "joy": 0,
            "anger": 0,
            "sorrow": 0,
            "fun": 0
        }
    }
    仕様を説明します。
    messageは、あなたから私へ向けたメッセージです。
    
    choiceは、私からあなたへの返答をする際に選ぶ選択肢です。2つ、あなたの方で考えてください。
    
    favorabilityはあなたから私に対する好感度です。0から10の間で表現してください。
    0は私に対して一切無関心、10は私と恋人になりたいと思っている状態です。
    
    emotionsはあなたの現在の喜怒哀楽を表します。joyは喜、angerは怒、sorrowは哀、funは楽です。それぞれ0から5の間で表現してください。
    
    それでは、これから私とあなたの恋愛シミュレーションゲームを始めます。
    あなたと私はとある高校の生徒で、2人の家は隣り合っています。
    あなたは毎朝、私と一緒に通学するために私を家まで起こしに来てくれます。
    あなたは今、私を起こしに来ました。
    それではセリフと選択肢を考え、json形式で返してください。

    さて、ちゃんと動くかな…?

    ChatGPT:
    {
    	"message": "おはよう!今日も一緒に学校行こうね!",
    	"choice": {
    		"1": "うん、ありがとう!",
    		"2": "もう少し寝たいかな…"
    	},
    	"favorability": 5,
    	"emotions": {
    		"joy": 3,
    		"anger": 0,
    		"sorrow": 0,
    		"fun": 2
    	}
    }

    素晴らしい!!

    あとはこれをアプリ側でパースすれば、選択肢や好感度・感情機能について尚且つシナリオを考えるコストを削減した恋愛シミュレーションゲームが完成する!

    実際にChatGPTのGUI上で遊んでみる

    私:もう少し寝たいかな…
    
    ChatGPT:
    {
    	"message": "そっか…。もう少し寝てていいよ。",
    	"choice": {
    		"1": "ごめん、ちょっと寝坊しそうだからやっぱり一緒に行こう。",
    		"2": "起きたら追いつくから大丈夫だよ。"
    	},
    	"favorability": 3,
    	"emotions": {
    		"joy": 1,
    		"anger": 0,
    		"sorrow": 2,
    		"fun": 0
    	}
    }

    幼馴染ちゃんを悲しませてしまった…2あった”楽”感情は消え去り、”哀”がちゃんと増加しています。さすがですね。

    私:起きたら追いつくから大丈夫だよ。
    
    
    ChatGPT:
    {
    	"message": "そうなの?でも遅れないように気をつけてね。",
    	"choice": {
    		"1": "大丈夫!遅れたら携帯で連絡するよ。",
    		"2": "うん、気をつけるよ。"
    	},
    	"favorability": 4,
    	"emotions": {
    		"joy": 2,
    		"anger": 0,
    		"sorrow": 0,
    		"fun": 1
    	}
    }
    私:大丈夫!遅れたら携帯で連絡するよ。
    
    ChatGPT:
    {
    	"message": "ありがと!でも、携帯に電話が来たら教えてね。",
    	"choice": {
    		"1": "わかった!気をつけるよ。",
    		"2": "もちろん、忘れないよ。"
    	},
    	"favorability": 6,
    	"emotions": {
    		"joy": 3,
    		"anger": 0,
    		"sorrow": 0,
    		"fun": 2
    	}
    }

    お気づきになられただろうか。最初のメッセージよりも好感度(favorability)が上昇している事に。

    折角起こしに来たのを拒否されたにも関わらず、もっと主人公を好きになる幼馴染の図です。
    この後、紆余曲折の末に学校にいるはずなのにランチにイタリアンのお店に行く計画を立てるストーリーになりました。

    API使用料をチェックしておく

    いざOpenAIのAPIを使ってみようと思うのですが、念のため利用料金を調べておきます。

    APIの料金は従量課金制で、『GPT-3.5 Turbo / 4K context』であれば1000トークン=0.002ドルとなっております。

    GPT-4 / 8K context』の方が賢いAIを使えますが、1000トークン=0.06ドルと多少値が張るので注意です。(それでも安めですが)

    トークンとは”文字の塊”の事らしく、「I have a pen」だと4トークンとなります。そこそこな長文でも安く済みそうで良いですね。

    早速OpenAIサイトでトークン計算ツールに先ほどの「長ったらしいプロンプト」を投げてみたところ…

    「873トークン」(0.001746ドル = 0.26円)と出ました。安くないですか!?

    (日本語などの2バイト文字を使った場合は、半角英数よりもトークンが多少多くなってしまう事だけは少し注意しておいてください。)

    最後に

    こういったゲームが簡単かつ低コストで作れることが分かったことは大きいですね。

    海外のゲーム業界ではどうやら、RPGのモブキャラ全員にOpenAI系のAPIを組み込むことで「ここは◯◯の街だよ」としか喋れない状況から脱させて、町中の人たちと自由にコミュニケーションできるようにする…なんて試みもあるそうです。

    最初の街の隅でウロウロしている「ここは◯◯の街だよ」なんて最初に言ってきたキャラクターと相思相愛になって結婚したりする日なんかもくるかもしれませんね。

    それではまた!

    ーーーー

    鳴澤さんありがとうございました!

    アピリッツでは自分が得た情報や技術を積極的に共有し、それらを吸収しながら各々のスキルアップを目指しています。
    アピリッツに少しでも興味を持った方、エントリーお待ちしております!

    エントリーはこちらをチェック→〈https://recruit.appirits.com/mid_career

    記事を共有