Membangun Generator Kuis dengan AI Generatif dan Cloud Run

1. Pengantar

Dalam lab ini, Anda akan membuat layanan web untuk membuat kuis trivia dan mengintegrasikannya ke dalam aplikasi yang berfungsi dan menyenangkan. Anda akan menggunakan bahasa pemrograman yang berbeda dari yang mungkin pernah Anda gunakan sebelumnya: Inggris!

Yang akan Anda lakukan ...

  • Anda akan membuat perintah yang menghasilkan kuis trivia sesuai dengan serangkaian kriteria.
  • Anda akan membuat aplikasi web sederhana dan memverifikasi bahwa aplikasi tersebut berjalan sesuai harapan di lingkungan pengembangan Anda.
  • Anda akan menambahkan logika secara bertahap ke aplikasi web untuk mengubahnya menjadi server API yang membuat kuis sesuai dengan serangkaian parameter input.
  • Anda akan melihat betapa mudahnya men-deploy layanan pembuatan kuis ke cloud menggunakan Google Cloud Run.
  • Terakhir, Anda akan mengonfigurasi aplikasi sungguhan ( quizaic.com) untuk menggunakan layanan pembuat kuis yang di-deploy dan Anda akan dapat memainkan kuis live berdasarkan outputnya.

Yang akan Anda pelajari ...

  • Cara membuat perintah ber-template untuk Model Bahasa Besar (LLM).
  • Cara membuat aplikasi server web sederhana di Python.
  • Cara menambahkan dukungan untuk LLM Google ke aplikasi web Anda.
  • Cara men-deploy aplikasi Anda ke cloud sehingga siapa pun dapat mencoba kreasi baru Anda.
  • Cara mengintegrasikan generator kuis ke dalam aplikasi yang lebih besar.

Yang Anda butuhkan ...

  • Browser web Chrome
  • Akun Google
  • Project Cloud dengan penagihan diaktifkan

Lab ini ditujukan bagi developer dari semua level, termasuk para pemula. Meskipun Anda akan menggunakan Python, Anda tidak harus familier dengan pemrograman Python untuk memahami maksudnya karena kami akan menjelaskan semua kode yang akan Anda lihat.

2. Penyiapan

a08aa5878e36b60c.png

Bagian ini membahas semua hal yang perlu Anda lakukan untuk memulai lab ini.

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Mulai Cloud Shell

Dalam lab ini, Anda akan bekerja di sesi Cloud Shell, yang merupakan interpreter perintah yang dihosting oleh mesin virtual yang berjalan di cloud Google. Anda dapat menjalankan bagian ini dengan mudah secara lokal di komputer Anda sendiri, tetapi menggunakan Cloud Shell memberi semua orang akses ke pengalaman yang dapat direproduksi dalam lingkungan yang konsisten. Setelah menyelesaikan lab ini, Anda dapat mencoba kembali bagian ini di komputer Anda sendiri.

4a95152439f0159b.png

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

Jika ini adalah pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Continue.

9c92662c6a846a5c.png

Perlu waktu beberapa saat untuk menyediakan dan terhubung ke Cloud Shell.

9f0e51b578fecce5.png

Virtual machine ini dilengkapi dengan semua alat pengembangan yang diperlukan. VM ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah diautentikasi dan project telah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

Mengaktifkan beberapa API

Pada langkah-langkah selanjutnya, Anda akan melihat tempat layanan ini diperlukan (dan alasannya), tetapi untuk saat ini, jalankan perintah ini untuk memberi project Anda akses ke Cloud Build, Artifact Registry, Vertex AI, dan Cloud Run:

gcloud services enable cloudbuild.googleapis.com        \
                       artifactregistry.googleapis.com  \
                       aiplatform.googleapis.com        \
                       run.googleapis.com          

Perintah di atas akan menampilkan pesan seperti berikut yang menandakan bahwa proses berhasil:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. Perintah - Pemrograman dalam Bahasa Natural

92f630373224ead8.png

Kita akan mulai dengan mempelajari cara membuat perintah untuk Model Bahasa Besar. Buka Konsol Google Cloud > Vertex AI > Vertex AI Studio (Language). Anda akan melihat halaman seperti ini:

bfe5706041ae6454.png

