17世紀の執務室を舞台にしたポイント&クリック方式のアドベンチャーゲーム のプレイ動画がスマートフォン向けのポートレートモードで表示されている。メッセージウィンドウや選択肢を通じて、探し物を見つける事務員の物語が詳しく描かれている。プレイヤーは、リアルに描かれた17世紀の内装をスクロールし、画面下部のインベントリに表示されるシーン外のアイテムを集めていく。インベントリのアイテムを執務室の中のアイテムの上にドラッグすると、パズルが解ける仕様。
機械学習モデルを活用してオンデマンドで作成されたポイント&クリック方式のアドベンチャーゲーム

AI技術を基にしたテキストゲームは、文章生成が行える言語モデルと同じくらい歴史があり、チャットモデルがストーリーを誘導する形でゲームが進行します。そして、Text-to-Imageモデル(文章から画像を生成する機械学習モデル)の進化により、文字だけでなく、イラストを通じてシナリオが描けるようになりました。しかし、こういった体験は基本的にテキストベースで展開されるため、イラストとインタラクト(プレイヤーがゲーム内で特定の動作を行なうこと)する方法や、プレイヤーの行動にペナルティを課すような制約は設けられていませんでした。

従来のポイント&クリック方式のアドベンチャーゲーム(あるいは隠しオブジェクトゲーム)を再現するには何が必要か、また、これらを実現できる言語モデルは存在するのか、といったテーマを検証するため、私たちはブラウザゲームのプロトタイプを作成しました。このプロトタイプは、プレイヤーの入力内容に応じてさまざまなアイテムが配置された密室を作成し、短い脱出ゲーム方式のパズルを生成します。そして、アイテムをクリックすることで、プレイヤーはアイテムとインタラクトすることが可能です。

今回は、私たちの実験的な取り組みの詳細や、機械学習モデルを活用した方法やプロセスなどをご紹介します。

ゲームの概要

まず、プレイヤーが「城」や「海賊船」といった短いフレーズを入力すると、室内とストーリーの目的が生成されます。

黒い背景に白い文字で「海賊船」と書かれたテキストボックスが船室内部のリアルなイラストを指し示している。イラストの下には「あなたは船倉にいます。ドアは密閉されているようですが、窓は力を加えれば開くかもしれません…」と書かれたもう一つのテキストボックスが表示されている。
プレイヤーが入力した短いフレーズが、室内のイメージと脱出の目的を生成する

プレイヤーはアイテムをタップしてインベントリに取り込み、それらをドラッグしてパズルを解き、密室からの脱出を目指します。

ゲーム内の倉庫のシーンを描いたGIFアニメーション。プレイヤーは視点を部屋の左に移動させ、画面下部のインベントリから「ダストシート」というアイテムを取り出し、倉庫内の防水シートの上にドラッグする。すると、「即席のたたき棒」という新たなインベントリアイテムが出現する。それをドアの上にドラッグすると「完了!即席のたたき棒でついにドアを突き破ることに成功しました」という画面が表示される。
プレイヤーは、画面下部のインベントリにあるアイテムを室内の他のアイテムの上にドラッグすることでパズルを解いていく

ひとつの部屋の脱出に成功すると、同じテーマで作られた新たな部屋に進むため、プレイヤーは無限に遊び続けることができます。

最初の部屋とインタラクティブなパズルが生成されるのに、およそ1分かかります。その間に、プレイヤーがリクエストしたテーマに基づき、大規模言語モデル(LLM)を搭載したゲームキャラクターが、会話ツリー(複数の選択肢からなる会話の分岐システム)を使ってプレイヤーとの会話を開始します。このプレイヤーとキャラクターのやり取りは、この後、部屋に配置されるアイテムの説明文にも影響するため、生成の待機時間もメインのゲーム体験と結びつくように設計されています。

ロボットアバターの隣に緑色の文字で「ジジジ!あ、人間の訪問者ですね!待って、逃げないでください…」と表示されている(台詞はさらに続く)。それらの下には「悪いけど、私はここから脱出する...」「実はアンティークのパワーコアを扱う仕事をしていて...」などの3つの選択肢が表示されている。会話のインターフェースはグレーがかったワークショップの背景に重なっている。
密室とパズルが生成されるまでの間、プレイヤーはゲーム内のキャラクターと会話することができる

制約

