Tạo trình tạo bài kiểm tra bằng AI tạo sinh và Cloud Run

1. Giới thiệu

Trong phòng thí nghiệm này, bạn sẽ xây dựng một dịch vụ web để tạo các câu đố vui và tích hợp dịch vụ đó vào một ứng dụng thú vị và hoạt động. Bạn sẽ sử dụng một ngôn ngữ lập trình khác với ngôn ngữ bạn có thể đã sử dụng trước đây: Tiếng Anh!

Những việc bạn sẽ làm...

  • Bạn sẽ tạo một câu lệnh để tạo một bài kiểm tra kiến thức tổng hợp theo một bộ tiêu chí.
  • Bạn sẽ xây dựng một ứng dụng web đơn giản và xác minh rằng ứng dụng đó chạy như mong đợi trong môi trường phát triển.
  • Bạn sẽ dần thêm logic vào ứng dụng web của mình để biến ứng dụng đó thành một máy chủ API tạo bài kiểm tra theo một nhóm tham số đầu vào.
  • Bạn sẽ thấy việc triển khai dịch vụ tạo bài kiểm tra lên đám mây bằng Google Cloud Run thật dễ dàng.
  • Cuối cùng, bạn sẽ định cấu hình một ứng dụng thực ( quizaic.com) để sử dụng dịch vụ trình tạo bài kiểm tra đã triển khai và bạn sẽ có thể chơi các câu đố vui trực tiếp dựa trên kết quả đầu ra.

Kiến thức bạn sẽ học được...

  • Cách tạo câu lệnh mẫu cho Mô hình ngôn ngữ lớn (LLM).
  • Cách tạo một ứng dụng máy chủ web đơn giản bằng Python.
  • Cách thêm tính năng hỗ trợ cho LLM của Google vào ứng dụng web.
  • Cách triển khai ứng dụng lên đám mây để mọi người có thể dùng thử ứng dụng mới của bạn.
  • Cách tích hợp trình tạo bài kiểm tra vào một ứng dụng lớn hơn.

Bạn cần...

  • Trình duyệt web Chrome
  • Tài khoản Google
  • Một dự án trên đám mây đã bật tính năng thanh toán

Lớp học này dành cho nhà phát triển ở mọi cấp độ, bao gồm cả người mới bắt đầu. Mặc dù bạn sẽ sử dụng Python, nhưng bạn không cần phải quen thuộc với lập trình Python để hiểu điều gì đang xảy ra vì chúng tôi sẽ giải thích tất cả các mã bạn sẽ thấy.

2. Thiết lập

a08aa5878e36b60c.png

Phần này trình bày mọi việc bạn cần làm để bắt đầu lớp học lập trình này.

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Tên dự án là tên hiển thị cho người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là duy nhất trên tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng email của riêng mình để xem có thể sử dụng hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ được giữ nguyên trong suốt thời gian diễn ra dự án.
  • Xin lưu ý rằng có một giá trị thứ ba là Mã dự án mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí sau khi hoàn tất hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Trong phòng thí nghiệm này, bạn sẽ thực hiện phiên Cloud Shell, đây là phiên dịch lệnh được lưu trữ bởi một máy ảo chạy trên đám mây của Google. Bạn cũng có thể dễ dàng chạy phần này trên máy tính của riêng mình, nhưng việc sử dụng Cloud Shell sẽ giúp mọi người có thể truy cập vào một trải nghiệm có thể tái tạo trong một môi trường nhất quán. Sau khi hoàn thành lớp học lập trình, bạn có thể thử lại phần này trên máy tính của riêng mình.

4a95152439f0159b.png

Kích hoạt Cloud Shell

  1. Trên Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png.

Nếu đây là lần đầu tiên bạn khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn thấy một màn hình trung gian, hãy nhấp vào Tiếp tục.

9c92662c6a846a5c.png

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

9f0e51b578fecce5.png

Máy ảo này được tải sẵn tất cả các công cụ phát triển cần thiết. Phiên bản này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Hầu hết (nếu không nói là) tất cả công việc của bạn trong lớp học lập trình này đều có thể thực hiện bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự án của bạn.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Kết quả của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt giá trị này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