Di bagian Generate Text, klik tombol Text Prompt. Dalam dialog berikutnya, masukkan perintah yang menurut Anda efektif untuk membuat kuis trivia sesuai dengan persyaratan berikut:

  • Topik: Sejarah Dunia
  • Jumlah pertanyaan: 5
  • Tingkat kesulitan: menengah
  • Bahasa: Inggris

Klik tombol Kirim untuk melihat output.

Seperti yang ditunjukkan pada screenshot berikut, panel sebelah kanan memberi Anda kemampuan untuk memilih model yang ingin digunakan dan menyesuaikan beberapa setelan:

8aa89a1970ea9335.png

Ada beberapa setelan yang tersedia, sebagai berikut:

  • Region adalah tempat permintaan pembuatan Anda harus dijalankan.
  • Model memilih model bahasa besar yang ingin Anda gunakan. Untuk codelab ini, gunakan "gemini-1.0-pro-001".
  • Suhu mengontrol tingkat keacakan dalam pemilihan token. Temperatur yang lebih rendah cocok untuk perintah yang mengharapkan respons benar, sementara temperatur yang lebih tinggi dapat memberikan hasil yang lebih beragam atau tidak terduga.
  • Batas token menentukan jumlah maksimal output teks dari satu prompt. Token terdiri atas sekitar empat karakter. Nilai defaultnya adalah 1024.
  • Top-k mengubah cara model memilih token untuk output. Top-k 1 berarti token yang dipilih adalah yang paling mungkin di antara semua token dalam kosakata model (disebut juga greedy decoding), sedangkan top-k 3 berarti bahwa token berikutnya dipilih dari antara 3 token yang paling mungkin (menggunakan suhu). Nilai top-k default adalah 40.
  • Top-p mengubah cara model memilih token untuk output. Token dipilih dari yang paling mungkin hingga yang paling tidak mungkin sampai jumlah probabilitasnya sama dengan nilai top-p.
  • Respons maks adalah jumlah maksimum respons model yang dihasilkan per perintah.
  • Urutan penghentian adalah serangkaian karakter (termasuk spasi) yang menghentikan pembuatan respons jika model menemukannya.
  • Respons streaming memilih apakah respons harus dicetak saat dihasilkan atau disimpan dan ditampilkan saat selesai.
  • Nilai minimum filter keamanan menyesuaikan seberapa besar kemungkinan Anda melihat respons yang dapat berbahaya.

Setelah Anda memiliki perintah yang tampaknya menghasilkan kuis yang wajar sesuai dengan persyaratan yang disebutkan di atas, kita dapat mengurai kuis ini menggunakan kode kustom, tetapi bukankah lebih baik jika LLM menghasilkan kuis dalam format terstruktur yang dapat kita muat langsung ke dalam program? Program yang akan kita gunakan nanti di lab ini untuk memanggil generator Anda mengharapkan kuis dinyatakan dalam JSON, yang merupakan format lintas bahasa populer untuk merepresentasikan data terstruktur.

Kuis di lab ini dinyatakan sebagai array objek, di mana setiap objek berisi pertanyaan, array kemungkinan respons terhadap pertanyaan tersebut, dan respons yang benar. Berikut adalah encoding JSON untuk kuis dalam lab ini:

[
    {
        "question": "Who was the first person to walk on the moon?",
          "responses": [
              "Neil Armstrong",
              "Buzz Aldrin",
              "Michael Collins",
              "Yuri Gagarin"
           ],
           "correct": "Neil Armstrong"
    },
    {
        "question": "What was the name of the war that took place between the British and the French in North America from 1754 to 1763??",
          "responses": [
              "The French and Indian War",
              "The Seven Years' War",
              "The War of the Austrian Succession",
              "The Great War"
           ],
           "correct": "The French and Indian War"
    },

    ...
]

Lihat apakah Anda dapat mengubah perintah untuk menghasilkan kuis dalam format JSON yang diperlukan.

  1. Tentukan dalam kata-kata format persis yang Anda cari (misalnya, kalimat yang dicetak miring di atas).
  2. Sertakan contoh format JSON yang diinginkan dalam perintah Anda.

Setelah Anda memiliki perintah yang menghasilkan kuis sesuai spesifikasi yang diinginkan, klik tombol GET CODE di sudut kanan atas halaman untuk melihat kode Python yang dapat digunakan untuk mengirimkan perintah Anda secara terprogram ke LLM Vertex AI. Jika Anda tertarik menggunakan bahasa pemrograman selain Python, lihat https://cloud.google.com/vertex-ai/docs/samples?text=generative.