私たちは、専門的なエンジニアリングの知識やリソースを必要とせず、エンドユーザーへの要求もなく、一定の規模で展開できるゲームを目指していました。そのため、webアプリケーションのサーバーを実行する際に呼び出すAIモデルは、外部の環境でホストされているものを導入することにしました。その結果、Anthropic社の次世代生成AIモデル「Claude」と、最先端のパフォーマンス、コスト、スピードのバランスが取れたモデルホスティングサービスの視覚および画像言語モデルの活用を決めました。

イラストの生成

このゲームで必要な入力は「城」や「海賊船」といった短いフレーズのみです。私たちの最初の課題は、入力されたテキストを基に、面白い脱出ゲームのベースとなる画像を生成することでした。画像生成には、ひとつのイラストに複数の被写体を描写する機能を搭載したFLUX.1を利用しました。また、面白いパズルを作るには、画像生成パイプライン(下図)により多くの情報を与え、たくさんの物が散らかった部屋を生成する必要があることがわかりました。これを達成するため、LLMが入力された短いフレーズを拡張し、プレイヤーの視点や照明、部屋を埋めつくすアイテムなどを提案し、リストアップします。

コードエディターの2つのペイン。左のペインはLLMに向けた指示。リクエストされたアイデアをフォーマットし、特定のカメラアングルと大量のアイテムを描いた画像のプロンプトを生成する方法を説明している。右のペインはその結果。LLMは散らかった 「雰囲気のある洗濯室 」に関する詳細な説明を返している。
LLMが最初のプレイヤー入力をより詳細な画像プロンプトに拡張し、散らかった部屋のイラストを生成するためのアイテムを提案する。

この方法では、LLMが提案したアイテムのすべてを実際のゲームに取り入れる必要はないということが重要なポイントです。そして、この段階で生成された画像と、その中の検出可能なオブジェクトがパズルの基礎を作ります。

セマンティックセグメンテーション

次のステップは、パズルを構成するオブジェクトの特定です。このためには、非常に優れたセマンティックセグメンテーション(画像のピクセル一つひとつに対して、何が写っているかといった、ラベルやカテゴリー付けすること)が必要になります。このタスクに対して、まずは既存のモデルやパイプラインをいくつか試してみたものの、従来のアプローチでは必要なアイテムの識別やセグメンテーションの精度が得られませんでした。検出されるオブジェクトは、ゲーム内でプレイヤーがインタラクト可能なアイテムであるため、ラベル付けが不十分なアイテムはプレイヤーの没入感を損なってしまいます。

暗い背景に明るい文字やテキストボックスを重ねた図。左側には、リアルな海賊船の船室内部のイラスト。イラストからは右に矢印が伸び「オブジェクトを特定する:LLM」と書かれたテキストボックスを指している。このボックスからさらに右に矢印が伸び「オブジェクトの位置を特定する:Florence & SAM」と書かれたボックスを指している。最後、右側には、リアルな部屋のイラストがあり、室内の多くのオブジェクトがさまざまな色でアウトライン化およびラベル付けされている。
部屋のイラストをAnthropic Claudeに取り込むことで各アイテムがリストアップされる。それらのアイテムを次にFlorence 2に取り込み、最後にSAMに取り込むと、アイテムの位置が特定および抽出される

最終的には、画像内のアイテムを特定するためにClaude、それらのアイテムのバウンディングボックスを検出するためにFlorence 2、ボックスをセグメントとして切り出すためにSAM(Segment Anything Model)を活用することにしました。これらのモデルを組み合わせることで、オブジェクト識別の精度が向上し、プロジェクトが終わる頃には、プレイヤーからオブジェクトの誤認識について指摘されることはほとんどなくなりました。

このアプローチはRAM-Grounded-SAM(Recognize Anything ModelとGrounded-Segment Anything Modelの強みを組み合わせたAIモデル)から着想を得ています。現代の視覚学習モデルが多数の異なるオブジェクトを識別でき、Florence 2が非常に優れた視覚言語モデルであることも、このアプローチの利点のひとつでした。

パズルの作成

オブジェクトでセグメント化された画像が生成されると、次にオブジェクトのリストをLLMに提供し、パズルを構築します。パズルの構造は比較的単純です。ひとつのアイテムを別のアイテムに対して使用することで、アイテムのひとつを更新、新しいアイテムを合成、または最終脱出のために使用できます。例えば、以下のようにアイテムを組み合わせることが可能です。

