ChatGPTと恋愛する、マルチエンディング型恋愛ゲームの作り方

# どんなゲーム？
今回作成したアプリは以下から遊ぶことができます。もしよかったら触ってみてくださいね。

【追記】
サービスの提供は終了いたしました。プレイしてくださった方ありがとうございます。
![468nyaks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475516/60ac14b8-55b6-632a-d183-18693eadbc13.png)

~~https://line.me/R/ti/p/%40468nyaks~~

https://cafe-love-ai.notion.site/cafe-love-ai/b1393ee1bd084497aa543a19ee88baa3?v=3e753030c483436b8fcd019aa947cc9c

## 「AIと恋するカフェ」とは？

- 「AIと恋するカフェ」は、恋愛未経験の人がリアルな恋愛シミュレーションを楽しめるゲームです。
- 一人を長く深く攻略していくのもあり、複数人を効率よく攻略して行くことで、自分のスキルを磨くのもよし、様々な楽しみ方ができます。

![54B03C8A-0297-4236-B912-A86606EABEB6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475516/f3921c32-5776-89df-3482-82718201155d.png)

### 背景

- 20代の4割は恋愛未経験です。そんな方達に恋愛に慣れていただくために、リアルな恋愛シミュレーションを目指しました。

### 特徴
- **選択肢が無く、プレイヤーが発言することで物語が進むシステム**
    - プレイヤーが発言することで物語の展開が変わります。（例、熱海に行こうと行ったら熱海に行くし、渋谷に行こうと行ったら舞台は渋谷になります。）
    - かと言って何を喋ったら良いか分からない方に向けて、返信のテンプレートは用意しており、簡単に返信が可能です。
    - 物語のあらすじはありますが、展開は毎回ランダムに変わります
    - そのため、プレイヤーの数だけストーリー展開があると言っても過言ではありません。
- **共感や自己開示による採点**
    - あなたがヒロインに対して、共感したり自分のことを話したりすることで好感度が上がるシステムにしています。
    - 現実の恋愛でも重要なスキルをゲームで身につけることができます。
- **UGCやキャラクリエイト機能（未実装）**
    - 現時点では未実装ですが、将来的にはプレイヤーがあらすじを作ったり、好きなキャラクターをゲームに登場させるなどのUGC機能を実装したいと思っています。
    - 資金があればLive2D + 音声もつけてグリグリ動かすのもやりたいですね。
		
## ゲーム始め方
「AIと恋するカフェ」は、新人バリスタとなったあなたがヒロイン達との恋愛を通じて共感能力や恋愛に必要な力を身につける恋愛シュミレーションゲームです。カフェでの仕事やデートを通じて関係を深めましょう。
「AIと恋するカフェ」の公式アカウント友だち追加して、「ゲームを始める」と入力することでゲームが始まります。

### 遊び方
ゲームが始まると、ナレーションと共にキャラクターが発言します。
メッセージの最後に以下のように聞かれるので、プレイヤーになりきって発言してみてください。（「進める」を入力した場合は何も発言せずにゲームが進行します。）

```
🤖 …
アイはあなたの答えに興味津々の目を向けながら、あなたに話しかけます。
アイ:「エスプレッソですか。私も好きですよ。」
あなたはどう答えますか？
（そのままゲーム進める場合は「進める」と入力してください）
```

:::note warn
💡 括弧書きで自分の感情なども入れると反映してくれます。

「summary」と発言すると今の評価を聞ける機能もあります。
:::

（評価はガバガバですw）

![8A6BC612-0794-4751-BABD-8CB2B6773DF4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475516/ac1da4ae-0de0-ac8b-8b02-80bd736e4a57.png)


# 仕組み
今回はChatGPT APIを利用して、このサービスを作ってみました。

## 環境など
Node v18.16.0
LangChain 0.0.84
インフラ周り：Cloud Run + Cloud SQL

## サーバーサイド
サーバーサイドにはNode.js + TypeScript（expreess）をCloud Runで動かしています。ChatGPTのAPIの呼び出しや、Indexの作成などにLangChainを使ってます。エラー時のリトライなども自動でやってくれるので良きです。LineBotは[LINE Messaging API SDK for nodejs](https://github.com/line/line-bot-sdk-nodejs)でメッセージを処理しています。


ChatGPT APIは会話の履歴を保存てくれないrestなapiなので、会話履歴はCloud SQLに保存しています。ORMはPrisma（最高）
※LangChainにも会話履歴をRedisに保存するRedisChatMessageHistoryがあるのですが、Redisは何かとお高いので、普通にDBに保存しています。

## ハマりどころ
- プロンプト周り
基本ですが、トークン量的にプロンプトは英語で書いたほうがいいです。（in Japaneseや日本語で例を書いてあげると日本語で出力してくれます。）

- 記憶問題
ChatGPT APIは会話履歴を記憶しないので、どのように過去のやり取りを記憶させるかがサービス開発者にとっては鬼門となりそうですが、直近3〜4回のやり取り＋過去5~10回くらいまでの会話を要約するといった方法でうまくいきました。トークン数に余裕があればもう少し増やしてもいいかもですね。

- Indexes
ゲームの設定などがあればそれを読み込んでベクトルストアにすることで、その応答に適切なゲームの設定を取ってくることもできます。プロンプトは以下のように、追加情報を記載してあげます。（LangChainのRetrievalQAChainなどが活用できます。）
```
relevant information includes the following.
${indexes}
```
- Node周り
LangChainをcommonJSで使っていたら、ERR_PACKAGE_PATH_NOT_EXPORTEDなど色々エラーが出てハマりました。はじめからESModulesで作るのをおすすめします。


## 今後のアップデートについて
ユーザーとのやり取りをより記憶したり、ニュースなどの最新の情報を使った会話などを実装できればと思っています。
さらに、UGCやキャラクリエイト機能も実装予定です。

## ゲームへの感想など
感想などがありましたら、以下ハッシュタグをつけてツイートしてくださいませ！

`#AIと恋するカフェ` `#恋カフェ`

## 今後の更新情報が知りたい方へ
公式アカウント「@cafeloveai」をフォローしていただけると励みになります！

https://twitter.com/cafeloveai/status/1665421428483674112

## 終わりに

7、8年前からできたら良いなと思っていたことがChatGPTであっという間にできてしまうのは嬉しくもあり、恐ろしくもありますね。
まだ、トークン数の課題などはあるもののChatGPT4 APIが一般公開されたり、技術の進歩で課題は解決されていきそうですね。

※このゲームに登場するキャラクターやその他名称は架空のものです。実在の人物・団体とは一切関係ありません。