Bật một số API

Ở các bước sau, bạn sẽ biết những dịch vụ này cần thiết ở đâu (và vì sao). Tuy nhiên, hiện tại, hãy chạy lệnh này để cấp cho dự án của bạn quyền truy cập vào Cloud Build, Artifact Registry, Vertex AI và Cloud Run:

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

Thao tác này sẽ tạo ra một thông báo thành công tương tự như sau:

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

3. Lời nhắc – Lập trình bằng ngôn ngữ tự nhiên

92f630373224ead8.pngs

Chúng ta sẽ bắt đầu bằng cách tìm hiểu cách phát triển câu lệnh cho Mô hình ngôn ngữ lớn. Chuyển đến Google Cloud Console > Vertex AI > Vertex AI Studio (Ngôn ngữ). Bạn sẽ thấy một trang như sau:

bfe5706041ae6454.png

Trong Generate Text, hãy nhấp vào nút Text Prompt. Trong hộp thoại tiếp theo, hãy nhập câu lệnh mà bạn cho rằng có thể hiệu quả trong việc tạo bài kiểm tra đố vui theo các yêu cầu sau:

  • Chủ đề: Lịch sử thế giới
  • Số lượng câu hỏi: 5
  • Độ khó: trung bình
  • Ngôn ngữ: Tiếng Anh

Nhấp vào nút Gửi để xem kết quả.

Như trong ảnh chụp màn hình sau, bảng điều khiển bên phải cho phép bạn chọn mô hình mà bạn muốn sử dụng và tinh chỉnh một số chế độ cài đặt:

8aa89a1970ea9335.png

Có sẵn các cài đặt sau:

  • Khu vực là nơi yêu cầu tạo của bạn sẽ chạy.
  • Mô hình chọn mô hình ngôn ngữ lớn mà bạn muốn sử dụng. Đối với lớp học lập trình này, hãy dùng "gemini-1.0-pro-001".
  • Nhiệt độ kiểm soát mức độ ngẫu nhiên trong việc chọn mã thông báo. Nhiệt độ thấp hơn phù hợp với các câu lệnh yêu cầu phản hồi đúng hoặc chính xác, trong khi nhiệt độ cao hơn có thể dẫn đến kết quả đa dạng hơn hoặc không mong muốn.
  • Giới hạn về mã thông báo xác định số lượng văn bản đầu ra tối đa của một câu lệnh. Mã thông báo có khoảng 4 ký tự. Giá trị mặc định là 1024.
  • Top-k thay đổi cách mô hình chọn mã thông báo cho đầu ra. Giá trị top-k là 1 có nghĩa là mã thông báo được chọn là mã thông báo có nhiều khả năng nhất trong số tất cả mã thông báo trong từ vựng của mô hình (còn gọi là giải mã tham lam), trong khi giá trị top-k là 3 có nghĩa là mã thông báo tiếp theo được chọn trong số 3 mã thông báo có nhiều khả năng nhất (sử dụng nhiệt độ). Giá trị hàng đầu mặc định là 40.
  • Phần trên cùng thay đổi cách mô hình chọn mã thông báo cho đầu ra. Các mã thông báo được chọn từ khả năng cao nhất đến thấp nhất cho đến khi tổng xác suất của các mã thông báo đó bằng giá trị p hàng đầu.
  • Số câu trả lời tối đa là số câu trả lời tối đa mà mô hình tạo ra cho mỗi câu lệnh.
  • Trình tự dừng là một chuỗi ký tự (bao gồm cả dấu cách) sẽ dừng quá trình tạo phản hồi nếu mô hình gặp phải chuỗi này.
  • Khi bạn truyền trực tuyến câu trả lời, hệ thống sẽ chọn xem có in câu trả lời hay không khi chúng được tạo hoặc lưu và hiển thị khi hoàn tất.
  • Ngưỡng bộ lọc an toàn điều chỉnh khả năng bạn nhìn thấy những câu trả lời có thể gây hại.

