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 lớp học này, bạn sẽ tạo 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 vui nhộn, hoạt động được. 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 bài kiểm tra kiến thức chung 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ẽ tăng dần việc thêm logic vào ứng dụng web để biến ứng dụng đó thành một máy chủ API tạo ra các câu đố theo một bộ tham số đầu vào.
  • Bạn sẽ thấy việc triển khai dịch vụ tạo câu đố lên đám mây bằng Google Cloud Run dễ dàng như thế nào.
  • 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ụ tạo câu đố đã triển khai và có thể chơi các câu đố trực tiếp dựa trên kết quả.

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

  • Cách tạo câu lệnh dựa trên 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ử sản phẩm mới của bạn.
  • Cách tích hợp trình tạo câu đố vào một ứng dụng lớn hơn.

Những thứ 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 độ, kể cả người mới bắt đầu. Mặc dù 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 những gì đang diễn ra vì chúng tôi sẽ giải thích tất cả mã 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 với lớp học này.

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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ự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này 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ã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án.
  • Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên đám mây. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi 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í trị giá 300 USD.

Khởi động Cloud Shell

Trong phòng thí nghiệm này, bạn sẽ làm việc trong một phiên Cloud Shell. Đây là một trình thông dịch lệnh do một máy ảo chạy trong đám mây của Google lưu trữ. 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ó được 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 bài thực hành, bạn có thể thử lại phần này trên máy tính của mình.

4a95152439f0159b.png

Kích hoạt Cloud Shell

  1. Trong 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àn hình trung gian, hãy nhấp vào Tiếp tục.

9c92662c6a846a5c.png

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

9f0e51b578fecce5.png

Máy ảo này được trang bị tất cả các công cụ phát triển cần thiết. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc của mình trong lớp học lập trình này bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng 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

Đầu ra của 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

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

Bật một số API

Trong các bước sau, bạn sẽ thấy những dịch vụ này cần thiết ở đâu (và tại sao), nhưng 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. Ra lệnh – Lập trình bằng ngôn ngữ tự nhiên

92f630373224ead8.png

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 Bảng điều khiển Google Cloud > Vertex AI > Vertex AI Studio (Ngôn ngữ). Bạn sẽ thấy một trang như sau:

bfe5706041ae6454.png

Trong phần Generate Text, hãy nhấp vào nút Text Prompt. Trong hộp thoại tiếp theo, hãy nhập một câu lệnh mà bạn cho là có thể tạo ra một bài kiểm tra kiến thức tổng quát hiệu quả 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 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 sử 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 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 có thể dẫn đến kết quả đa dạng hơn hoặc không mong đợi.
  • Giới hạn mã thông báo xác định lượng văn bản tối đa được tạo từ một câu lệnh. Một 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. Top-k bằng 1 có nghĩa là mã thông báo được chọn có khả năng xuất hiện cao 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 top-k bằng 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 cao nhất (sử dụng nhiệt độ). Giá trị mặc định của k hàng đầu là 40.
  • Top-p 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ừ mã thông báo có khả năng cao nhất đến thấp nhất cho đến khi tổng xác suất của chúng bằng giá trị top-p.
  • Số câu trả lời tối đa là số lượng câu trả lời tối đa mà mô hình 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) sẽ dừng quá trình tạo câu trả lời nếu mô hình gặp phải chuỗi này.
  • Chế độ hiện câu trả lời theo thời gian thực chọn xem câu trả lời có được in khi được tạo hay được lưu lại và hiển thị khi hoàn tất.
  • Ngưỡng của 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 có vẻ sẽ 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. Tuy nhiên, sẽ 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ể tải trực tiếp vào chương trình của mình. Chương trình mà chúng ta sẽ sử dụng sau trong lớp học lập trình này để gọi trình tạo của bạn dự kiến các câu đố sẽ được thể hiện bằng JSON. Đây là một định dạng phổ biến trên nhiều ngôn ngữ để biểu thị dữ liệu có cấu trúc.

