Morikatron Engineer Blog

モリカトロン開発者ブログ

Red Ram のテキスト生成の全容

モリカトロンの宮本です。

弊社では、最近 Red Ram というマーダーミステリーアドベンチャーゲームを開発し、7月に開催された BitSummit Let’s Go!! ならびに11月に開催された CEDEC+KYUSHU で展示を行いました。このゲームではコンテンツのほぼすべてを生成AIが自動的に作成しています。

www.youtube.com

最初にユーザーが簡単な事件の設定を入力すると、設定に応じた殺人事件を生成AIが作り上げます。プレーヤーは刑事として無限に様々な殺人事件に挑むことが出来る、と言うものです。

ストーリーや謎、登場人物のセリフを始め、背景や人物、証拠品などのグラフィックもすべてその場でAIが生成します。(ユーザーが事件の設定を入力後、10分程度でコンテンツの作成が完了します)

今回は、テキスト関連コンテンツの生成部分に要点を絞って、内部でどのような処理を行っているかを公開します!

LLMによるコンテンツの生成

Red Ramのストーリーや会話シナリオはLLM(大規模言語モデル)によって生成しています。 LLMは入力された文章に対してそれに続く文章を生成して出力するものですが、特に、人間の意図に従った出力を行うよう調整されたモデル使うと、人間の指示によってLLMに意図したような文章を執筆させることが出来ます。
Red Ram では Open AIChatGPT のapiを使ってテキストコンテンツを生成しています。

事件全体のデータは大きなものになりますので、すべてを一度に生成することは出来ません。 ストーリーの考案や会話シナリオの執筆などは段階的に行っています。
(1つ事件のデータすべてを生成するために、LLMで70回〜80回程度の生成を行います)

storyの生成

まず殺人事件の根幹となる事件の大枠部分の生成を行います。

以下の情報を元にストーリーを生成します。

ユーザーが自由に入力した事件の設定

以下の項目はユーザーが自由に入力することが出来ます。

  • 凶器
  • 犯行場所
  • 被害者の職業
  • 犯行動機(4種類から選択)

ユーザーが入力したこれらの設定に沿った内容のゲームを、AIが自動的に作成していきます。

解決に至る捜査のフロー

これは事件解決に至るゲームの流れを表したものです。 各容疑者の居場所の開示や証言、物証の入手ルートを定義したものです。 あらかじめGPT-4によって数パターン作成しておいたものの中からランダムに選び、MERMAID記法で表現したものを入力に使います。

登場人物の氏名と性別

登場人物の姓名はあらかじめLLMで生成したものをランダムに選択して使うようにしています。 (毎回LLMに生成させると同じものが生成されやすいため、このようにしています)

性別は偏らないようにルールベースで決定しますが、被害者の性別だけはユーザーが入力した職業を参考にLLMに決定させています。 (「女優」など、性別が女性で無いと不自然な職業は女性になるような処理をしています)

LLMによって生成される内容

「ユーザーが入力した事件の設定」「フロー」「人名と性別」の情報をプロンプトに入れてLLM(GPT-4)に事件の大枠を生成させます。

(↓生成用プロンプトの一部)

あなたは世界的に有名なミステリー作家としてこれからミステリーゲームのストーリーを作成していきます。
 # プロットに必要な条件
- 登場人物は被害者と容疑者4人
- 容疑者はそれぞれ居場所が異なる
- 殺害動機は{motive}
- 殺害に使用した凶器は{weapon}
- 遺体発見場所は{scene}
- 遺体発見現場と各容疑者居場所では、「物証」一点と「証言」一点がそれぞれ得られる

# 要件
以下の項目のデータを執筆しなさい。
事件を解決するのはあなた(刑事)
(以下略)

生成される事件の大枠のデータは以下のような構成になっています。

  • タイトル
  • 導入部のテキスト
  • あらすじ
  • エンディング
  • 被害者の簡単なプロフィール
  • 容疑者(4人)の簡単なプロフィール
  • 容疑者にかかる嫌疑
  • 証言と物証の内容

証言と物証の意味を設定

次に、捜査の途中で得られる証言と物証がどのような意味を持つか?を設定していきます。
これは、証言と物証それぞれについて、「その証言(または物証)がどの容疑者の嫌疑を深める(または軽くする)ものか?」をフラグとパラメータで表現するものです。
まえのステップで作成した事件の大枠と人物の情報をプロンプトとしてLLMに与えることで、これらの情報を作成します。

人物と場所の詳細を設定

