Gemma 2を活用したテキストベースの冒険ゲームの作成方法

Gemmaを用いてテキストベースのアドベンチャーゲームを作成する方法

はじめに

テキストベースのアドベンチャーゲームは、プレイヤーが選択肢を通じて物語を進めていく、魅力的なゲームスタイルです。最近、Gemmaと呼ばれるAIモデルが登場しました。このモデルは、特に指示に従った作業が得意であり、質問応答やテキスト要約などに最適です。このガイドでは、Gemmaを使用して、物語を紡ぐAI「ストーリーテラー」と共に冒険するゲームを作成する方法を説明します。

必要なもの

ゲームを作成するために、以下のハードウェアとソフトウェアが必要です。

  • ハードウェア
    • Gemmaをローカルで実行できる環境
    • オプション:Vertex AIにGemmaを展開することも可能です。
  • ソフトウェア
    • KerasおよびInstruction-tuned Gemma 2モデル
    • ゲームコード(Pythonで記述)
    • 「Gemmaセットアップ」からKaggle APIキーを生成する必要があります。

Gemmaのセットアップ

まず、[Model Garden](https://modelgarden.com)からGemma 2モデルカードを見つけ、「Deploy」ボタンをクリックします。モデルのバリエーションや展開する場所を選択することができます。デプロイが完了すると、エンドポイントを確認できます。また、アクティブなエンドポイントから予測を取得するためのスクリプトは、「Sample Request」セクションからPythonで取得できます。

Gemmaチャットボットの作成

次に、Gemmaを利用した簡単なチャットボットを作成します。以下に、ローカルでGemmaを使用したチャットボットのラッパークラスの例を示します。

“`python
import keras
import keras_nlp

model_name = “gemma2_instruct_2b_en”

class GemmaBot():
__START_TURN_USER__ = “usern”
__START_TURN_MODEL__ = “modeln”
__END_TURN__ = “n”

def __init__(self, system=””):
self.model = keras_nlp.models.GemmaCausalLM.from_preset(model_name)
self.system = system
self.history = []

def add_to_history_as_user(self, message):
self.history.append(self.__START_TURN_USER__ + message + self.__END_TURN__)

def add_to_history_as_model(self, message):
self.history.append(self.__START_TURN_MODEL__ + message)

def get_history(self):
return “”.join([*self.history])

def get_full_prompt(self):
prompt = self.get_history() + self.__START_TURN_MODEL__
if len(self.system) > 0:
prompt = self.system + “n” + prompt
return prompt

def ask(self, message):
self.add_to_history_as_user(message)
prompt = self.get_full_prompt()
response = self.model.generate(prompt, max_length=2048)
result = response.replace(prompt, “”)
self.add_to_history_as_model(result)
return result
“`

このコードを使って、簡単にGemmaボットを作成できます。GemmaをVertex AIに展開した場合、少し異なるコードを使用しますので、注意が必要です。

ゲームループの実装

ゲームループは、ゲームの機能とインタラクティブ性を駆動する核心的なプロセスです。プレイヤーの入力を処理し、ゲームの状態を更新する役割を担っています。

以下のように、テキストベースのアドベンチャーゲームでの基本的なゲームループを実装します。

“`python
import StageIntro

current_stage = StageIntro.StageIntro()

def game_loop():
if current_stage.bot is None:
current_stage.process()
return
resp = “”
print(“-” * 80)
print(f’Type “{current_stage.cmd_exit}” if you want to end the conversation.’)
print(“-” * 80)
if current_stage.preamble != “”:
print(current_stage.preamble)
while resp != current_stage.cmd_exit:
if resp == “”:
text = current_stage.intro
current_stage.bot.add_to_history_as_model(text)
else:
text = current_stage.bot.ask(resp)
print(text)
resp = input(“n> “)
prompt(admin_bot.judge(current_stage.bot.get_history()))

def check_end_condition():
if not current_stage.pass_check():
check = admin_bot.end_of_game()
print(“Succeed to escape?”)
print(check)
if check.lower().startswith(“true”):
print(“Congratulations! You escaped the island.”)
exit(0)
next_stage = current_stage.next()
if next_stage is None:
print(“End Of Game”)
exit(0)
return next_stage

while True:
game_loop()
current_stage = check_end_condition()
input(“Press ENTER to move forward”)
“`

このコードを使用すれば、基本的なゲームの流れを作ることができます。

カスタムステージの作成

基本のステージインターフェースクラスを拡張して、自分だけのカスタムステージを作成することも可能です。以下は、鋼のゲートを持つ新しいステージの例です。

“`python
from stage import IStage
from gemma import GemmaBot

class StageGate(IStage):
def __init__(self):
self.preamble = “The steel gate looms before you, a formidable barrier separating you from the path ahead.”
self.intro = “Greetings! I am the Storyteller, your guide on this island.”
self.bot = GemmaBot(“You are the Storyteller, a friendly and helpful AI guide on a mysterious island.”)
“`

まとめ

Gemmaを使用することで、楽しいテキストベースのアドベンチャーゲームを作成することができます。この基礎をもとに、スチームパンクやファンタジーなど多様なテーマのゲームを作ることができます。また、スキルベースの進行や人物関係の構築、さらにはミニゲームの要素を追加することも可能です。

最後に、開発コミュニティに参加し、アイデアを共有したり、他のエンジニアとつながることもお勧めです。Gemmaを使った新しい冒険を始める準備は整いましたか?今すぐ挑戦してみましょう!