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 hiệu quả. Bạn sẽ sử dụng 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!

Bạn sẽ thực hiện...

  • Bạn sẽ tạo một câu lệnh tạo câu đố vui theo một bộ tiêu chí.
  • Bạn sẽ tạo 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 của bạn.
  • Bạn sẽ dần thêm logic vào ứng dụng web của mình để biến nó 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 dễ dàng như thế nào bằng Google Cloud Run.
  • 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 theo 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ủa bạn.
  • Cách triển khai ứng dụng lên đám mây để ai cũng có thể dùng thử tác phẩm mới của bạn.
  • Cách tích hợp trình tạo câu hỏ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

Phòng thí nghiệm này nhắm đến nhà phát triển ở mọi cấp độ, kể 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 bao gồm mọi việc bạn cần làm để bắt đầu với phòng thí nghiệm 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ị của những 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 ứng dụng.
  • Mã dự án là duy nhất trong 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 bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham khảo Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử cách riêng của mình để xem có thể sử dụng hay không. Bạn không thể thay đổi mã này sau bước này và mã vẫn giữ nguyên trong thời gian của dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số 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 chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh phát sinh việc thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạ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. Dù bạn có thể dễ dàng chạy phần này trên máy tính của mình, nhưng việc sử dụng Cloud Shell sẽ giúp mọi người có thể tiếp cận trải nghiệm có thể tái tạo trong một môi trường nhất quán. Sau phòng thí nghiệm này, bạn có thể thử lại phần này trên máy tính của mình.

4a95152439f0159b.pngS

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.pngs.

3c1dabeca90e44e5.png.

Nếu đây là lần đầu tiê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 nhìn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

9c92662c6a846a5c.pngS

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

9f0e51b578fecce5.pngs