4. Membangun Server Web Sederhana

c73008bb8a72b57b.png

Setelah memiliki perintah yang berfungsi, kita ingin mengintegrasikannya ke dalam aplikasi yang lebih besar. Tentu saja, kita dapat menyematkan perintah Anda ke dalam kode sumber aplikasi yang lebih besar, tetapi kita ingin generator Anda berfungsi sebagai microservice yang menyediakan layanan pembuatan kuis untuk aplikasi lain. Untuk mewujudkannya, kita perlu membuat server web sederhana dan membuatnya tersedia secara publik. Kita akan melakukannya pada langkah-langkah berikut.

Mulai dengan mengklik tombol Open Editor di bagian atas panel Cloud Shell. Tampilannya terlihat seperti ini:

e2a06b5304079efc.png

Kemudian, Anda akan berada di lingkungan IDE yang mirip dengan Visual Studio Code, tempat Anda dapat membuat project, mengedit kode sumber, menjalankan program, dll.

Jika layar terlalu sempit, Anda dapat memperluas atau memperkecil garis pemisah antara konsol dan jendela edit/terminal dengan menarik batang horizontal di antara kedua area tersebut, yang ditandai di sini:

8dea35450851af53.png

Anda dapat beralih antara Editor dan Terminal dengan mengklik tombol Open Editor dan Open Terminal. Sekarang, coba beralih di antara kedua lingkungan ini.

Selanjutnya, buat folder untuk menyimpan pekerjaan Anda untuk lab ini dengan mengklik tombol tambahkan folder 5f4e64909bc15e30.png, masukkan quiz-generator, lalu tekan enter. Semua file yang Anda buat di lab ini, dan semua pekerjaan yang Anda lakukan di Cloud Shell, akan berada di folder ini.

Sekarang, buat file requirements.txt. Hal ini memberi tahu Python library mana yang menjadi dependensi aplikasi Anda. Untuk aplikasi web sederhana ini, Anda akan menggunakan modul Python populer untuk membangun server web yang disebut Flask,, library klien google-cloud-aiplatform, dan framework server web yang disebut gunicorn. Di panel navigasi file, klik kanan folder quiz-generator, lalu pilih item menu New file, seperti ini:

613eb3de4b9b750a.png

Saat diminta untuk memasukkan nama file baru, masukkan requirements.txt, lalu tekan tombol enter. Pastikan file baru berada di folder project quiz-generator.

Tempelkan baris berikut di file baru untuk menentukan bahwa aplikasi Anda bergantung pada paket flask Python, server web gunicorn, dan library klien google-cloud-aiplatform, beserta versi terkait masing-masing.

flask==3.0.0
gunicorn==21.2.0
google-cloud-aiplatform==1.47.0

Anda tidak perlu menyimpan file ini secara eksplisit karena Cloud Editor akan menyimpan perubahan secara otomatis untuk Anda.

Dengan menggunakan teknik yang sama, buat file baru lainnya bernama main.py. Ini akan menjadi file sumber Python utama (dan satu-satunya) aplikasi Anda. Sekali lagi, pastikan file baru berada di folder quiz-generator.

Masukkan kode berikut ke dalam file ini:

from flask import Flask
import os

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
    html = "<h1>Hello world!</h1>"
    return html

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Beralih kembali ke terminal dan pindah ke folder project dengan perintah ini:

cd quiz-generator

Jalankan perintah berikut untuk menginstal dependensi project Anda:

pip3 install -r requirements.txt

Setelah menginstal dependensi, Anda akan melihat output yang berakhir seperti ini:

Successfully installed flask-3.0.0

Sekarang luncurkan aplikasi Anda dengan menjalankan perintah ini di terminal:

flask --app main.py --debug run --port 8080

Pada tahap ini, aplikasi Anda berjalan di virtual machine yang dikhususkan untuk sesi Cloud Shell Anda. Cloud Shell menyertakan mekanisme proxy yang memungkinkan Anda mengakses server web (seperti yang baru saja Anda mulai) yang berjalan di virtual machine Anda dari mana saja di internet global.

Klik tombol web preview, lalu item menu Preview on Port 8080 seperti ini:

7f938c0bc1b4154c.png

Tab browser akan terbuka ke aplikasi yang sedang berjalan, yang akan terlihat seperti ini:

aaaf366f9bf74a28.png

5. Menambahkan metode pembuatan dengan penguraian parameter

Sekarang kita ingin menambahkan dukungan untuk menerapkan metode baru yang disebut generate. Lakukan ini dengan menambahkan pernyataan impor untuk memanipulasi permintaan HTTP dan mengubah rute utama untuk mengurai permintaan ini dan mencetak parameter, sebagai berikut:

from flask import Flask
from flask import request                       #<-CHANGED
import os

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])                #<-CHANGED
def generate():                                 #<-CHANGED
    params = request.args.to_dict()             #<-CHANGED
    html = f"<h1>Quiz Generator</h1>"           #<-CHANGED
    for param in params:                        #<-CHANGED
        html += f"<br>{param}={params[param]}"  #<-CHANGED
    return html                                 #<-CHANGED

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Sekarang muat ulang tab browser web yang ada untuk melihat hasilnya. Kali ini Anda akan melihat "Quiz Generator", beserta parameter kueri yang otomatis ditambahkan ke URL Anda (authuser). Coba tambahkan dua parameter tambahan dengan menambahkan string "`&param1=val1&param2=val2`" ke bagian akhir URL di kolom URL browser Anda, muat ulang halaman, dan Anda akan melihat sesuatu seperti ini:

6e223ca358e4e009.png

Setelah melihat cara mengirim dan mengurai parameter kueri di URL, kita akan menambahkan dukungan untuk parameter tertentu yang akan kita kirim ke generator kuis, yang adalah sebagai berikut:

  • topic - materi kuis yang diinginkan
  • num_q - jumlah pertanyaan yang diinginkan
  • diff - tingkat kesulitan yang diinginkan (mudah, sedang, sulit)
  • lang - bahasa kuis yang diinginkan
from flask import Flask
from flask import request
import os

# Default quiz settings  #<-CHANGED
TOPIC = "History"        #<-CHANGED
NUM_Q = "5"              #<-CHANGED
DIFF = "intermediate"    #<-CHANGED
LANG = "English"         #<-CHANGED

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):  #<-CHANGED
    if name in args:             #<-CHANGED
        return args[name]        #<-CHANGED
    return default               #<-CHANGED

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
    args = request.args.to_dict()        #<-CHANGED
    topic = check(args, "topic", TOPIC)  #<-CHANGED
    num_q = check(args, "num_q", NUM_Q)  #<-CHANGED
    diff = check(args, "diff", DIFF)     #<-CHANGED
    lang = check(args, "lang", LANG)     #<-CHANGED
    html = f"""
        <h1>Quiz Generator</h1><br>
        {topic=}<br>
        {num_q=}<br>
        {diff=}<br>
        {lang=}"""                       #<-CHANGED
    return html

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Sekarang muat ulang tab browser web yang ada untuk melihat hasilnya. Anda akan melihat halaman web yang mirip dengan berikut ini:

15eed60f6a805212.png

Coba ubah URL untuk menetapkan nilai berbagai parameter. Misalnya, coba gunakan akhiran "?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French" di akhir URL di kolom URL Anda:

f629dba5fa207cef.png

6. Menambahkan dan memformat perintah Anda

Selanjutnya, kita akan menambahkan dukungan untuk parameter tertentu yang akan kita kirim ke generator kuis, yang adalah sebagai berikut:

  • topic - materi kuis yang diinginkan
  • num_q - jumlah pertanyaan yang diinginkan
  • diff - tingkat kesulitan yang diinginkan (mudah, sedang, sulit)
  • lang - bahasa kuis yang diinginkan

Salin perintah yang Anda kembangkan dengan Vertex Generative AI Studio pada langkah sebelumnya, tetapi ubah nilai hard code untuk topik, jumlah pertanyaan, dan tingkat kesulitan dengan string ini:

  • {topic}
  • {num_q}
  • {diff}
  • {lang}
from flask import Flask
from flask import request
import os

# Default quiz settings
TOPIC = "History"
NUM_Q = 5
DIFF = "intermediate"
LANG = "English"