椅子の脚+暖炉=燃え盛るトーチ(椅子の脚とインベントリを交換)
ドライバー+机=隠された鍵
隠し鍵+ドア=脱出

Claudeは、私たちの予想以上に論理的で矛盾のないインタラクションを生成することができましたが、下記のような難解かつ不自然なインタラクションが生成される場合もありました。

紙+水=鍵の型
アクションフィギュア+ランプ=鍵穴にロウを流し込む
バイク+天井の換気口=脱出

画像編集

プレイヤーが謎解きを進めるに合わせて、部屋自体もプレイヤーのインタラクションを反映し、更新されなければなりません。そのため、私たちはインペインティング、または生成塗りつぶし(画像の一部を修正または別のものに置き換える機能)を基にした画像編集の手法を取り入れました。

まず、プレイヤーがゲーム画面でアイテムを「掴んだ」とき、それらは部屋の中から取り除かれる必要があります。最初に生成された画像にはアイテムがすでに配置されているため、プロセスをさかのぼり、掴んだアイテムを切り取ってから、その隙間を塗りつぶすことで、部屋からアイテムを取り除くことができます。私たちはまず、Stable Diffusion 1.5やXLといった前世代の画像生成AIモデルを試してみましたが、隙間の細部まで補正するには最新のFLUX Devモデルを活用する必要があることがわかりました。Devは、取り除かれたアイテムの後ろに敷かれたラグの模様までも正確に補正させることができたのです。

スマートフォン向けのポートレートモードで倉庫のシーンを表すGIF。プレイヤーは地面にある「巻かれたロープ」をクリックすると、それは画面から消え、インベントリに表示される。次に、視点を右に動かし棚の上の「ダストキャッチシート」を選択すると、同じアクションが発生する。アイテムが収集されるたび、それらのアイテムの説明が表示される。
インタラクションが可能なオブジェクトに対しインペインティングを使用することで、プレイヤーがオブジェクトを掴むと、そのオブジェクトが部屋から取り除かれる
ランプ、本棚、ロウソク、ベッド、上品なカーペットが置かれた豪華なベッドルームをリアルに描いた二枚のイラストが並ぶ。左のイラストでは、カーペットの上に数冊の本が開いて置かれている

。右のイラストでは、本が取り除かれ、代わりに太陽の光がカーペットを照らしている。
インペインティングによって、カーペットの模様など、オブジェクトの後ろの背景を塗りつぶすことができるため、アイテムを部屋から取り除くことができる

私たちは、パズルの最中に発見または合成されたアイテムのインベントリアイコンを生成するためにも、インペインティングを活用しました。横に並んだ2コマの画像を生成し、左は元のアイテムの参照画像として固定され、右はインペインティングで更新されたアイテムを描写します(たとえば、「魔法のオーブ」から「光るオーブ」への変化など)。

アンティークの本棚に吊るされた地図をクローズアップした、二枚のリアルなイラストが横に並んでいる。左のイラストの地図には細かいディテールが描かれ、短剣のようなものが取り付けられている。右のイラストでは、同じ地図に、細かいディテールの代わりに粗い印がつけられている。
この地図のように、インペインティグは、プレイヤーのインタラクションに反応し、ゲーム内の特定のオブジェクトの見た目を書き換えることができる。

最後に、ゲーム内のアイテムの見た目がパズルの内容と一致するよう調整するため、より本格的な画像編集機能が必要でした。たとえば、機械装置が作動して光線が発せられている様子を描写する場合など、変化の内容を表した画像と説明をベースに、元のオブジェクトとそれに対して起きた変化を描写した新たな画像を生成できるような機能です。

これらに特化した現行または最新のモデルやパイプラインは存在していたものの、少なくともこのプロジェクトが進行していた時点では、安価かつ外部でホストされているモデルAPIを使用する、という自分達に課した制約により、それらを利用することはできませんでした。代わりに、私たちはインベントリ画像の作成プロセスと同じような2コマの生成方式を用い、左のイラストをアイテムの元々の見た目として参照し、右のイラストにインペインティングで更新されたアイテムを生成する方法を活用しました。

バックストーリー

前述したように、入力されたテーマに沿ったキャラクターとの会話は、最初の部屋の生成時間(約1分)を埋めることと、ゲーム本編におけるアイテム説明にアレンジを加える、というふたつの目的を果たしています。ふたつ目の目的は、当初はあくまでも実用的な理由から実装したものでしたが、結果的にゲーム体験に大きな影響を与えました。パズルジェネレーターは、アイテムの短い説明と、パズルを解く手順のヒントを生成します。そして、キャラクターとのやり取りを基にしたバックストーリーをアイテムの説明やヒントに加えることで、ゲームの没入感を高めることができました。