Sau khi bạn có một câu lệnh dường như tạo ra một bài kiểm tra hợp lý theo các yêu cầu nêu trên, chúng ta có thể phân tích cú pháp bài kiểm tra này bằng mã tuỳ chỉnh, nhưng sẽ không tốt hơn nếu LLM tạo bài kiểm tra ở định dạng có cấu trúc mà chúng ta có thể trực tiếp tải vào chương trình của mình? Chương trình mà chúng ta sẽ sử dụng sau này trong lớp học lập trình này để gọi trình tạo của bạn sẽ yêu cầu bài kiểm tra được thể hiện bằng JSON. Đây là định dạng đa ngôn ngữ phổ biến để thể hiện dữ liệu có cấu trúc.

Bài kiểm tra trong lớp học này được biểu thị dưới dạng một mảng các đối tượng, trong đó mỗi đối tượng chứa một câu hỏi, một mảng các câu trả lời có thể có cho câu hỏi đó và một câu trả lời đúng. Dưới đây là mã hoá JSON cho các bài kiểm tra trong lớp học này:

[
    {
        "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"
    },

    ...
]

Hãy xem liệu bây giờ bạn có thể sửa đổi câu lệnh của mình để xuất bài kiểm tra ở định dạng JSON bắt buộc hay không.

  1. Chỉ định bằng lời nói định dạng chính xác mà bạn đang tìm kiếm (ví dụ: câu in nghiêng ở trên).
  2. Đưa vào câu lệnh của bạn một ví dụ về định dạng JSON mong muốn.

Sau khi bạn tạo câu đố theo yêu cầu theo thông số kỹ thuật mong muốn, hãy nhấp vào nút GET CODE ở góc trên bên phải của trang để xem mã Python có thể dùng để gửi câu lệnh của bạn theo phương thức lập trình đến LLM Vertex AI. Nếu bạn muốn sử dụng một ngôn ngữ lập trình khác ngoài Python, hãy xem https://cloud.google.com/vertex-ai/docs/samples?text=generative.

4. Xây dựng một máy chủ web đơn giản

c73008bb8a72b57b.png

Bây giờ, bạn đã có một câu lệnh hoạt động, chúng ta muốn tích hợp câu lệnh đó vào một ứng dụng lớn hơn. Tất nhiên, chúng ta có thể nhúng câu lệnh của bạn vào mã nguồn của ứng dụng lớn hơn, nhưng chúng ta muốn trình tạo của bạn hoạt động như một dịch vụ vi mô cung cấp dịch vụ tạo bài kiểm tra cho các ứng dụng khác. Để làm được điều đó, chúng ta cần tạo một máy chủ web đơn giản và cung cấp công khai máy chủ đó. Chúng tôi sẽ thực hiện việc đó trong các bước sau.

Bắt đầu bằng cách nhấp vào nút Open Editor ở đầu bảng điều khiển Cloud Shell. Thông báo sẽ có dạng như sau:

e2a06b5304079efc.png

Sau đó, bạn sẽ thấy mình đang ở trong một môi trường IDE tương tự như Visual Studio Code, trong đó bạn có thể tạo dự án, chỉnh sửa mã nguồn, chạy chương trình, v.v.

Nếu màn hình quá chật, bạn có thể mở rộng hoặc thu nhỏ đường phân chia giữa bảng điều khiển và cửa sổ chỉnh sửa/cửa sổ dòng lệnh bằng cách kéo thanh ngang giữa hai vùng đó, được làm nổi bật ở đây:

8dea35450851af53.pngS

Bạn có thể chuyển đổi qua lại giữa Trình chỉnh sửa và Thiết bị đầu cuối bằng cách nhấp vào các nút Open EditorOpen Terminal tương ứng. Hãy thử chuyển đổi qua lại giữa hai môi trường này ngay bây giờ.

Tiếp theo, hãy tạo một thư mục để lưu trữ bài tập của bạn cho lớp học này bằng cách nhấp vào nút thêm thư mục 5f4e64909bc15e30.png, nhập quiz-generator rồi nhấn enter. Tất cả tệp bạn tạo trong phòng thí nghiệm này cũng như mọi thao tác bạn thực hiện trong Cloud Shell sẽ đều diễn ra trong thư mục này.