Máy ảo này được tải tất cả các công cụ phát triển cần thiết. Dịch vụ 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. Nhiều (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.

  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ả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể đặt chế độ 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

Trong 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. Câu lệnh – Lập trình bằng ngôn ngữ tự nhiên

92f630373224ead8.pngs

Chúng ta sẽ bắt đầu bằng việc 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

Dưới Generate Text, 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 đây, bảng điều khiển bên phải cho phép bạn chọn kiểu máy mà bạn muốn sử dụng và tinh chỉnh một số chế độ cài đặt:

8aa89a1970ea9335.pngS

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 sẽ 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 lựa chọn mã thông báo. Nhiệt độ thấp hơn phù hợp với những câu lệnh mong đợi câu trả lời đúng hoặc chính xác, trong khi nhiệt độ cao hơn có thể dẫn đến các kết quả đa dạng hoặc không mong muốn hơ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.
  • k thay đổi cách mô hình chọn mã thông báo cho đầu ra. Giá trị hàng đầu là 1 có nghĩa là mã thông báo đã chọn là mã có khả năng xuất hiện nhiều nhất trong số tất cả cá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 đó, 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ó khả năng xuất hiện nhiều 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. Mã thông báo được chọn theo thứ tự từ có xác suất cao nhất đến ít nhất cho đến khi tổng xác suất của mã bằng giá trị p cao nhất.
  • Số câu trả lời tối đa là số lượng câu trả lời tối đa của mô hình được tạo ra cho mỗi câu lệnh.
  • Chuỗi dừng là một chuỗi ký tự (bao gồm cả dấu cách) giúp ngừng tạo phản hồi nếu mô hình gặp phải chuỗi ký tự đó.
  • 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 sẽ điều chỉnh khả năng bạn nhìn thấy các câu trả lời có thể gây hại.

Sau khi bạn nhận được câu lệnh có vẻ 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 tôi có thể phân tích cú pháp bài kiểm tra này bằng mã tuỳ chỉnh. Tuy nhiên, liệu LLM tạo bài kiểm tra ở định dạng có cấu trúc mà chúng ta có thể tải trực tiếp vào chương trình của mình có tốt hơn không? Chương trình mà chúng ta sẽ sử dụng trong phòng thí nghiệm sau này để gọi trình tạo của bạn. Các bài kiểm tra sẽ được thể hiện dưới dạng JSON, một định dạng phổ biến trên nhiều ngôn ngữ để trình bày dữ liệu có cấu trúc.

Bài kiểm tra trong phòng thí nghiệm 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 chính xác. Dưới đây là mã hoá JSON cho các bài kiểm tra trong phòng thí nghiệm 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ạ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 định dạng chính xác mà bạn đang tìm kiếm bằng từ (ví dụ: câu in nghiêng ở trên).
  2. Thêm ví dụ về định dạng JSON mong muốn vào câu lệnh của bạn.

Sau khi bạn đã tạo câu lệnh kiểm tra theo quy cách 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 đoạn 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 một mô hình ngôn ngữ lớn (LLM) của Vertex AI. Nếu bạn muốn sử dụng một ngôn ngữ lập trình không phải Python, hãy tham khảo 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ờ, khi bạn đã có một câu lệnh đang 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 tôi 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 tôi 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 cho điều đó xảy ra, chúng tôi cần tạo một máy chủ web đơn giản và đặt máy chủ đó ở chế độ công khai. 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ẽ vào một môi trường IDE tương tự như Visual Studio Code, nơi 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á hẹp, bạn có thể mở rộng hoặc thu nhỏ đường phân cách giữa bảng điều khiển và cửa sổ chỉnh sửa/cửa sổ kết thúc bằng cách kéo thanh ngang giữa hai vùng đó, được đánh dấu tại đây:

8dea35450851af53.png.

Bạn có thể chuyển đổi qua lại giữa Trình chỉnh sửa và Cửa sổ dòng lệnh bằng cách nhấp vào nút Open EditorOpen Terminal tương ứng. 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ữ công việc của bạn cho phòng thí nghiệm này bằng cách nhấp vào nút thêm thư mục 5f4e64909bc15e30.pngs, 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 và mọi thao tác bạn thực hiện trong Cloud Shell đều sẽ diễn ra trong thư mục này.

Bây giờ, hãy tạo một tệp requirements.txt. Điều 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 để xây dựng các máy chủ web có tên là Flask, (thư viện ứng dụng google-cloud-aiplatform) và một 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 trong trình đơn New file, như sau:

613eb3de4b9b750a.pngS

Khi được nhắc nhập tên của tệp mới, hãy nhập requirements.txt rồi nhấn phím Enter. Hãy đả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 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 mỗi 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ì Cloud Editor sẽ tự động lưu các thay đổi cho bạn.

Sử dụng chính kỹ thuật đó, tạo một tệp mới khác có tên main.py. Đây sẽ là tệp nguồn Python chính (và duy nhất) của ứng dụng. Một lần nữa, 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)

Quay lại cửa sổ dòng lệnh rồi thay đổi vào 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 của bạn bằng cách chạy lệnh sau trong cửa sổ 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ở ra một thẻ trình duyệt web cho ứng dụng đang chạy của bạn, thẻ này có dạng như sau:

aaaf366f9bf74a28.png

5. Thêm một phương thức tạo có 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ợ để đưa một phương thức mới có tên là generate. Bạn có thể thực hiện việc này bằng cách thêm 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 tham số truy vấn được tự động thêm vào url của mình (authuser). Hãy thử thêm hai thông 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, hãy tải lại trang và bạn sẽ thấy như sau:

6e223ca358e4e009.pngS

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ủ đề mong muốn của bài kiểm tra
  • num_q – số lượng 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.pngS

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ỉ:

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ố lượng 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 mà bạn đã tạo bằng Vertex Generative AI Studio ở bước trước nhưng thay đổi các giá trị được cố định giá trị trong mã cho chủ đề, số lượng câu hỏi và độ khó bằng những 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 giao diện như trang web sau:

3c2b9dfcfba86b7a.png.