PROMPT = """
Generate a quiz according to the following specifications:

- topic: {topic}
- num_q: {num_q}
- diff:  {diff}
- lang:  {lang}

Output should be (only) an unquoted json array of objects with keys:
"Question", "responses", and "correct".

"""  #<-CHANGED

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):
    if name in args:
        return args[name]
    return default

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
    args = request.args.to_dict()
    topic = check(args, "topic", TOPIC)
    num_q = check(args, "num_q", NUM_Q)
    diff = check(args, "diff", DIFF)
    lang = check(args, "lang", LANG)
    prompt = PROMPT.format(topic=topic, num_q=num_q, diff=diff, lang=lang)  #<-CHANGED 
    html = f"<h1>Prompt:</h1><br><pre>{prompt}</pre>"                       #<-CHANGED
    return html

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Sekarang muat ulang tab browser web yang ada untuk melihat hasilnya. Anda akan melihat halaman web yang mirip dengan berikut ini:

3c2b9dfcfba86b7a.png

Coba ubah URL untuk mengubah keempat parameter tersebut.

7. Menambahkan library klien Vertex AI

Sekarang kita siap menggunakan library klien Python Vertex AI untuk membuat kuis Anda. Hal ini akan mengotomatiskan perintah interaktif yang Anda lakukan di langkah #3 dan memberi layanan generator Anda akses terprogram ke kemampuan LLM Google. Perbarui file main.py Anda seperti berikut:

Pastikan untuk mengganti "YOUR_PROJECT" dengan project ID Anda.

from flask import Flask
from flask import request
from flask import Response                                          #<-CHANGED
import os

import vertexai    
from vertexai.generative_models import GenerativeModel  #<-CHANGED

# Default quiz settings
TOPIC = "History"
NUM_Q = 5
DIFF = "intermediate"
LANG = "English"
MODEL = "gemini-1.0-pro"  #<-CHANGED

PROMPT = """
Generate a quiz according to the following specifications:

- topic: {topic}
- num_q: {num_q}
- diff:  {diff}
- lang:  {lang}

Output should be (only) an unquoted json array of objects with keys "question", "responses", and "correct".

"""

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.
if not PORT:
    PORT = 8080

# Initialize Vertex AI access.
vertexai.init(project="YOUR_PROJECT", location="us-central1")  #<-CHANGED
parameters = {                                                 #<-CHANGED
    "candidate_count": 1,                                      #<-CHANGED
    "max_output_tokens": 1024,                                 #<-CHANGED
    "temperature": 0.5,                                        #<-CHANGED
    "top_p": 0.8,                                              #<-CHANGED
    "top_k": 40,                                               #<-CHANGED
}                                                              #<-CHANGED
model = GenerativeModel(MODEL)             #<-CHANGED

# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):
    if name in args:
        return args[name]
    return default

# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
    args = request.args.to_dict()
    topic = check(args, "topic", TOPIC)
    num_q = check(args, "num_q", NUM_Q)
    diff = check(args, "diff", DIFF)
    lang = check(args, "lang", LANG)
    prompt = PROMPT.format(topic=topic, num_q=num_q, diff=diff, lang=lang)
    response = model.generate_content(prompt, generation_config=parameters)  #<-CHANGED
    print(f"Response from Model: {response.text}")           #<-CHANGED
    html = f"{response.text}"                                #<-CHANGED
    return Response(html, mimetype="application/json")       #<-CHANGED

# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Sekarang muat ulang tab browser web yang ada untuk melihat hasilnya. Perhatikan bahwa proses ini dapat memerlukan waktu beberapa detik karena sekarang Anda benar-benar membuat permintaan LLM. Anda akan melihat halaman web yang mirip dengan berikut ini:

f43d3ba5102857b8.png

Coba ubah URL untuk meminta topik kuis, jumlah pertanyaan, dan tingkat kesulitan yang berbeda.

Dengan demikian, microservice Anda telah selesai - selamat! Pada langkah berikutnya, Anda akan mempelajari cara men-deploy layanan di Cloud sehingga siapa pun dapat mengaksesnya dari mana saja.

8. Menuju Cloud!

67c99bf45a7b7805.png