Các câu đố trong phòng thí nghiệm này được thể hiện 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 câu đố 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ạn có thể sửa đổi câu lệnh để giờ đây xuất bài kiểm tra ở định dạng JSON bắt buộc hay không.

  1. Nêu rõ bằng lời văn đị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 có câu lệnh tạo các câu đố theo quy cách mong muốn, hãy nhấp vào nút GET CODE ở góc trên cùng bên phải của trang để xem mã Python có thể dùng để gửi câu lệnh theo cách lập trình đến một LLM của 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

Giờ đây, 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, bạn có thể nhúng câu lệnh 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 vi dịch vụ cung cấp dịch vụ tạo câu đố 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. Chúng ta 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 hẹp đường phân chia giữa bảng điều khiển và cửa sổ chỉnh sửa/thiết bị đầu cuối bằng cách kéo thanh ngang giữa hai vùng đó, được đánh dấu ở đây:

8dea35450851af53.png

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 nút Open EditorOpen Terminal tương ứng. Bây giờ, hãy thử chuyển đổi qua lại giữa hai môi trường này.

Tiếp theo, hãy tạo một thư mục để lưu trữ công việc 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 phím Enter. Tất cả các tệp bạn tạo trong lớp học này và mọi công việc bạn thực hiện trong Cloud Shell sẽ 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 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à 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 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 được 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 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.

Bằng cách 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. 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 đây 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 lại sang 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 này trong cửa sổ dòng lệnh:

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

Tại thời điểm này, ứ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 có một cơ chế proxy giúp bạn truy cập vào các máy chủ web (chẳng hạn như máy chủ bạn vừa khởi động) đang chạy trên máy ảo của mình từ mọi nơi trên Internet toàn cầu.

Nhấp vào nút web preview rồi nhấp vào mục Preview on Port 8080 trong trình đơn 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. Ứng dụng này sẽ có dạng như sau:

aaaf366f9bf74a28.png

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

Giờ đây, chúng ta muốn thêm tính năng hỗ trợ cho việc triển khai một phương thức mới có tên là generate. Hãy làm việc này bằng cách thêm một câu lệnh nhập để thao tác yêu cầu HTTP và sửa đổi tuyến đường 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 "Quiz Generator" (Trình tạo câu đố), 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ố khác 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ẽ thêm hỗ trợ cho các tham số cụ thể mà chúng ta muốn gửi cho trình tạo câu đố. Các tham số này 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ữ bạn muốn dùng cho 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 một trang web tương tự như sau:

15eed60f6a805212.png

Hãy thử thay đổi URL để đặt giá trị cho nhiều thông số. Ví dụ: hãy 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

Tiếp theo, chúng ta sẽ thêm chế độ hỗ trợ cho các tham số cụ thể mà chúng ta muốn gửi cho trình tạo câu đố. Các tham số này 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ữ bạn muốn dùng cho bài kiểm tra

Sao chép câu lệnh mà bạn đã phát triển bằng Vertex Generative AI Studio ở một bước trước đó, nhưng hãy thay đổi các giá trị được cố định giá trị trong mã cho chủ đề, số lượng câu hỏi và mức độ 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 tham số đó.

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

Giờ đây, 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. 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 của bạn quyền truy cập theo chương 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ì hiện tại bạn đang thực hiện yêu cầu LLM. Bạn sẽ thấy một trang web tương tự như sau:

f43d3ba5102857b8.png

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

Như vậy là bạn đã hoàn tất việc tạo vi dịch vụ. 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 Cloud để mọi người có thể truy cập vào dịch vụ đó ở bất cứ đâu.

8. Lên đám mây!