Bây giờ, hãy tạo một tệp requirements.txt. Thao tác này cho Python biết ứng dụng của bạn phụ thuộc vào những thư viện nào. Đối với ứng dụng web đơn giản này, bạn sẽ sử dụng một mô-đun Python phổ biến để tạo máy chủ web có tên là Flask,, thư viện ứng dụng google-cloud-aiplatform và khung máy chủ web có tên là gunicorn. Trong ngăn điều hướng tệp, hãy nhấp chuột phải vào thư mục quiz-generator rồi chọn mục trình đơn New file, như sau:

613eb3de4b9b750a.png

Khi được nhắc nhập tên tệp mới, hãy nhập requirements.txt rồi nhấn phím enter. Đảm bảo tệp mới nằm trong thư mục dự án quiz-generator.

Dán các dòng sau vào tệp mới để chỉ định rằng ứng dụng của bạn phụ thuộc vào gói flask của Python, máy chủ web gunicorn và thư viện ứng dụng google-cloud-aiplatform, cùng với các phiên bản liên kết của từng gói.

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

Bạn không cần phải lưu tệp này một cách rõ ràng vì Trình chỉnh sửa trên đám mây sẽ tự động lưu các thay đổi cho bạn.

Sử dụng cùng một kỹ thuật, hãy tạo một tệp mới khác có tên là main.py. Đây sẽ là tệp nguồn Python chính (và duy nhất) của ứng dụng. Xin nhắc lại, hãy đảm bảo tệp mới nằm trong thư mục quiz-generator.

Chèn mã sau vào tệp này:

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)

Chuyển về cửa sổ dòng lệnh và chuyển sang thư mục dự án bằng lệnh sau:

cd quiz-generator

Chạy lệnh sau để cài đặt các phần phụ thuộc của dự án:

pip3 install -r requirements.txt

Sau khi cài đặt các phần phụ thuộc, bạn sẽ thấy kết quả có dạng như sau:

Successfully installed flask-3.0.0

Bây giờ, hãy chạy ứng dụng bằng cách chạy lệnh sau trong dòng lệnh:

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

Hiện tại, ứng dụng của bạn đang chạy trên máy ảo dành riêng cho phiên Cloud Shell. Cloud Shell bao gồm một cơ chế proxy giúp bạn có thể truy cập vào các máy chủ web (như máy chủ bạn vừa khởi động) đang chạy trên máy ảo của bạn từ bất cứ đâu trên Internet toàn cầu.

Nhấp vào nút web preview rồi nhấp vào mục trong trình đơn Preview on Port 8080 như sau:

7f938c0bc1b4154c.png.

Thao tác này sẽ mở một thẻ trình duyệt web cho ứng dụng đang chạy của bạn, có dạng như sau:

aaaf366f9bf74a28.png

5. Thêm phương thức tạo có tính năng phân tích cú pháp tham số

Bây giờ, chúng ta muốn thêm tính năng hỗ trợ để gửi một phương thức mới có tên là generate. Hãy thực hiện việc này bằng cách thêm một câu lệnh nhập để thao tác với yêu cầu HTTP và sửa đổi tuyến chính để phân tích cú pháp yêu cầu này và in các tham số như sau:

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)

Bây giờ, hãy tải lại thẻ trình duyệt web hiện có để xem kết quả. Lần này, bạn sẽ thấy "Trình tạo bài kiểm tra" cùng với một tham số truy vấn được tự động thêm vào URL của bạn (authuser). Hãy thử thêm hai tham số bổ sung bằng cách thêm chuỗi "`&param1=val1&param2=val2`" vào cuối URL trong thanh địa chỉ của trình duyệt, tải lại trang và bạn sẽ thấy nội dung như sau:

6e223ca358e4e009.png

Giờ đây, khi đã biết cách gửi và phân tích cú pháp các tham số truy vấn trên một URL, chúng ta sẽ hỗ trợ thêm các tham số cụ thể mà chúng ta sẽ muốn gửi trình tạo bài kiểm tra như sau:

  • topic – chủ đề bài kiểm tra mong muốn
  • num_q – số câu hỏi mong muốn
  • diff – độ khó mong muốn (dễ, trung bình, khó)
  • lang – ngôn ngữ mong muốn của bài kiểm tra
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)