Setelah membuat generator kuis sendiri, Anda pasti ingin membagikan kecanggihan ini kepada dunia. Jadi, sekarang saatnya men-deploy-nya ke Cloud. Namun, Anda ingin melakukan lebih dari sekadar membagikannya. Anda ingin memastikan bahwa:

  • berjalan dengan andal - Anda mendapatkan toleransi fault otomatis jika komputer yang menjalankan aplikasi Anda mengalami error
  • melakukan penskalaan otomatis - aplikasi Anda akan terus menangani tingkat traffic yang besar, dan secara otomatis mengurangi jejaknya saat tidak digunakan
  • meminimalkan biaya Anda, dengan tidak mengenakan biaya untuk resource yang tidak Anda gunakan - Anda hanya dikenai biaya untuk resource yang digunakan saat merespons traffic
  • dapat diakses melalui nama domain kustom - Anda memiliki akses ke solusi sekali klik untuk menetapkan nama domain kustom ke layanan Anda
  • menawarkan waktu respons yang sangat baik - cold start cukup responsif, tetapi Anda dapat menyempurnakannya dengan menentukan konfigurasi instance minimum
  • mendukung enkripsi end-to-end menggunakan keamanan web SSL/TLS standar - saat Anda men-deploy layanan, Anda akan mendapatkan enkripsi web standar, dan sertifikat yang diperlukan yang sesuai, secara gratis dan otomatis

Dengan men-deploy aplikasi ke Google Cloud Run, Anda akan mendapatkan semua hal di atas dan banyak lagi. Elemen penyusun dasar untuk membagikan aplikasi Anda dengan Cloud Run adalah container.

Container memberi kita kemampuan untuk membuat kotak modular tempat menjalankan aplikasi dengan semua dependensinya yang dipaketkan menjadi satu. Karena container dapat digunakan di hampir semua server virtual atau nyata, hal ini memberi kita cara untuk men-deploy aplikasi Anda di mana pun Anda inginkan, dari lokal hingga Cloud, dan bahkan untuk memindahkan aplikasi Anda dari satu penyedia layanan ke penyedia layanan lain.

Untuk mempelajari lebih lanjut container dan cara kerjanya di Google Cloud Run, lihat codelab Dev to Prod in Three Easy Steps with Cloud Run.

Men-deploy Aplikasi ke Cloud Run

Cloud Run adalah layanan regional, yang berarti infrastruktur yang menjalankan layanan Cloud Run Anda terletak di region tertentu dan dikelola oleh Google agar tersedia secara redundan di semua zona dalam region tersebut. Untuk mempermudah, dalam lab ini kita akan menggunakan region us-central1 yang di-hardcode.

Kita akan menggunakan sesuatu yang disebut buildpack untuk membuat container Anda secara otomatis. Buat file baru bernama Procfile di Cloud Editor dan masukkan satu baris teks ini:

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

Hal ini memberi tahu sistem buildpack cara menjalankan aplikasi Anda di container yang dibuat otomatis. Selanjutnya, jalankan perintah berikut di Terminal Cloud Shell (dari direktori quiz-generator yang sama) :

gcloud run deploy quiz-generator  \
    --source .                    \
    --region us-central1          \
    --allow-unauthenticated

Perintah ini memberi tahu perintah gcloud bahwa Anda ingin perintah tersebut menggunakan buildpack untuk membuat image container, berdasarkan file sumber yang ditemukan di direktori saat ini (dot dalam --source . adalah singkatan untuk direktori saat ini). Karena layanan menangani image container secara implisit, Anda tidak perlu menentukan image pada perintah gcloud ini.

Tunggu sebentar sampai proses deployment selesai. Jika berhasil, perintah gcloud akan menampilkan URL layanan baru:

Building using Buildpacks and deploying container to Cloud Run service [quiz-generator] in project [YOUR_PROJECT] region [YOUR_REGION]
OK Building and deploying new service... Done.                                                                          
  OK Creating Container Repository...                                                                                   
  OK Uploading sources...                                                                                               
  OK Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/0cf1383f-35db-412d
  -a973-557d5e2cd4a4?project=780573810218].                                                                             
  OK Creating Revision...                                                                                               
  OK Routing traffic...                                                                                                 
  OK Setting IAM Policy...                                                                                              
Done.                                                                                                                   
Service [quiz-generator] revision [quiz-generator-00001-xnr] has been deployed and is serving 100 percent of traffic.
Service URL: https://quiz-generator-co24gukjmq-uc.a.run.app

Anda juga dapat mengambil URL layanan dengan perintah ini:

gcloud run services describe quiz-generator  \
  --region us-central1                       \
  --format "value(status.url)"

Tampilannya akan terlihat seperti:

https://quiz-generator-co24gukjmq-uc.a.run.app

Link ini adalah URL khusus, dengan keamanan TLS, untuk layanan Cloud Run Anda. Link ini bersifat permanen (selama Anda tidak menonaktifkan layanan) dan dapat digunakan di mana saja di internet. Tidak menggunakan mekanisme proxy Cloud Shell yang disebutkan sebelumnya, yang bergantung pada virtual machine sementara.

Klik Service URL yang disorot untuk membuka tab browser web ke aplikasi yang sedang berjalan. Pastikan hasilnya sama dengan yang Anda lihat saat berada di lingkungan pengembangan. Pastikan juga Anda dapat menyesuaikan kuis yang dihasilkan dengan memberikan parameter di akhir URL.

Selamat! Aplikasi Anda kini berjalan di Cloud Google. Tanpa perlu memikirkannya, aplikasi Anda tersedia untuk publik, dengan enkripsi TLS (HTTPS), dan penskalaan otomatis ke tingkat traffic yang luar biasa.

9. Menggabungkan semua bagian

9927db1725bcd5d6.png

Pada langkah terakhir ini, kita siap menjalankan generator kuis sebagai bagian dari aplikasi quizaic. Buka URL quizaic, login ke Akun Google Anda, lalu buka tab Create Quiz. Pilih jenis generator Custom, tempelkan URL Cloud Run Anda ke kolom URL, isi kolom wajib diisi lainnya, lalu kirimkan formulir.

328ee05579ea05f9.png

Dalam beberapa saat, Anda akan memiliki kuis baru (lihat "Kuis baru saya" pada gambar di bawah), dengan gambar thumbnail yang dibuat AI, yang dapat Anda edit, mainkan, kloning, atau hapus melalui tombol yang sesuai. Kuis baru ini dibuat menggunakan layanan web yang baru saja Anda deploy berdasarkan perintah ber-template Anda.

1719169140978b63.png

10. Membersihkan

c1592d590c563428.png

Meskipun Cloud Run tidak mengenakan biaya selama layanannya tidak digunakan, Anda mungkin akan tetap ditagih atas penyimpanan image container yang telah dibuat.

Anda dapat menghapus project GCP Anda untuk menghentikan tagihan, yang artinya akan menghentikan penagihan atas semua resource yang digunakan dalam project tersebut, atau cukup hapus image container Anda dengan perintah ini:

gcloud config set artifacts/repository cloud-run-source-deploy
gcloud config set artifacts/location us-central1
gcloud artifacts docker images list

# Note image tag for resulting list

gcloud artifacts docker images delete <IMAGE-TAG>

Untuk menghapus layanan Cloud Run, gunakan perintah ini:

gcloud run services delete quiz-generator --region us-central1 --quiet

11. Anda Berhasil!

910162be58c0f6d6.png

Selamat - Anda telah berhasil membuat perintah LLM dan men-deploy microservice Cloud Run menggunakan perintah tersebut. Sekarang Anda dapat memprogram dalam bahasa alami dan membagikan kreasi Anda kepada dunia.

Saya ingin mengajukan satu pertanyaan penting kepada Anda:

Setelah aplikasi Anda berfungsi di lingkungan developer, berapa baris kode yang harus Anda ubah untuk men-deploy-nya ke cloud, dengan semua atribut tingkat produksi yang ditawarkan oleh Cloud Run?

Jawabannya tentu saja adalah nol. :)

Codelab lain yang perlu diperiksa...

Dokumen referensi ...

12. Pesan Ajakan

Jika Anda menikmati codelab ini dan cenderung menghabiskan lebih banyak waktu untuk berinteraksi langsung dengan Google Cloud, Anda sebaiknya Bergabung dengan Google Cloud Innovators sekarang.

498cab7d87ec12d3.png

Google Cloud Innovators Gratis dan mencakup:

  • Diskusi live, AMA, dan sesi roadmap untuk mempelajari hal terbaru langsung dari karyawan Google
  • Berita Google Cloud terbaru langsung di kotak masuk Anda
  • Badge digital dan latar belakang konferensi video
  • 500 kredit lab dan pembelajaran di Skills Boost

Klik di sini untuk mendaftar.