ここで、これまでに作成したデータを元に、人物と場所について詳細なプロフィールを作成します。 ここで生成されるデータの主なものは以下のとおりです。

  • 人物の詳細
    • 基本情報(年齢、職業、など)
    • その他の情報(性格、趣味、好きなもの、嫌いなもの、家族構成、経歴、他の人物との関係性)
    • プロフィールの要約
    • 画像生成に使用する情報(英語)
  • 場所の詳細
    • 情報(場所の外見、状況、調査可能な箇所、現場に残された痕跡、など)
    • 場所についての要約
    • 画像生成に使用する情報(英語)
  • 物証の詳細
    • 説明
    • 画像生成に使用する情報(英語)

ここでは会話シナリオの生成に必要になる、人物、場所、物証の詳細の情報を生成していますが、同時に画像を生成するための情報を作っています。
ゲーム内で使われる「人物の画像」「背景(場所の画像)」「物証の画像」はここで生成した情報を元に Stable Diffusion を使って生成しています。

会話シナリオの生成

ここまででようやく事件に関する情報をそろえることが出来ました。
いよいよプレイヤー(刑事)と容疑者の会話シナリオを生成していきます。 事件の情報をプロンプトとしてLLMに与えることで会話シナリオを執筆させています。

(↓生成用プロンプトの一部)

あなたはミステリー作家として、マーダーミステリーアドベンチャーゲームの捜査シーンの会話シナリオを作成してください。

以下の情報を元に容疑者との会話シナリオを作成してください。

# 事件の状況はこれを参照すること
グローブ通りの廃墟で久保田ハルキが殺害される事件が発生した。被害者の久保田はプログラマーであり、その死体からは凍った氷のナイフが見つかった。四人の容疑者が浮上し、物証と証言によりそれぞれの疑惑が深まる。

# 被害者
- 久保田ハルキ
    - 年齢: 32歳, 性別: 男性, 職業: プログラマー
    - 性格: 真面目で探求心が強い, 好きなもの: コーヒー, 嫌いなもの: 虫, 趣味: ボードゲーム, 出身国: 日本, 家族構成: 両親と兄がいる, 経歴: 大学でコンピューターサイエンスを学び、プログラマーとして働いている, 他の人物との関係性: 薄井りょう、庄司愛美、三好俊介とは仕事上の関係がある

# 容疑者
- 三好俊介
    - 年齢:32歳、性別:男性、職業:プログラマー
    - 性格:真面目で細かいところに気を配る、好きなもの:読書、嫌いなもの:騒がしい場所、趣味:写真を撮る、出身国:日本、家族構成:独身、経歴:大学でコンピューターサイエンスを専攻、他の人物との関係性:久保田ハルキとは親友で、共にプロジェクトを進めていた
    - 久保田との仕事上のトラブルからの殺害の可能性
    - 口調:丁寧な口調

# 容疑者の居場所の様子
図書館

# 要件
- 今回のシナリオの構成
    - 刑事は容疑者三好俊介と事件との関わりについて質問する。
(以下略)

刑事と容疑者の会話は「尋問部分」と「物証を発見する部分」の2つのパートから構成されていて、それぞれをLLMで作成しています。
プロンプトは事件の状況に応じて、用意された6種類のテンプレートに事件情報を差し込むことで作成しています。

実際に生成される会話シナリオは以下のような感じになります。

🕵刑事「この事件について質問がある。久保田ハルキとはどのような関係だった?」
👨‍💻三好俊介「久保田は僕と庄司さんと一緒にプロジェクトを進めていました。」
🕵刑事「なるほど、親友と一緒にプロジェクトを進めていたのか。久保田との関係には何か問題があったか?」
👨‍💻三好俊介「いいえ、特に問題はありませんでした。」
🕵刑事「ならば、なぜ久保田が殺されたのか理解できないな。」
🕵刑事「(庄司愛美には犯行動機があるし、犯行も可能だった。)」
……

全体の生成フロー

全体の生成フローは以下の図のようになります。

刑事と容疑者の会話シナリオの他に、以下のようなテキストも同時に生成しています。

  • 告発シナリオ(容疑者を告発〜逮捕に至るシナリオ)
  • エンディング用のテキスト
    • 事件の真相
    • 成功した未来(真犯人逮捕に成功した場合の刑事の将来に関するテキスト)
    • 失敗した未来(誤認逮捕してしまった場合の刑事の暗い将来に関するテキスト)
  • Red Ramのつぶやき(マスコットキャラのつぶやき)

CEDEC+KYUSHUで公開したバージョン

以上が、 BitSummit Let’s Go!! で展示した Red Ram のテキスト生成の全容となります。 11月に開催された CEDEC+KYUSHU では事件の生成部分にさらに改良を加えたバージョンを展示しました。

プロットの導入

