Membangun Generator Kuis dengan AI Generatif dan Cloud Run

1. Pengantar

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

Yang akan Anda lakukan ...

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

Yang akan Anda pelajari ...

  • Cara membuat perintah dengan 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 agar siapa saja dapat mencoba kreasi baru Anda.
  • Cara mengintegrasikan generator kuis Anda ke 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 akan menggunakan Python, Anda tidak harus familier dengan pemrograman Python untuk memahami apa yang terjadi 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

Di lab ini, Anda akan mengerjakan sesi Cloud Shell, yang merupakan penafsir perintah yang dihosting oleh virtual machine yang berjalan di cloud Google. Anda dapat dengan mudah menjalankan bagian ini secara lokal di komputer sendiri, tetapi menggunakan Cloud Shell akan memberi semua orang akses ke pengalaman yang dapat diproduksi ulang dalam lingkungan yang konsisten. Setelah lab ini, Anda dapat mencoba lagi bagian ini di komputer Anda sendiri.

4a95152439f0159b.pngS

Mengaktifkan Cloud Shell

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

3c1dabeca90e44e5.pngS

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

9c92662c6a846a5c.pngS

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

9f0e51b578fecce5.pngS

Mesin virtual ini dimuat dengan semua alat pengembangan yang dibutuhkan. Layanan 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 sudah 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 berikutnya, Anda akan melihat di mana layanan ini diperlukan (dan alasannya). Namun, untuk saat ini, jalankan perintah ini agar project Anda dapat mengakses Cloud Build, Artifact Registry, Vertex AI, dan Cloud Run:

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

Hasilnya akan menampilkan pesan seperti berikut yang akan berhasil:

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

3. Petunjuk - Pemrograman dalam Bahasa Alami

92f630373224ead8.pngS

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

bfe5706041ae6454.png

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

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

Klik tombol Submit untuk melihat hasilnya.

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

8aa89a1970ea9335.pngS

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, tetap 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 kecil sampai jumlah probabilitasnya sama dengan nilai top-p.
  • Maksimal respons adalah jumlah maksimum respons model yang dibuat per perintah.
  • Urutan perhentian adalah serangkaian karakter (termasuk spasi) yang menghentikan pembuatan respons jika model menemukannya.
  • Respons streaming memilih apakah respons harus dicetak saat dibuat atau disimpan, dan ditampilkan setelah selesai.
  • Nilai minimum filter keamanan menyesuaikan seberapa besar kemungkinan Anda melihat respons yang dapat berbahaya.

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

Kuis di lab ini dinyatakan sebagai array objek, yang setiap objek berisi pertanyaan, array kemungkinan respons atas pertanyaan tersebut, dan respons yang benar. Berikut adalah encoding JSON untuk kuis di 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 menampilkan kuis dalam format JSON yang diperlukan.

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

Setelah perintah Anda menghasilkan kuis sesuai dengan spesifikasi yang diinginkan, klik tombol GET CODE di pojok 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

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

Mulai dengan mengklik tombol Open Editor di bagian atas panel Cloud Shell Anda. 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 mengurangi garis pemisah antara konsol dan jendela edit/terminal dengan menarik bilah horizontal di antara dua area tersebut, yang disorot di sini:

8dea35450851af53.pngS

Anda dapat beralih antara Editor dan Terminal dengan mengklik tombol Open Editor dan Open Terminal. Coba beralih antara dua lingkungan ini sekarang.

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

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

613eb3de4b9b750a.pngS

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

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

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 otomatis menyimpan perubahan untuk Anda.

Dengan 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 berakhir 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)

Pindah kembali ke terminal dan ubah 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 memiliki 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.pngS

Tindakan ini akan membuka tab browser web ke aplikasi yang sedang berjalan, yang akan terlihat seperti ini:

aaaf366f9bf74a28.png

5. Menambahkan metode menghasilkan dengan penguraian parameter

Sekarang kita ingin menambahkan dukungan untuk memasukkan metode baru yang disebut generate. Lakukan hal ini dengan menambahkan pernyataan impor untuk memanipulasi permintaan HTTP dan mengubah rute utama untuk mengurai permintaan ini dan mencetak parameter, seperti 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 "Generator Kuis", bersama dengan parameter kueri yang otomatis ditambahkan ke URL Anda (authuser). Coba tambahkan dua parameter tambahan dengan menambahkan string "`&param1=val1&param2=val2`" ke akhir URL di kolom URL browser Anda, muat ulang halaman, dan Anda akan melihat sesuatu seperti ini:

6e223ca358e4e009.pngS

Setelah melihat cara mengirim dan mengurai parameter kueri pada URL, kita akan menambahkan dukungan untuk parameter tertentu yang akan dikirim ke generator kuis, yaitu sebagai berikut:

  • topic - materi pokok 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 sesuatu seperti halaman web berikut:

15eed60f6a805212.pngS