Bây giờ, hãy tải lại thẻ trình duyệt web hiện có để xem kết quả. Bạn sẽ thấy giao diện như trang web sau:

15eed60f6a805212.png

Hãy thử thay đổi URL để đặt giá trị cho các thông số khác nhau. Ví dụ: thử sử dụng hậu tố "?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French" ở cuối URL trong thanh địa chỉ của bạn:

f629dba5fa207cef.png

6. Thêm và định dạng câu lệnh của bạn

Tiếp theo, chúng ta sẽ thêm tính năng hỗ trợ cho các tham số cụ thể mà chúng ta sẽ gửi kèm trình tạo bài kiểm tra như sau:

  • topic – chủ đề mong muốn của bài kiểm tra
  • num_q – số câu hỏi mong muốn
  • diff – độ khó mong muốn (dễ, trung bình, khó)
  • lang – ngôn ngữ mong muốn của bài kiểm tra

Sao chép câu lệnh bạn đã phát triển bằng Vertex Generative AI Studio ở bước trước, nhưng thay đổi các giá trị được mã hoá cứng cho chủ đề, số câu hỏi và độ khó bằng các chuỗi sau:

  • {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)

Bây giờ, hãy tải lại thẻ trình duyệt web hiện có để xem kết quả. Bạn sẽ thấy một trang web tương tự như sau:

3c2b9dfcfba86b7a.png

Hãy thử sửa đổi URL để thay đổi 4 thông số đó.

7. Thêm thư viện ứng dụng Vertex AI

Bây giờ, chúng ta đã sẵn sàng sử dụng thư viện ứng dụng Vertex AI Python để tạo bài kiểm tra của bạn. Thao tác này sẽ tự động hoá lời nhắc tương tác mà bạn đã thực hiện ở bước 3 và cấp cho dịch vụ trình tạo quyền truy cập có lập trình vào các chức năng LLM của Google. Cập nhật tệp main.py như sau:

Đừng quên thay thế "YOUR_PROJECT" bằng mã dự án thực tế của bạn.

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)

Bây giờ, hãy tải lại thẻ trình duyệt web hiện có để xem kết quả. Xin lưu ý rằng quá trình này có thể mất vài giây vì thực ra bạn đang tạo một yêu cầu với mô hình ngôn ngữ lớn (LLM). Bạn sẽ thấy giao diện như trang web sau:

f43d3ba5102857b8.png

Hãy thử thay đổi URL để yêu cầu một chủ đề, số lượng câu hỏi và độ khó khác của bài kiểm tra.

Vậy là bạn đã hoàn tất microservice của mình – xin chúc mừng! Trong bước tiếp theo, bạn sẽ tìm hiểu cách triển khai dịch vụ của mình trên Đám mây để ai cũng có thể truy cập ở bất cứ đâu.

8. Chuyển lên đám mây!

67c99bf45a7b7805.png

Vì bạn đã tạo trình tạo câu đố vui của riêng mình, bạn sẽ muốn chia sẻ điều tuyệt vời này với mọi người, vì vậy đã đến lúc triển khai công cụ này lên Đám mây. Nhưng bạn thực sự muốn làm nhiều việc hơn là chỉ chia sẻ. Bạn cần đảm bảo rằng tài khoản của mình:

  • chạy ổn định – bạn sẽ được tự động dung sai lỗi trong trường hợp máy tính chạy ứng dụng của bạn gặp sự cố
  • tự động mở rộng – ứng dụng của bạn sẽ bắt kịp mức lưu lượng truy cập lớn và tự động giảm mức sử dụng khi không dùng đến
  • giảm thiểu chi phí của bạn bằng cách không tính phí cho những tài nguyên mà bạn không sử dụng - bạn chỉ bị tính phí cho những tài nguyên được tiêu thụ trong khi phản hồi lưu lượng truy cập
  • có thể truy cập qua tên miền tuỳ chỉnh – bạn có quyền truy cập vào giải pháp chỉ cần một lần nhấp để chỉ định tên miền tuỳ chỉnh cho dịch vụ của mình
  • cung cấp thời gian phản hồi tuyệt vời – quy trình khởi động nguội có tính phản hồi hợp lý, nhưng bạn có thể tinh chỉnh bằng cách chỉ định cấu hình thực thể tối thiểu
  • hỗ trợ mã hoá đầu cuối bằng cách sử dụng tính năng bảo mật web SSL/TLS tiêu chuẩn – khi triển khai một dịch vụ, bạn sẽ được tự động cung cấp miễn phí tính năng mã hoá web tiêu chuẩn và các chứng chỉ bắt buộc tương ứng