このバージョンでは事件の大枠をデータとして生成する前に、プロットを作成するようにしています。 プロットはミステリーの構成要素をまとめたストーリーの設計図のようなものです。
(↓プロットの一例)

### Central Mystery
温泉宿「白鷺温泉」で私立探偵の長田マサトが毒入りカクテルにより殺害されました。死因は特定の毒物による中毒死です。

### Setting
事件は静かな温泉街の一角、「白鷺温泉」で起こりました。冬のシーズンで、雪が積もる中、多くの観光客や宿泊客で賑わっていた。

### Key Characters
- **主人公(刑事)**: プレイヤーが操作する、真実を解き明かす鋭い洞察力を持ったベテラン刑事です。
- **被害者(長田マサト)**: 知識豊富で経験も豊富な私立探偵。優れた推理力を持ちながらも、時にトラブルを起こすこともあった。
- **尾上みつお**: 情熱的な性格の若手起業家。投資詐欺の疑いで長田に調査されていた。
- **江口さとし**: 地元温泉街で小さな土産物店を営む。温厚な人柄だが、最近不振である。
- **岩崎しんじ**: ホテルの支配人で経営者。厳格な性格だが、ホテルの評判を守るためなら手段を選ばない。
- **馬場ひかる**: 心優しい女性マッサージ師。宿泊客からの評価が高いが、私生活は謎に包まれている。

### Clues and Evidence
- 毒入りカクテルの残り物
- 各容疑者のアリバイ
- 長田の持ち物の中に見つかった謎のメモ
- 各容疑者の個人的な物から発見される可能性のある痕跡や情報

### Red Herrings
- 外部からの不審な足跡
- 噂話や偶然の一致を誇張した証言
- 長田の過去の事件に関わる人物の存在

(以下略)

従来はストーリーの大枠を、構造化されたデータとして一度に生成するようにしていましたが、まずプロットとして形式を定めずに文章として生成させることでより緻密なミステリーを生成することを狙っています。
また、プロット生成時に「ミステリーのプロットの作り方」を外部知識としてプロンプトに与えています。 これは、いくつかのサイトで公開されているミステリー執筆のためのガイドをGPT-4にまとめさせることで作成しました。

(↓生成用プロンプトの一部)

You are an outstanding murder mystery writer. Create the plot of your murder mystery adventure game by following the user's instructions closely.
Creating a mystery plot is a complex but rewarding task. Here's a step-by-step guide to plotting a mystery story
1. **Choose a Central Mystery**: Begin by selecting a compelling crime or puzzle to serve as the heart of your story. This could be a murder, theft, disappearance, or any other event that needs solving. The mystery should be complex enough to engage your detective and your readers.
2. **Define the Setting**: Choose a setting that adds to the atmosphere of your story. Whether it's a historical city or a contemporary urban environment, ensure that it complements the plot and adds depth to the narrative.
3. **Identify Key Characters**: Develop characters with distinct personalities and motives. Include suspects, witnesses, and accomplices, each with their own secrets and roles in the story.
4. **Outline the Clues and Evidence**: Strategically place clues throughout the story. These should be logical and lead the detective and readers towards solving the mystery. Ensure that the evidence is credible and consistent.
5. **Plan Red Herrings**: Introduce misleading clues or false leads. These red herrings should be plausible and distract both the detective and the reader from the actual solution.

(以下略)

ここではプロンプトを英語で与えています。 (プロンプトは、一般的に英語で与えた方が性能が向上するのですが、他の生成箇所では生成された事件の情報などを再度プロンプトに差し込むことも多いため、日本語でプロンプトを与えています。)

証言と物証の意味の設定

証言と物証が捜査の中でどのような意味を持つか?の設定は、従来はストーリーの大枠生成後に行っていましたが、これらをプロット生成時にミステリーの一部として設定する方式にしました。 これによってシナリオ生成に至るまでのフローがややシンプルになり、捜査を進める上での証言・物証の意味合いも以前より明確になりました。

アップデートされた全体の生成フロー

アップデートされた全体の生成フローは以下の図のようになります。

最後に

以上が7月に開催された BitSummit Let’s Go!! ならびに11月に開催された CEDEC+KYUSHUで展示した Red Ram のテキスト生成の全容となります。 完成したゲームは、どんなに突飛な凶器や殺害場所を入力してもアドベンチャーゲームとして楽しめるものが生成できるようになっていたと思います。
一方で、証言や物証、動機などの論理的整合性を保ち、本格的な推理が楽しめるようなトリックを使ったミステリーを作れるような境地にはまだ至っていません。
現在も継続してアップデートを行っており、次回のイベント展示ではより進化したバージョンをお見せ出来るものと思います。 ご期待ください!