Membangun game petualangan berbasis teks dengan Gemma 2

AGU 09, 2024
Ju-yeong Ji Gemma DevRel

Gemma adalah keluarga model terbuka yang dibangun dari penelitian dan teknologi yang sama dengan yang digunakan untuk membuat model Gemini. Model yang disetel sesuai instruksi ini disempurnakan dengan baik pada set data instruksi yang sangat besar, sehingga model ini sangat cocok untuk tugas-tugas yang membutuhkan instruksi, seperti menjawab pertanyaan dan meringkas teks.

Dalam postingan blog ini, kami akan memandu Anda mempelajari proses pembuatan game petualangan berbasis teks menggunakan model Gemma 2 yang disetel sesuai instruksi. Meskipun Anda bisa menggunakan pengaturan Anda sendiri, kami memilih perjalanan yang unik. Anda akan dipandu oleh pendamping AI yang ramah dan suka menolong yang dikenal sebagai Storyteller. Storyteller akan mendeskripsikan lanskap yang menakjubkan, memperkenalkan Anda pada karakter-karakter yang membuat Anda penasaran, dan merangkai sebuah cerita berdasarkan pilihan Anda! Bersiaplah untuk memulai petualangan yang mendebarkan. Di sini interaksi Anda dengan AI akan menentukan jalannya permainan!


Mari kita lihat Demo

Link to Youtube Video (visible only when JS is disabled)

Dalam game yang menarik ini, Anda, sang pemain, terbangun di sebuah pulau terpencil. Satu-satunya pemandu dan pendamping Anda adalah Storyteller AI, yang akan membantu Anda melewati tantangan dan menemukan cara untuk melarikan diri.


Apa yang Anda butuhkan

Perangkat keras

  • Lingkungan lokal yang bisa menjalankan Gemma secara lokal

  • [Opsional] Deploy Gemma di Vertex AI

Software

Lihat “Pengaturan Gemma” untuk mendapatkan akses ke Gemma di kaggle.com dan membuat kunci API Kaggle.

Jika Anda tidak memiliki mesin yang andal untuk eksekusi Gemma lokal, pertimbangkan menggunakan Vertex AI sebagai aplikasi downstream untuk men-deploy model Gemma. Vertex AI menyediakan platform terkelola yang memungkinkan pengembangan dan penskalaan project machine learning yang cepat tanpa perlu keahlian MLOps tersendiri.


[Opsional] Deploy Gemma di Vertex AI

Pertama, temukan kartu model Gemma 2 dari Model Garden. Setelah mengklik tombol "Deploy", Anda bisa memilih variasi model dan lokasi yang akan dipakai.

Deploy Gemma in Vertex AI

Setelah deployment selesai, Anda bisa menemukan endpoint Anda di sini.

Guna mendapatkan skrip untuk memperoleh prediksi dari endpoint aktif Anda, buka "Sample Request" dan pilih "Python".

sample request in Gemma

Membangun chatbot

Di bawah ini adalah contoh wrapper class chatbot Gemma lokal. Anda bisa menjelajahi selengkapnya tentang hal ini dari “Membangun chatbot dengan Gemma”.

Dalam demo, kami menggunakan model Gemma 2 2B. Namun, jika Anda memiliki kemampuan hardware yang memadai, Anda bisa memilih model Gemma alternatif, seperti 9B atau 27B untuk mendapatkan hasil yang lebih baik.

# Gemma local
 
import keras
import keras_nlp
 
model_name = "gemma2_instruct_2b_en"
 
class GemmaBot():
  __START_TURN_USER__ = "<start_of_turn>user\n"
  __START_TURN_MODEL__ = "<start_of_turn>model\n"
  __END_TURN__ = "<end_of_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, "")  # Extract only the new response
    self.add_to_history_as_model(result)
    return result

Jika Anda men-deploy Gemma di Vertex AI, salin dan tempelkan kode contoh di Github ke file bot Anda dan gunakan kode di bawah ini sebagai gantinya. Perhatikan bahwa Anda tidak perlu melakukan inisialisasi variabel "self.model" karena ia berjalan di Google Cloud.

def __init__(self, system=""):
    self.system = system
    self.history = []
 
:
<-- skip -->
:
 
  def ask(self, message):
    self.add_to_history_as_user(message)
    prompt = self.get_full_prompt()
    response = predict_custom_trained_model_sample(
      project="<YOUR_PROJECT_ID>",
      endpoint_id="<YOUR_ENDPONT_ID>",
      location="<YOUR_LOCATION>",
      api_endpoint="<YOUR_LOCATION>-aiplatform.googleapis.com",
      instances={ "inputs": prompt, "max_tokens": 2048 }
      )
    result = response.replace(prompt, "")  # Extract only the new response
    self.add_to_history_as_model(result)
    return result

Untuk menguji bot Anda, gunakan kode praktis berikut ini. (Dengan asumsi Anda menyimpan kode di atas sebagai "gemma.py")

from gemma import GemmaBot
gemma_bot = GemmaBot("You are the Storyteller, guide on this remote island.")
text = gemma_bot.ask("Who are you?")
print(text)

Berikut adalah contoh output dari bot.

Output 1 - build a text based adventure

Membuat game loop

Jika Anda belum familier dengan game loop, ini adalah proses inti yang mendorong fungsionalitas dan interaktivitas game. Ini adalah siklus berkelanjutan yang berulang selama durasi gameplay, untuk memastikan bahwa status game selalu diupdate, input diproses, dan visual dirender di layar.

Dalam game petualangan berbasis teks sederhana ini, kami telah mengimplementasikan game loop dasar seperti berikut ini:

import StageIntro
current_stage = StageIntro.StageIntro()
 
def game_loop():
    if current_stage.bot is None:
        # stage type that has no bot
        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")

Untuk menyederhanakan prosesnya, kami telah merancang class antarmuka stage dasar. Anda bisa memperluas class ini dan membuat pengaturan stage khusus Anda sendiri dengan membuat stage baru.

Misalnya, Anda bisa membuat stage baru dengan gerbang baja seperti di bawah ini.

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. Vines crawl along its rusted bars, and the air hums with a faint electrical current.\nThe Storyteller appears beside you, a shimmering presence in the dappled sunlight."
        self.intro = "Greetings! I am the Storyteller, your guide on this island.\nWe've come to a gate... what will you do?"
        self.bot = GemmaBot("You are the Storyteller, a friendly and helpful AI guide on a mysterious island. Your role is to help the player navigate challenges and find a way to escape. You are currently standing before a large steel gate.")

Ringkasan

Dengan menggunakan Gemma, Anda telah menguasai pembuatan game petualangan berbasis teks. Anda bisa menerapkan struktur yang sama untuk membuat game yang berbeda dengan tema beragam, mulai dari steampunk hingga fantasi.

Selain itu, Anda bisa mengintegrasikan konsep Anda sendiri untuk mekanisme game inti, seperti kemajuan berbasis keterampilan, membangun hubungan, atau bahkan game mini.

Perlu diingat bahwa ini berfungsi sebagai titik awal mendasar. Dapatkan kekuatan untuk memadukan, mengadaptasi, dan mengembangkan elemen-elemen ini untuk menciptakan pengalaman bermain game petualangan berbasis teks yang benar-benar unik dan menarik.

Pertimbangkan untuk bergabung dengan server Discord Komunitas Developer Google, di sana Anda akan memiliki kesempatan untuk menunjukkan project Anda dan menjalin koneksi dengan sesama developer yang memiliki minat yang sama.

Terima kasih sudah membaca.