Hãy thử sửa đổi URL để thay đổi 4 tham 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 tính năng của mô hình ngôn ngữ lớn (LLM) của Google. Cập nhật tệp main.py như sau:

Đừng quên thay thế "YOUR_PROJECT" với 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à dịch vụ vi mô của bạn đã hoàn tất. 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. Đến với đám mây!

67c99bf45a7b7805.pngS

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 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 đáng tin cậy - bạn nhận được khả năng chấp nhận lỗi tự động 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 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 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á hai đầu bằng cách sử dụng giao thức bảo mật web SSL/TLS tiêu chuẩn – khi triển khai một dịch vụ, bạn sẽ nhận được tính năng mã hoá web tiêu chuẩn cũng như các chứng chỉ bắt buộc tương ứng, miễn phí và tự độ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. Thành phần cơ bản để chia sẻ ứng dụng với Cloud Run là một vùng chứa.

Vùng chứa cho phép chúng ta tạo một hộp mô-đun để chạy ứng dụng với tất cả các phần phụ thuộc của ứng dụng đó được kết hợp với nhau. Vì các vùng chứa có thể được sử dụng trên hầu hết mọi máy chủ ảo hoặc thực, điều này giúp chúng tôi có một cách để triển khai ứng dụng của bạn ở bất cứ đâu bạn muốn, từ tại cơ sở riêng đế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 (Nhà phát triển để sản xuất).

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

Cloud Run là một dịch vụ theo khu vực, nghĩa là cơ sở hạ tầng chạy các dịch vụ Cloud Run nằm ở một khu vực cụ thể và được Google quản lý để có thể sử dụng 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ẽ dùng một gói có tên là buildpack (gói bản dựng) để tự động tạo vùng chứa của bạn. Tạo một tệp mới có tên là Procfile trong Cloud Editor rồi chèn một 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 của bạn trong vùng chứa được tạo tự động. Tiếp theo, hãy chạy lệnh sau trong Cloud Shell Terminal (từ cùng thư mục quiz-generator đó) :

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

Thao tác này sẽ cho lệnh gcloud biết rằng bạn muốn 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 ngầm xử lý hình ảnh vùng chứa, nên bạn không cần chỉ định hình ảnh trong 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ụ của mình 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ị nội dung như:

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

Đường liên kết này là một URL chuyên dụng có 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ụ của mình) và có thể sử dụng được ở bất cứ đâu trên Internet. Dịch vụ 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 đánh dấu để mở thẻ trình duyệt web cho ứng dụng đang chạy. Xác minh rằng kết quả giống với những gì 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 tham 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. Tập hợp tất cả các phần lại với nhau

9927db1725bcd5d6.pngS

Ở 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 như một phần của ứng dụng đố vui. Truy cập vào URL tĩnh, đă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 trên 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 theo mẫu của bạn!

1719169140978b63.pngS

10. Dọn dẹp

c1592d590c563428.png

Mặc dù Cloud Run không tính phí khi dịch vụ không được sử dụng, nhưng bạn vẫn có thể bị tính phí khi 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 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 một câu lệnh LLM và đã triển khai một dịch vụ vi mô Cloud Run bằng câu lệnh đó. Giờ đây, bạn có thể lập trình bằng ngôn ngữ tự nhiên và chia sẻ tác phẩm 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ả thuộc tính cấp phát hành công khai do Cloud Run cung cấp?

Tất 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 bạn thích lớp học lập trình này và có thể sẽ dành nhiều thời gian hơn để thực hành Google Cloud, thì bạn nên Tham gia Google Cloud Innovators ngay hôm nay!

498cab7d87ec12d3.pngs

Google Cloud Innovators Miễn phí và bao gồm:

  • Các buổi thảo luận trực tiếp, AMA và lộ trình học tập để trực tiếp tìm hiểu những thông tin mới nhất từ nhân viên của Google
  • tin tức mới nhất về Google Cloud ngay trong hộp thư đế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ý!