はじめに
何かすごそうなニュース 「原神」を56分でクリアしたゲームAI「Lumine」 が目に入ってきたので気になって論文を読んでみました。
AIを開発したByteDance社はTikTokを運営している企業のようです。
概要
論文は、3Dオープンワールドを長時間かつリアルタイムで攻略できる汎用エージェントの設計手法を提示した研究内容となります。
特徴的なのは、1秒あたり5回の観測入力に対して、1秒あたり30回の高頻度アクション(マウス+キーボード)を生成し続けるモデル設計により、実時間でのアクション操作を可能にしている点です。
また、原神以外にも学習したモデルを他のゲームにも転用できることを示しており、ゼロショットで「鳴潮」の100分のミッションや、「崩壊:スターレイル」の1章(5時間)をクリアしたとの事です。
個人的には手法ももちろんですが、秒間30回もアクションを出力させる速度の方法や、LLMをどうやって組み込んだか、といった内容が気になったのでそこら辺も含めてみていきたいと思います。
ちなみに論文は2025/11/12になっているので公開されたばかりの論文です。
- (論文リンク) Lumine: An Open Recipe for Building Generalist Agents in 3D Open Worlds
- Lumineのプロジェクトページ: https://www.lumine-ai.org/
Lumine
名前の由来は論文では書かれていません。多分ですが原神に蛍というキャラがおり、このキャラの英語名が"Lumine"なので多分これな気がします。
Lumineでは3Dオープンワールドのエージェントを構築するための課題として、以下6つをまとめています。
| 項目 | 説明 |
|---|---|
| スケーラブルな環境 | 探索・戦闘・パズルなど、多様なタスクを攻略する必要がある |
| マルチモーダル認識 | 3Dや2D(GUI)、テキスト、その他の情報を観測し、統合して理解する必要がある |
| 高レベルプランニング | 自由度の高いオープンワールドにおいて「何を目指し、どう進むか」を戦略レベルで判断する必要がある |
| 低レベル制御 | 抽象度の高い戦略に対し、マウスやキーボード操作などのミリ秒単位の制御が必要 |
| Memory | NPCの会話やクエスト進行度など、様々な情報を保持し続け活用する必要がある |
| リアルタイム推論 | リアルタイムで進行するため、推論が数百ミリ秒でも遅れるとゲームプレイが破綻する |
これらの課題に包括的に対処したプロトタイプモデルがLumineとなります。
1. アーキテクチャ
図は論文よりモデルの概要です。
Lumineは基本VLM(Vision-Language Model)上に構築されます。
入力は画像情報と過去のコンテキスト(行動や推論結果)を入力とし、行動(Action)と新しい推論ステップ(Thought)を出力します。
ただ、推論ステップは必要な場合のみ生成する事でリアルタイム性を担保します。
具体的にはまず各ステップ$t$において、画像 $o_{\le t}$、過去の推論 $r_{< t}$、アクション $a_{< t}$ を用いて推論$r_t$を生成するかどうかを判断します。
次にアクションを決定します。(推論しない場合は$r_t$はnull)
これを形式的に記載すると以下です。
$$
\pi_{\theta}(a_t, r_t|o_{\le t}, r_{< t}, a_{< t}) = \pi_{\theta}(a_t|o_{\le t}, r_{\le t}, a_{< t}) \pi_{\theta}(r_t|o_{\le t}, r_{< t}, a_{< t})
$$
画像と推論の具体的な内容は以下です。
・Observation Space
視覚情報は1280x720(720p)にリサイズされ、200ms(5Hz)毎に処理されます。
これは人間の読みやすさと反応速度、PC側の処理速度のバランスをとった値との事です。
・ハイブリッド思考
出力では特別なトークンを用いて推論フレーズを判断します。
推論モードは<|thought_start|> <|thought_end|>フレーズが生成されます。
推論は突然の環境変化で以前の計画が実行できなくなった場合や、タスクが完了して新しい目標が必要になった場合など、重要な遷移に対して出現します。
・キーボード/マウスの設計
アクションは以下のように定義され、高レベルの推論と低レベルの制御を実現しています。
- マウス
- マウスは離散化して表現
- ($\Delta X$,$\Delta Y$)は相対的な移動を(-1000,1000)の範囲の整数で予測
- $\Delta Z$はマウスホイールのスクロール量を表し、(-5,5)の範囲の整数で予測
- 200msの間隔で実行
- キーボード
- アクションチャンク戦略(action chunking strategy)で実行
- 各ステップは6つのチャンクに分割される
- チャンク中に現れるキーはPress状態を維持し、現れないキーはReleaseされる
- 押されるキー$K_{t}$は最大4個指定可能(マウスの両クリックを含む)
- 1stepは200msで1チャンクは33ms
チャンクの33msですが、人間がキー入力をする最小の間隔(キーアップ・ダウンの間隔)が40ms-60msでそれより少ない時間を想定しているとの事です。
具体的なトークンのマッピングは以下です。
・具体例
92 0 0 ; Shift W ; Shift W ; Shift W ; F W ; F W ; F
これは、右側の宝箱に向かってダッシュ(マウスを右に92移動)(Shift + W)し、宝箱に到達すると停止して宝箱を開けようとする(F)様子を表しています。
2. データキュレーション(Data Curation)と学習
データキュレーションとは必要に応じてデータを検索、アクセス、使用、再利用できるようにデータセットを作成および管理するプロセスです。(参考)
学習は3段階に分けて行われます。
最初は事前学習な位置づけで、多様なシナリオから堅牢な行動を学習します。
第2段階では指示学習として、テキストの指示に基づいて短いタスクをクリアできるように学習します。
第3段階は推論学習で、推論に内容に沿った長期的な意思決定を学習します。
Raw Data
データはゲームのプレイ動画と同期された入力(キーボードマウス)からなります。
プレイは新規アカウントからマップの80%以上を探索するという課題を元にメインストーリクリアまでを収集したそうです。
最終的なデータセットは2424時間とのこと。
Stage1. 事前学習
追加ラベル無しで画像から次の行動を予測するように学習します。
ここの目的は以下です。
- 人間のプレイデータや模倣データから基本的操作スキルを獲得
- 行動の連続性、マルチキー操作、マウス制御などを自然に表現
カメラのぶれがひどかったり、アイドル時間等、情報が少ないデータはルールベースで学習データから除外します。
Stage2. 指示学習
Stage1と同じで次の行動を予測するように学習しますが、入力にテキストによる指示も追加します。
テキストの生成手順は以下です。
- 人間アノテーション
事前にラベルを38種類用意し、165時間のプレイ時間を20秒単位でクリップ、38種類のどれか、開始時刻、終了時刻、をラベル付けする(時間は次の分類機の学習に使用) - 自動ラベル付け
Qwen2-VL-2B を使った分類器を学習し、自動で38種類のラベル付けをおこなう - GPT-4.1 を用いた指示(Instruction)の生成
- ラベルを元にタスクの境界を特定し、その前後20フレームの映像を切り出す
- GPT-4.1 にて、ラベルと映像を元に指示文を生成
生成されたテキストを元に指示を学習します。
Stage3. 推論学習
Stage2に更に推論情報も含めて学習されます。
推論情報は手動で以下のように作成されます。
- 動画を10秒単位に区切って、アノテーターに以下を指示。意思決定のタイミングと戦略的判断を学習。
- 各フレームで意思決定のキーポイントを特定
- その行動の背後にある理由や考えを一人称で簡潔に記述
3.推論
推論中のコンテキストを可視化すると以下です。
- どのステップでもシステムと推論(Reasoning)トークンは維持
- VisionとActionトークンの履歴は最新のnステップのみ保持
- $n=6$ で推論が新しくなるが、なった後の履歴は空にする
VisionとActionトークンの履歴の数ですが、論文では2種類実験しているようで、履歴ありは20step、なしは1stepになります。
また、推論は最新のもののみを保持していますが複数の推論を保持するように変更してもいいようです。
リアルタイム推論の最適化
段階的に最適化しているようで、各段階のレイテンシは以下です。
想定している環境は、ゲームを実行するWindowsPCと推論を実施するリモートサーバの2台で、マシン間はネットワークで通信します。
1サイクルは以下でこれを200ms以内に終える必要があります。
- ホストがスクリーンショットをキャプチャし、推論を要求
- リモートサーバが推論を実施し、アクション文字列を返す
- ホストは文字列を受け取りアクションを実行
以下はそれぞれの改善ポイントです。
通信
- 6つのアクションを1度に送信
- 画像はjpgに圧縮後base64エンコードで送信
- TCPはつなげっぱなしにして3-way-ハンドシェイクを回避
履歴管理(Prefill)・KVキャッシュ最適化
- KV-cacheの再利用とStreamingLLMの導入による高速化
- ただそのままStreamingLLMを使うと精度が落ちたので、新しい推論時にコンテキストをリセットする事で対処
Decoding
LLMの生成は文字を1トークンづつ生成します。
ただ、今回は"12 -30 0; left; jump; … <|action_end|>"のようにフォーマットが決まっています。
そこで区切り文字など自明な文字は生成せずに直接追加する事で生成コストを減らす工夫をします。
例えば"12"と生成されたら次の文字は" "が確定するのでこの文字の生成は飛ばし、"12 "で次の生成を行います。
インフラ
- Qwen2-VL-7B の構造上KVヘッドが4なので、4ヘッドを4つのGPUに割り当て
- モデルの重みも4枚の NVIDIA H20 に分割
- 量子化:W8A8(SmoothQuant)を適用
- GEMM(行列積)kernel の tuning
- one-shot all-reduce kernel
- speculative decoding を CUDA graph 化
- Image preprocessing を GPU にオフロード
Lumineの解説は以上です。
プロンプト
最後にプロンプトを載せておきます。
元は中国語で書かれていますが、この記事では日本語に訳して書いています。
・System Prompt for Instruction Following
あなたは原神のPC版をプレイする経験豊富なプレイヤーで、キーボードとマウスの操作に習熟しています。
現在のゲーム画面に基づいて、次の200msのアクションを計画してください。
アクションは6つのステップから成り、各ステップは33ms間隔で実行されます。
各アクションは実行された瞬間から次のステップが開始されるまで、33ms間持続します。
**出力フォーマット**
<|action_start|>X Y Z ; k1 k2 k3 ; k4 k5 ; k6 ; k7 ; k8 ; k9 k10<|action_end|>
**説明**
1. **マウスの移動**: まず、相対的な移動距離X,Y(X>0 で右へ移動、Y>0 で下へ移動) とスクロールホイールの移動距離Z(Z>0 で上へスクロール) を指定します。
2. **Key Sequence**: 次に、6つのキーグループのリストを指定します。グループ内はスペースで区切り、グループ間の区切りはセミコロンで区切ります。
- 各グループには最大 4 つのキーを含めることができます。
- グループにキーがない場合は空白のままにして、セミコロン (;) を残します。
3. 上記の形式に準拠し、改行や引用符を含まないプレーンな文字列のみを出力します。
**Keyの命名規則**
- 数字Key '1-9': 小文字の英語を使用します。例えば'one'はキーボードの'1'を表します。
- ファンクションKey 'F1-F12': 最初の文字を大文字にした英語を使用します。例えば、'One'は'F1'、'Two'は'F2'を表します。
- その他のKey(文字、Shift、Tab、Spaceなど): 最初の文字を大文字にした実際のキーボード名を使用します。例えば、'A'、'D'、'Shift'、'Space'など。
現在のタスクは <instruction>
・ System Prompt for Reasoning
あなたは熟練の『原神』PCプレイヤーであり、キーボードとマウスの両方を駆使して高度なゲームプレイをこなす能力に長けています。
ゲームの仕組みと戦闘のリズムに精通し、リアルタイム画面から重要な情報を素早く抽出し、重要な瞬間に的確な判断を下すことができます。
現在の画面に基づいて、次の200ミリ秒間の行動を計画してください。
これは6つのステップで構成され、各ステップは33ミリ秒間隔です。
各アクションは、実行された瞬間から次のステップが開始されるまで、33ミリ秒間持続します。
現在の状況が前回の分析戦略を継続している場合は、直接アクションを出力できます。
状況が大きく変化した場合、前回の分析が失敗した場合、または新しい目標が現れた場合にのみ、思考プロセスを思考し、出力する必要があります。
**出力フォーマット**
- **アクションのみ(常用)**
<|action_start|>X Y Z ; k1 k2 k3 ; k4 k5 ; k6 ; k7 ; k8 ; k9 k10<|action_end|>
- **思考 + アクション(必要な場合)**
<|thought_start|>Thought content<|thought_end|><|action_start|>X Y Z ; k1 k2 k3 ; k4 k5 ; k6 ; k7 ; k8 ; k9 k10<|action_end|>
**説明**
1. **マウスの移動**: まず、相対的な移動距離X,Y(X>0 で右へ移動、Y>0 で下へ移動) とスクロールホイールの移動距離Z(Z>0 で上へスクロール) を指定します。
2. **Key Sequence**: 次に、6つのキーグループのリストを指定します。グループ内はスペースで区切り、グループ間の区切りはセミコロンで区切ります。
- 各グループには最大 4 つのキーを含めることができます。
- グループにキーがない場合は空白のままにして、セミコロン (;) を残します。
3. 上記の形式に準拠し、改行や引用符を含まないプレーンな文字列のみを出力します。
**Keyの命名規則**
- 数字Key '1-9': 小文字の英語を使用します。例えば'one'はキーボードの'1'を表します。
- ファンクションKey 'F1-F12': 最初の文字を大文字にした英語を使用します。例えば、'One'は'F1'、'Two'は'F2'を表します。
- その他のKey(文字、Shift、Tab、Spaceなど): 最初の文字を大文字にした実際のキーボード名を使用します。例えば、'A'、'D'、'Shift'、'Space'など。
**現在の目標**
<cur_thought>
強化学習との考察
論文の内容ではなく私の考察です。
最初は強化学習の新しい手法かなと思って論文を読んでいましたが、途中で違うなと思いました。
結論を言うと報酬を扱っていない点が強化学習と違います。
ただ強化学習と比較してみると、LLMはアクションを出力しているのでPolicyの役割を果たしています。
最適なアクションを生成するという問題設定だけを見ると、強化学習とLumineは同じ構造になっており、結果としてもし報酬があれば最大化するアクションを生成し続けるでしょう。
強化学習の在り方として新しい方向性(報酬を使わず、人間のプレイと指示のみで攻略する)を示すと同時に、LLMを使った応用事例としてとても興味深い内容だと思います。
さいごに
小規模で実装してみたいなと思って書いて見ましたが、想像以上に時間がかかっていそうな内容でした。
特にアノテーション…。
ただ時間をかければこのレベルのものが作れてしまうというのも驚きです…。
時間があれば実装してみたいな