Khi triển khai ứng dụng trên Google Cloud Run, bạn sẽ có được tất cả những lợi ích nêu trên và nhiều lợi ích khác. Vùng chứa là thành phần cơ bản để chia sẻ ứng dụng của bạn với Cloud Run.

Vùng chứa cho phép chúng ta tạo một hộp mô-đun để chạy một ứng dụng với tất cả các phần phụ thuộc được đóng gói cùng nhau. Vì bạn có thể sử dụng vùng chứa trên hầu hết mọi máy chủ ảo hoặc máy chủ thực, nên chúng tôi có thể triển khai ứng dụng của bạn ở bất cứ đâu bạn muốn, từ máy chủ cục bộ đến đám mây, và thậm chí là di chuyển ứng dụng của bạn từ nhà cung cấp dịch vụ này sang nhà cung cấp dịch vụ khác.

Để tìm hiểu thêm về vùng chứa và cách thức hoạt động của vùng chứa trong Google Cloud Run, hãy tham khảo lớp học lập trình Dev to Production in 3 bước đơn giản với Cloud Run để tìm hiểu.

Triển khai ứng dụng lên Cloud Run

Cloud Run là một dịch vụ theo khu vực, tức là cơ sở hạ tầng chạy các dịch vụ Cloud Run của bạn nằm ở một khu vực cụ thể và do Google quản lý để có thể cung cấp dịch vụ dự phòng trên tất cả các vùng trong khu vực đó. Để đơn giản, trong phòng thí nghiệm này, chúng ta sẽ sử dụng khu vực được mã hoá cứng us-central1.

Chúng ta sẽ sử dụng một công cụ có tên là buildpack để tự động tạo vùng chứa. Tạo một tệp mới có tên Procfile trong Cloud Editor rồi chèn dòng văn bản sau:

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

Thao tác này cho hệ thống gói bản dựng biết cách chạy ứng dụng trong vùng chứa được tạo tự động. Tiếp theo, hãy chạy lệnh sau trong Dấu nhắc dòng lệnh trên Cloud Shell (từ cùng thư mục quiz-generator đó) :

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

Thao tác này cho lệnh gcloud biết rằng bạn muốn lệnh này sử dụng các gói bản dựng để tạo hình ảnh vùng chứa, dựa trên các tệp nguồn mà lệnh này tìm thấy trong thư mục hiện tại (dot trong --source . là viết tắt của thư mục hiện tại). Vì dịch vụ này xử lý hình ảnh vùng chứa một cách ngầm ẩn, nên bạn không cần chỉ định hình ảnh trên lệnh gcloud này.

Hãy đợi vài phút cho đến khi quá trình triển khai hoàn tất. Khi thành công, lệnh gcloud sẽ hiển thị URL của dịch vụ mới:

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

Bạn cũng có thể truy xuất URL dịch vụ bằng lệnh sau:

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

Thao tác này sẽ hiển thị như sau:

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

Đường liên kết này là một URL chuyên dụng, có tính năng bảo mật TLS, dành cho dịch vụ Cloud Run của bạn. Đường liên kết này là vĩnh viễn (miễn là bạn không tắt dịch vụ) và có thể sử dụng ở bất kỳ nơi nào trên Internet. Công cụ này không sử dụng cơ chế proxy của Cloud Shell được đề cập trước đó, cơ chế này phụ thuộc vào một máy ảo tạm thời.