67c99bf45a7b7805.png

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

  • chạy một cách đáng tin cậy – bạn sẽ tự động có khả năng chịu 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 điều chỉnh quy mô – ứng dụng của bạn sẽ theo kịp lưu lượng truy cập ở mức độ 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 sử dụng trong khi phản hồi lưu lượng truy cập
  • có thể truy cập thông qua một tên miền tuỳ chỉnh – bạn có thể sử dụng giải pháp một lần nhấp để chỉ định một 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 – khởi động nguội có khả năng phản hồi hợp lý nhưng bạn có thể tinh chỉnh điều đó bằng cách chỉ định cấu hình số phiên bản 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ẽ nhận được tính năng mã hoá web tiêu chuẩn và 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 lên Google Cloud Run, bạn sẽ nhận đượ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 của bạn 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 một ứng dụng cùng với tất cả các phần phụ thuộc được kết hợp với nhau. Vì 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ừ cơ sở hạ tầng tại chỗ đế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ề các vùng chứa và cách chúng hoạt động trong Google Cloud Run, hãy xem lớp học lập trình Từ giai đoạn phát triển đến giai đoạn sản xuất chỉ trong 3 bước đơn giản với Cloud Run.

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ể hoạt động dự phòng trên tất cả các vùng trong khu vực đó. Để đơn giản, trong lớp học này, chúng ta sẽ sử dụng vùng được mã hoá cứng us-central1.

Chúng ta sẽ sử dụng một thứ gọi 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 này:

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

Thao tác này cho hệ thống buildpack 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

Lệnh này cho biết lệnh gcloud mà bạn muốn dùng buildpack để 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 sẽ xử lý ngầm hình ảnh vùng chứa, nên bạn không cần chỉ định hình ảnh cho lệnh gcloud nà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ị nội dung 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ó 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à đường liên kết cố định (miễn là bạn không tắt dịch vụ) và có thể sử dụng ở bất kỳ đâu trên Internet. Công cụ này không sử dụng cơ chế proxy của Cloud Shell như đã đề 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ở một thẻ trình duyệt web cho ứng dụng đang chạy của bạn. Xác minh rằng kết quả giống như 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 thông số ở cuối URL.

Xin chúc mừng! Ứng dụng của bạn hiện đang chạy trên Đám mây của Google. Không cần phải suy nghĩ, ứng dụng của bạn sẽ được cung cấp công khai, có mã hoá TLS (HTTPS) và khả năng tự động cấp tài nguyên bổ sung đến mức lưu lượng truy cập đáng kinh ngạc.

9. Tổng hợp tất cả các yếu tố

9927db1725bcd5d6.png

Trong bước cuối cùng này, chúng tôi đã sẵn sàng chạy trình tạo câu đố của bạn trong ứng dụng quizaic. Hãy 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

Sau vài giây, bạn sẽ có một bài kiểm tra mới (xem "Bài kiểm tra mới của tôi" trong hình ảnh bên dưới), có hình thu nhỏ do AI tạo. Bạn có thể chỉnh sửa, phát, sao chép hoặc xoá bài kiểm tra đó 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.png

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ể xoá dự án GCP để không bị tính phí. Thao tác này sẽ ngừng tính phí cho tất cả tài nguyên được dùng trong dự án đó, hoặc chỉ cần xoá hình ảnh vùng chứa 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 rồi!

910162be58c0f6d6.png

Xin chúc mừng! Bạn đã tạo thành công một câu lệnh cho LLM và triển khai một vi dịch vụ 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 mọi người!

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

Sau khi ứng dụng của bạn hoạt động trong môi trường 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. :)

Các lớp học lập trình khác cần tham khảo...

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ó khả năng dành thêm thời gian thực hành trên Google Cloud, thì bạn nên Tham gia cộng đồng Google Cloud Innovators 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 trực tiếp, AMA và các phiên thảo luận về lộ trình để tìm hiểu thông tin mới nhất trực tiếp từ các nhân viên của 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à ảnh nền hội nghị truyền hình
  • 500 tín dụng để sử dụng các phòng thí nghiệm và nội dung học tập trên Skills Boost

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