前:マホガニーの椅子
後: ああ、それはミドルトン様が大事になさっていた椅子です。海外から輸入したマホガニーのフレームにベネチアンシルクのクッションをあしらっていて…

興味深い会話や台詞を構成するため、私たちは「ドラマの根本には葛藤があり、ドラマ上のすべてのシーンは、正反対な人物同士の対立から始まる」という古くからある脚本術を参考にしました。

私たちの構築したシステムは、ゲーム内のすべてのインタラクションをユニークな台詞や説明で補うことができ、この点が従来のゲームとは異なる要素のひとつだと思います。古典的なアドベンチャーゲームでは、「YにXは使えない」と表示されるか、プレイヤーのインタラクションを防ぐような手段が用いられます。しかし、このシステムを活用すれば、さまざまな組み合わせのマトリックスをLLMに送ることで、バックストーリーのようなディテールを補完することが可能となります。

オーケストレーション

私たちの構築したシステムには、互いに依存する異なる生成タスクが複数含まれています。たとえば、部屋の画像生成はアイテム識別の入力につながり、それがさらにパズルの生成につながります。そして、これらはすべてオンラインサービスの中でスケールアップし、結果はデータベースに保存され、エラーが発生すれば再試行されるように設計されています。

これらのプロセスを管理するため、私たちはさまざまなタスクを、メインのモデルクラスの入力フィールドと出力フィールドに付随する、独立した関数に分割しました。小さなユーティリティ関数は、特定のオブジェクトに対してどのタスクを(再)実行する必要があるかをチェックします。この関数はタイミング情報も記録するため、生成プロセスにおけるボトルネックや並列処理が実行可能なステップが確認できる、下記のようなウォーターフォールチャートを作成しました。

「ウォーターフォールチャート」は「enrichedPrompt 」や「proposedItemsFromImage 」など、さまざまなタスクを表す。左の列は、ステップの名称を太字で表す。真ん中の列は、左列のラベルの横に並ぶ形で秒単位のタイミングを示している。列の最後は合計75秒と記されている。右の欄には、左のラベルとタイミングに並ぶ形で、一本の赤いバー、それ以外は青いバーがタイムラインのように横に並んで描かれている。バーの幅はそれぞれのタイミングに比例している。これにより、右から下に階段状、あるいは滝のように伸びた図ができあがっている。
ウォーターフォールチャートを通じて、推論ステップにかかっている時間や、並列処理がされている、または並列処理が可能な箇所が確認できる。

このプロセスにおいては、小さなユーティリティ関数が活用できたため、既存のソリューションにリソースを費やす必要はありませんでした。しかし、タスクやステートマネジメントが行えるソリューションの実装は、複数のパイプラインを管理する機械学習がベースのアプリケーションにとって効果的です。オフラインデータを処理する場合のワークフローオーケストレーションと似たようなフレームワークが、オンラインデータを処理する場合も活用でき、アプリケーションスタックにより統合されれば、プロセスをさらに効率化できると思います。

最後に

本プロジェクトを終え、私たちはいくつかの貴重な学びを得ました。

  • AIを活用した、プレイヤーが継続的に楽しめるインタラクティブなグラフィックゲームの作成は可能
  • 世界観の構築は生成機械学習にとって最も簡単なタスクであると同時に、今回作成したようなアプリケーションにとっては非常に重要な要素で、魅力のひとつである
  • 機械学習を活用したアプリケーションには不確定要素が多いため、効果的なタスク管理やステートマネジメントのためのソリューションが必要

私たちの取り組みについてここまで読んでいただき、ありがとうございます。これからも引き続き、AIや機械学習を活用した実験的なゲームの開発プロセスについて紹介できることを楽しみにしています!

Chloe Cho:Haven Studioにおける機械学習チームのゲームデザイナー。大規模言語モデルを活用したゲームの開発に携わっている。ラピッドプロトタイプだけでなく、クリエイティブな観点からのソリューションなどをチームに提案している。

Evan Jones:Haven Studiosにおける機械学習エンジニア。画期的な方法で機械学習モデルを組み合わせ、機械学習を活用したゲームを制作している。