Coba ubah URL guna menetapkan nilai untuk 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 kirimkan ke generator kuis, yaitu sebagai berikut:

  • topic - materi pokok 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 berikut:

  • {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 sesuatu seperti halaman web berikut:

3c2b9dfcfba86b7a.pngS

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. Tindakan ini akan mengotomatiskan dialog interaktif yang Anda lakukan pada langkah #3 dan memberi layanan generator akses terprogram ke kemampuan LLM Google. Update file main.py Anda seperti berikut:

Pastikan untuk mengganti "YOUR_PROJECT" dengan project ID Anda yang sebenarnya.

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 mungkin memerlukan waktu beberapa detik karena sekarang Anda sebenarnya membuat permintaan LLM. Anda akan melihat sesuatu seperti halaman web berikut:

f43d3ba5102857b8.png

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

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

8. Ke {i>Cloud<i}!

67c99bf45a7b7805.png

Sekarang setelah membuat generator kuis Anda sendiri, Anda ingin membagikan sedikit kedahsyatan ini dengan seluruh dunia, jadi sekarang saatnya untuk men-deploy-nya ke {i>Cloud<i}. Tetapi Anda benar-benar ingin melakukan lebih dari sekadar membagikannya. Anda ingin memastikannya:

  • berjalan dengan andal - Anda mendapatkan fault tolerance otomatis jika komputer yang menjalankan aplikasi Anda error
  • melakukan penskalaan secara otomatis - aplikasi Anda akan dapat mengikuti tingkat traffic yang luas, dan otomatis mengurangi jejaknya saat tidak digunakan
  • meminimalkan biaya Anda, dengan tidak mengenakan biaya untuk resource yang tidak digunakan - Anda hanya dikenai biaya untuk resource yang dikonsumsi 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 menyesuaikannya dengan menentukan konfigurasi instance minimum
  • mendukung enkripsi end-to-end menggunakan keamanan web SSL/TLS standar - saat Anda menerapkan layanan, Anda akan mendapatkan enkripsi web standar, dan sertifikat terkait yang diperlukan, secara gratis dan otomatis

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

Dengan container, kita dapat membuat kotak modular untuk menjalankan aplikasi dengan semua dependensi yang dipaketkan bersama. Karena container dapat digunakan di hampir semua server virtual atau nyata, hal ini memberi kita cara untuk men-deploy aplikasi di mana saja yang Anda inginkan, mulai dari infrastruktur lokal ke Cloud, dan bahkan memindahkan aplikasi Anda dari satu penyedia layanan ke penyedia layanan lainnya.

Untuk mempelajari lebih lanjut container dan cara kerjanya di Google Cloud Run, lihat codelab Dev to Prod dalam Tiga Langkah Mudah dengan Cloud Run.

Men-deploy Aplikasi ke Cloud Run

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

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

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

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

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

Ini memberi tahu perintah gcloud bahwa Anda ingin menggunakan buildpack untuk membuat image container, berdasarkan file sumber yang ditemukannya dalam direktori saat ini (dot di --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. VM ini tidak menggunakan mekanisme proxy Cloud Shell yang disebutkan sebelumnya, yang bergantung pada virtual machine sementara.

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

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

9. Menggabungkan semua bagian

9927db1725bcd5d6.pngS

Pada langkah terakhir ini, kita siap menjalankan generator kuis Anda sebagai bagian dari aplikasi kuis. Kunjungi URL kuis, login ke akun Google Anda, lalu buka tab Create Quiz. Pilih jenis generator Custom, tempel URL Cloud Run Anda ke kolom URL, isi kolom wajib diisi lainnya, lalu kirim formulirnya.

328ee05579ea05f9.pngS

Dalam beberapa saat, Anda akan memiliki kuis baru (lihat "Kuis baru saya" pada gambar di bawah), dengan gambar thumbnail buatan 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 template perintah Anda.

1719169140978b63.pngS

10. Membersihkan

c1592d590c563428.png

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

Anda dapat menghapus project GCP Anda untuk menghindari timbulnya biaya, yang akan menghentikan penagihan untuk semua resource yang digunakan dalam project tersebut, atau cukup hapus image container Anda menggunakan 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 Anda, gunakan perintah berikut:

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

11. Anda Berhasil!

910162be58c0f6d6.pngS

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 memberi Anda satu pertanyaan penting:

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

Jawabannya, tentu saja, adalah nol. :)

Codelab lain untuk dilihat...

Dokumen referensi ...

12. Pesan Ajakan

Jika Anda menikmati codelab ini dan kemungkinan akan menghabiskan lebih banyak waktu langsung dengan Google Cloud, Anda harus Bergabung dengan Google Cloud Innovators sekarang juga.

498cab7d87ec12d3.pngS

Google Cloud Innovators Gratis dan mencakup:

  • Diskusi, AMA, dan sesi roadmap live untuk mempelajari informasi terbaru langsung dari Googler
  • 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!