📑

LLMを活用したターン制RPGバトルシミュレーター

2024/12/09に公開

作ったもの

LLMを活用し、ターン制RPGのステータスを初期化する仕組みを作りました!

今回はUnity側でゲームのロジックを実装し、Pythonで作ったサーバーでプレイヤー・敵のデータを作成しています。ソースコードは以下です。

Unity Pythonで立てたサーバーを叩いて、プレイヤー敵のステータスを取得します
https://github.com/BiwaCoder/turn-battle-sim-with-llm

Python ChatGPTのAPIを実行して、ステータスを生成します
https://github.com/BiwaCoder/llm-turnbattle-data-generator

プロンプトだけざっくり抜き出すとこのような感じです。

        シンプルなRPGゲーム用のJSONデータを生成してください。以下の条件を満たしてください:
        - プレイヤーと敵が交互に攻撃するターン制バトルです。
        - プレイヤーと敵のどちらかが3回攻撃することでギリギリ勝敗が決まるように調整してください。
        - プレイヤーにはわずかに勝つ可能性があるように設定してください。
        - 各キャラクターには以下のステータスを含めてください:
            - HP: ヒットポイント
            - Attack: 攻撃力
            - Defense: 防御力
        解説はつけずjsonだけを出力してください。
        - JSON形式で出力してください。例:
        {
            "Player": {
                "Name": "Hero",
                "HP": 100,
                "Attack": 20,
                "Defense": 10
            },
            "Enemy": {
                "Name": "Slime",
                "HP": 80,
                "Attack": 25,
                "Defense": 8
            }
        }

システム構成

Flaskを使用したAPIサーバー

Flaskを使って簡単なAPIサーバーを構築しています。
CORS(Cross-Origin Resource Sharing)を有効化しており、外部からのアクセスも可能です。
カスタムエラーハンドラーを設定しており、例外が発生した場合にJSON形式のエラーメッセージを返します。

ルート管理

ルート定義はBlueprintを使用して分離しています。
create_routes関数でルートをFlaskアプリに登録しています。

ゲームデータ生成ロジック

ゲームのバランスが取れたデータを生成するために、LLM(GPT)を使用しています。
GameDataGeneratorクラスがゲームデータ生成のロジックを担当。

LLMとのインターフェース

LLMInterfaceクラスを使用して、OpenAIのAPIにリクエストを送信します。
環境変数 OPENAI_API_KEY を利用してAPIキーを取得し、GPTを呼び出しています。

JSONデータのロード

サーバー起動時に初期データをロードするためのロジックを提供。
ファイルからJSONを読み込み、ゲームデータとして利用可能です。

セットアップガイド

1. 依存パッケージのインストール

pip install flask flask-cors openai

2. 環境変数の設定

Linux/macOS:

export OPENAI_API_KEY=your_api_key_here

まとめ

まだシンプルな機能ですが
ゲームとLLM連携し、データ制作に役立てることができました。
この仕組みを活かせば、色々なゲームを作れそうですね!

次回はより複雑なゲームや大規模なゲームに使えるか考えたいと思います。

Discussion