Nhấp vào Service URL được làm nổi bật để mở thẻ trình duyệt web cho ứng dụng đang chạy. Xác minh kết quả giống với kết quả bạn thấy khi ở trong môi trường phát triển. Ngoài ra, hãy xác minh rằng bạn có thể điều chỉnh bài kiểm tra được tạo bằng cách cung cấp các thông số ở cuối URL.

Xin chúc mừng! Ứng dụng của bạn hiện đang chạy trong Đám mây của Google. Không cần phải bận tâm, ứng dụng của bạn sẽ xuất hiện công khai với tính năng mã hoá TLS (HTTPS) và tự động mở rộng theo quy mô lưu lượng truy cập đáng kinh ngạc.

9. Kết hợp tất cả các phần

9927db1725bcd5d6.png

Ở bước cuối cùng này, chúng ta đã sẵn sàng chạy trình tạo bài kiểm tra trong ứng dụng quizaic. Truy cập vào URL quizaic, đăng nhập vào Tài khoản Google của bạn rồi chuyển đến thẻ Create Quiz. Chọn loại trình tạo Custom, dán URL Cloud Run vào trường URL, điền vào các trường bắt buộc khác rồi gửi biểu mẫu.

328ee05579ea05f9.png

Trong giây lát, bạn sẽ thấy một bài trắc nghiệm mới (xem phần "Bài kiểm tra mới của tôi" trong hình bên dưới), kèm theo hình thu nhỏ do AI tạo. Bạn có thể chỉnh sửa, phát, sao chép hoặc xoá thông qua các nút tương ứng. Bài kiểm tra mới này được tạo bằng dịch vụ web mà bạn vừa triển khai dựa trên câu lệnh mẫu!

1719169140978b63.png

10. Dọn dẹp

c1592d590c563428.png

Mặc dù Cloud Run không tính phí khi bạn không sử dụng dịch vụ, nhưng bạn vẫn có thể bị tính phí để lưu trữ hình ảnh vùng chứa đã tạo.

Bạn có thể xóa dự án GCP của mình để tránh phát sinh phí, sẽ ngừng thanh toán cho tất cả các tài nguyên được sử dụng trong dự án đó hoặc chỉ cần xóa hình ảnh vùng chứa của bạn bằng lệnh sau:

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>

Để xoá dịch vụ Cloud Run, hãy sử dụng lệnh sau:

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

11. Bạn đã làm được!

910162be58c0f6d6.pngS

Xin chúc mừng! Bạn đã tạo thành công lời nhắc LLM và triển khai một dịch vụ vi mô Cloud Run bằng lời nhắc đó. Giờ đây, bạn có thể lập trình bằng ngôn ngữ tự nhiên và chia sẻ các sản phẩm sáng tạo của mình với thế giới!

Tôi muốn cho bạn một câu hỏi quan trọng:

Sau khi ứng dụng hoạt động trong môi trường dành cho nhà phát triển, bạn phải sửa đổi bao nhiêu dòng mã để triển khai ứng dụng đó lên đám mây, với tất cả các thuộc tính cấp sản xuất do Cloud Run cung cấp?

Đương nhiên, câu trả lời là 0. :)

Hãy tham khảo các lớp học lập trình khác...

Tài liệu tham khảo...

12. Kêu gọi hành động

Nếu đã thích lớp học lập trình này và muốn dành nhiều thời gian hơn để thực hành với Google Cloud, thì bạn nên tham gia chương trình Nhà đổi mới Google Cloud ngay hôm nay!

498cab7d87ec12d3.png

Google Cloud Innovators là chương trình miễn phí và bao gồm:

  • Các buổi thảo luận, AMA và lộ trình trực tiếp để tìm hiểu thông tin mới nhất trực tiếp từ các nhân viên Google
  • Tin tức mới nhất về Google Cloud ngay trong hộp thư đến của bạn
  • Huy hiệu kỹ thuật số và nền hội nghị truyền hình
  • 500 tín dụng của các phòng thí nghiệm và học tập trên Skills Boost

Nhấp vào đây để đăng ký!