運用生成式 AI 和 Cloud Run 建構測驗產生器

1. 簡介

在這個研究室中,您會建構一個 Web 服務,以便生成益智問答遊戲,並整合至有趣且實用的應用程式。您將使用與以往不同的程式設計語言:英文!

您將要執行的操作...

  • 您將設計一個提示,依據一組條件生成益智問答遊戲。
  • 您將建構簡易的網頁應用程式,並確認應用程式在開發環境中的運作方式符合預期。
  • 您逐步在網頁應用程式中加入邏輯,將其轉換成 API 伺服器,根據一組輸入參數產生測驗。
  • 您將瞭解如何使用 Google Cloud Run 輕鬆將測驗產生服務部署至雲端。
  • 最後,您將設定實際的應用程式 ( quizaic.com) 使用先前部署的測驗產生器服務,然後根據輸出結果進行即時測驗。

課程內容...

  • 如何建立大型語言模型 (LLM) 的範本提示。
  • 如何使用 Python 建立簡易的網路伺服器應用程式。
  • 如何在網頁應用程式中新增 Google 大型語言模型支援。
  • 如何將應用程式部署至雲端,讓任何人都能嘗試您的新創作。
  • 如何將測驗產生器整合至大型應用程式。

軟硬體需求

  • Chrome 網路瀏覽器
  • Google 帳戶
  • 已啟用計費功能的 Cloud 專案

本研究室的適用對象為各級開發人員,包括初學者。雖然您會用到 Python,但您並不需要熟悉 Python 程式也能瞭解這一點,因為我們會說明看到的所有程式碼。

2. 設定

a08aa5878e36b60c.png

本節說明開始使用這個研究室所需的一切資源。

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您可以隨時更新付款方式。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為 PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。或者,您也可以自行嘗試,看看是否支援。在這個步驟後,這個名稱即無法變更,而且在專案期間內仍會保持有效。
  • 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行本程式碼研究室不會產生任何費用 (如果有的話)。如要關閉資源,以免產生本教學課程結束後產生的費用,您可以刪除自己建立的資源或刪除專案。新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

在本研究室中,您將會透過 Cloud Shell 工作階段執行,也就是由在 Google 雲端環境中運作的虛擬機器託管的指令解譯器。您可以和在自己的電腦本機輕鬆執行這個部分,但只要使用 Cloud Shell,就能在一致的環境中提供可重現的體驗。完成研究室後,您可以使用自己的電腦再試一次。

4a95152439f0159b.png

啟用 Cloud Shell

  1. 在 Cloud 控制台中,按一下「啟用 Cloud Shell」圖示 853e55310c205094.png

3c1dabeca90e44e5.png

如果您是第一次啟動 Cloud Shell,系統會顯示中繼畫面,說明這項服務的內容。如果系統顯示中繼畫面,請按一下「繼續」

9c92662c6a846a5c.png

佈建並連線至 Cloud Shell 只需幾分鐘的時間。

9f0e51b578fecce5.png

這個虛擬機器已載入所有必要的開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。在本程式碼研究室中,您的大部分作業都可透過瀏覽器完成。

連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為您的專案 ID。

  1. 在 Cloud Shell 中執行下列指令,確認您已通過驗證:
gcloud auth list

指令輸出

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. 在 Cloud Shell 中執行下列指令,確認 gcloud 指令知道您的專案:
gcloud config list project

指令輸出

[core]
project = <PROJECT_ID>

如果尚未設定,請使用下列指令進行設定:

gcloud config set project <PROJECT_ID>

指令輸出

Updated property [core/project].

啟用部分 API

您會在後續步驟中看到需要這些服務的位置和原因。目前請先執行下列指令,授予專案 Cloud Build、Artifact Registry、Vertex AI 和 Cloud Run 的存取權:

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

這應該會產生類似下列內容的成功訊息:

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

3. 提示:使用 Natural Language 進行程式設計

92f630373224ead8.png

首先,我們來學習如何針對大型語言模型開發提示前往 Google Cloud 控制台 >Vertex AI >Vertex AI Studio (語言)。您應該會看到類似下方的頁面:

bfe5706041ae6454.png

按一下 Generate Text 下方的 Text Prompt 按鈕。請在下一個對話方塊中,根據下列需求條件,輸入你認為有助於生成益智問答測驗的提示:

  • 主題:世界史
  • 問題數量:5
  • 難度:中階
  • 語言:英文

按一下「提交」按鈕即可查看輸出內容。

如以下螢幕截圖所示,右側面板可讓您選取要使用的模型,並調整部分設定:

8aa89a1970ea9335.png

可用的設定如下:

  • 產生產生要求的位置就是區域。
  • 模型會選擇您要使用的大型語言模型。在本程式碼研究室中,請繼續使用「gemini-1.0-pro-001」。
  • Temperature 會決定選取詞元的隨機程度。如果您想藉由提示生成正確或適當的回應,建議調低隨機性參數。另一方面,如果隨機性參數較高,則可能產生較多元或預料之外的結果。
  • 符記限制會決定針對單則提示輸出的文字數量上限。一個符記約為四個字元,預設值為 1024。
  • 「前 K 個」會調整模型選取輸出符記的方式。如果「前 K 個」設為「1」,代表所選符記是模型詞彙表的所有符記中可能性最高者 (也稱為「貪婪解碼」)。如果「前 K 個」設為「3」,則代表模型會依據隨機性參數,從可能性最高的 3 個符記中選取下一個符記。「前 K 個」的預設值為 40。
  • 「可能性總和為 P」會調整模型選取輸出符記的方式。模型會按照可能性最高到最低的順序選取符記,直到所選符記的可能性總和等於「可能性總和為 P」值。
  • 回應數量上限是指每則提示產生的模型回應數量上限。
  • 停止序列是一系列的字元 (包括空格),如果模型遇到這個序列,就會停止產生回應。
  • 串流回應會選擇是否要在產生或儲存回應時列印回應,並在完成時顯示。
  • 安全性篩選器門檻可調整看見可能有害回應的機率。

根據上述規定生成合理的測驗結果後,我們可以透過自訂程式碼剖析這項測驗,但讓大型語言模型以結構化格式產生測驗,就不是很棒的做法?本研究室稍後會在這個研究室中用來呼叫產生器的程式,預期能夠以 JSON 表示,這是用來表示結構化資料的熱門跨語言格式。

本研究室的測驗是以「物件陣列」表示,每個物件都包含一個問題、可為該問題回答的可能回應陣列,以及「正確回應」。以下是本研究室中測驗的 JSON 編碼:

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

    ...
]

確認您是否能修改提示,將測驗以所需的 JSON 格式輸出。

  1. 請精確指定要搜尋的字詞格式 (例如上方的斜體句子)。
  2. 在提示中加入所需 JSON 格式的範例。

按照所需規格按照需求生成測驗後,按一下頁面右上角的 GET CODE 按鈕,即可透過程式輔助方式將提示提交至 Vertex AI LLM。如果想要使用 Python 以外的程式設計語言,請參閱 https://cloud.google.com/vertex-ai/docs/samples?text=generative

4. 建構簡易網路伺服器

c73008bb8a72b57b.png

既然您已有有效的提示,接下來請將其整合至大型應用程式。當然,我們可以將您的提示嵌入大型應用程式的原始碼,但我們也希望您的產生器可做為微服務,為其他應用程式提供測驗產生服務。為了實現這個目標,我們需要建立簡易的網路伺服器,並公開提供該伺服器。相關操作步驟如下。

首先,請點選 Cloud Shell 面板頂端的 Open Editor 按鈕。這是訂閱按鈕的圖示:

e2a06b5304079efc.png

接著,您會進入類似 Visual Studio Code 的 IDE 環境,在此可以建立專案、編輯原始碼、執行程式等。

如果螢幕太緊,您可以拖曳主控台與編輯/終端機視窗之間的分隔線,只要在這兩個區域之間拖曳水平線 (如下圖所示):

8dea35450851af53.png

您可以按一下 Open EditorOpen Terminal 按鈕,在編輯器和終端機之間切換。現在就嘗試在這兩種環境間切換。

接下來,請建立一個用來儲存這個研究室工作的資料夾,方法是按一下「新增資料夾」按鈕 5f4e64909bc15e30.png,輸入 quiz-generator,然後按下 Enter 鍵。您在本研究室中建立的所有檔案,以及您在 Cloud Shell 中執行的所有工作,都會存放在這個資料夾中。

現在請建立 requirements.txt 檔案。這會告知 Python 應用程式依附哪些程式庫。針對這個簡單的網頁應用程式,您將使用熱門的 Python 模組建構網路伺服器,名為 Flask,google-cloud-aiplatform 用戶端程式庫,以及名為 gunicorn 的網路伺服器架構。在檔案導覽窗格中的 quiz-generator 資料夾上按一下滑鼠右鍵,然後選取 New file 選單項目,如下所示:

613eb3de4b9b750a.png

系統提示您提供新檔案名稱時,請輸入 requirements.txt 並按下 Enter 鍵。確認新檔案的結尾位於 quiz-generator 專案資料夾中。

將下列程式碼貼入新檔案,藉此指定應用程式依附於 Python flask 套件、gunicorn 網路伺服器和 google-cloud-aiplatform 用戶端程式庫,以及每個程式庫的關聯版本。

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

Cloud 編輯器會自動為您儲存變更,因此您不必手動儲存這個檔案。

使用相同的技術,建立另一個名為 main.py 的新檔案。這會是應用程式的主要 (也是唯一) Python 來源檔案。再次確認新檔案最終位於 quiz-generator 資料夾中。

在這個檔案中插入下列程式碼:

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)

請返回終端機,並使用下列指令切換至專案資料夾:

cd quiz-generator

執行下列指令,安裝專案依附元件:

pip3 install -r requirements.txt

安裝依附元件後,您應該會看見類似下方的輸出內容:

Successfully installed flask-3.0.0

接著在終端機執行下列指令,以啟動應用程式:

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

此時,您的應用程式會在 Cloud Shell 工作階段專用的虛擬機器中執行。Cloud Shell 提供 Proxy 機制,可讓您從全球網際網路,存取在虛擬機器中執行的網路伺服器 (例如您剛啟動的伺服器)。

按一下 web preview 按鈕,然後選取 Preview on Port 8080 選單項目,如下所示:

7f938c0bc1b4154c.png

這會開啟執行中應用程式的網路瀏覽器分頁,如下所示:

aaaf366f9bf74a28.png

5. 新增使用參數剖析功能的 generate 方法

現在,我們要開始支援提供名為 generate 的新方法。方法是新增匯入陳述式來操控 HTTP 要求,並 修改 主要路徑,以剖析這個請求和列印參數,如下所示:

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)

現在,請重新載入現有的網路瀏覽器分頁以查看結果。此時,您應該會看到「Quiz Generator」和一個查詢參數,已自動加進網址 (authuser)。請試著加上「`&param1=val1&param2=val2」字串,另外新增兩個參數。,然後重新載入網頁,畫面應如下所示:

6e223ca358e4e009.png

我們已經知道如何傳送及剖析網址的查詢參數,接下來我們將新增對特定參數的支援,以便傳送測驗產生器,如下所示:

  • topic:想要的測驗主題
  • num_q - 所需的問題數量
  • diff - 想要的難度等級 (簡單、中、困難)
  • lang:所需的測驗語言
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)

現在,請重新載入現有的網路瀏覽器分頁以查看結果。您應該會看到類似下方的網頁:

15eed60f6a805212.png

建議您變更網址,為各種參數設定值。例如,你可以嘗試使用「?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French」字尾。

f629dba5fa207cef.png

6. 新增提示並設定格式

接著,我們要支援傳送測驗產生器的特定參數,如下所示:

  • topic:想要的測驗主題
  • num_q - 所需的問題數量
  • diff - 想要的難度等級 (簡單、中、困難)
  • lang:所需的測驗語言

請先複製您在先前步驟中使用 Vertex Generative AI Studio 生成的提示,但使用下列字串變更主題的硬式編碼值:主題、問題數量和難度:

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

現在,請重新載入現有的網路瀏覽器分頁以查看結果。您應該會看到類似下方的網頁:

3c2b9dfcfba86b7a.png

請嘗試修改網址來修改這四個參數。

7. 新增 Vertex AI 用戶端程式庫

現在我們已準備好使用 Vertex AI Python 用戶端程式庫生成測驗了。系統會自動執行步驟 3 中的互動式提示,並透過程式輔助方式存取 Google 的 LLM 功能。按照下列方式更新 main.py 檔案:

請務必取代「YOUR_PROJECT」改為實際專案 ID。

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)

現在,請重新載入現有的網路瀏覽器分頁以查看結果。請注意,由於您正在提交 LLM 要求,因此這可能需要幾秒鐘時間。您應該會看到類似下方的網頁:

f43d3ba5102857b8.png

您可以嘗試變更網址,索取不同的測驗主題、問題數和難度。

恭喜,您的微服務已完成,恭喜!在下一個步驟中,您將瞭解如何在 Cloud 中部署服務,讓所有人都能隨處存取服務。

8. 遷移至雲端!

67c99bf45a7b7805.png

現在,您已經建立了自己的測驗產生器,接下來會跟全世界的使用者分享這項功能的驚人之處,是時候部署至雲端了。不過,您想做的不只是分享,您必須確認:

  • 穩定執行:如果電腦執行應用程式當機,你就會收到自動具備容錯能力
  • 應用程式能自動調度龐大流量,即使無人使用,應用程式也會自動減少佔用空間
  • 可將成本降至最低,也就是不針對未使用的資源收費 - 您只有在回應流量時,才為所耗用的資源付費
  • 可透過自訂網域名稱存取 - 您可透過一鍵解決方案,將自訂網域名稱指派給您的服務
  • 提供絕佳的回應時間 - 冷啟動可以合理回應,但您可以指定執行個體下限設定來微調
  • 支援使用標準 SSL/TLS 網路安全性的端對端加密技術:部署服務時,免費並自動取得標準網路加密功能,以及對應的必要憑證

將應用程式部署至 Google Cloud Run,即可享有上述所有功能和更多福利。與 Cloud Run 共用應用程式的基本構成要素是一個容器。

容器讓我們能建立模組化方塊,用於執行應用程式,並將所有依附元件組合在一起。容器幾乎能在任何虛擬或實際伺服器上使用,因此我們能讓您在任何位置部署應用程式,例如從地端部署環境部署至雲端,甚至將應用程式從某個服務供應商移至另一個服務供應商。

如要進一步瞭解容器及其在 Google Cloud Run 中的運作方式,請參閱「透過 Cloud Run 三步驟輕鬆開發完成」程式碼研究室。

將應用程式部署至 Cloud Run

Cloud Run 是區域性服務,這表示執行 Cloud Run 服務的基礎架構位於特定區域,並由 Google 代管,可為該區域內的所有可用區提供備援功能。為求簡單起見,在這個研究室中,我們會使用硬式編碼區域 us-central1

我們將使用 buildpack 來自動產生容器。在 Cloud 編輯器中建立名為 Procfile 的新檔案,然後插入這一行文字:

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

這會告知 Buildpack 系統如何在自動產生的容器中執行應用程式。接著,在 Cloud Shell 終端機 (來自同一個 quiz-generator 目錄) 中執行下列指令:

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

這會指示 gcloud 指令使用 buildpacks,以根據在目前目錄中找到的來源檔案建立容器映像檔 (--source . 中的 dot 是目前目錄的簡寫)。這項服務會以隱含方式處理容器映像檔,因此您不必針對這個 gcloud 指令指定映像檔。

稍候片刻,等待部署作業完成。成功之後,gcloud 指令會顯示新服務的網址:

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

您也可以使用下列指令擷取服務網址:

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

如下所示:

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

這個連結是具有傳輸層安全標準 (TLS) 安全性的專屬網址,適用於 Cloud Run 服務。這個連結永久有效 (只要未停用服務),即可在網際網路中的任何地方使用。並未使用前述的 Cloud Shell Proxy 機制,這類機制需仰賴暫時性的虛擬機器。

按一下醒目顯示的 Service URL,即可開啟執行中的應用程式的網路瀏覽器分頁。確認結果與開發環境中顯示的結果相同。此外,在網址結尾提供參數可確保您能調整產生的測驗。

恭喜!您的應用程式正在 Google Cloud 中執行。您的應用程式可供公開存取,並採用 TLS (HTTPS) 加密機制,並自動調整資源配置,能因應瞬息萬變的流量。

9. 將所有環節放在一起

9927db1725bcd5d6.png

在最後一個步驟中,我們準備將測驗產生器納入測驗應用程式。前往測驗網址,登入 Google 帳戶,然後前往「Create Quiz」分頁。選取產生器類型「Custom」,將 Cloud Run 網址貼到網址欄位中,填入其他必填欄位,然後提交表單。

328ee05579ea05f9.png

不久後,您就能進行新測驗 (請見下圖的「我的新測驗」),其中包含 AI 產生的縮圖。您可以在對應的按鈕中編輯、播放、複製或刪除這些測驗。我們根據範本提示,使用您剛剛部署的 Web 服務建立了這項新測驗!

1719169140978b63.png

10. 清除所用資源

c1592d590c563428.png

不使用服務時,Cloud Run 不會收費,但您可能仍須支付儲存所建構之容器映像檔的費用。

如要避免產生費用,您可以刪除 GCP 專案,讓專案中使用的所有資源不再產生費用;您也可以執行下列指令,直接刪除容器映像檔:

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>

如要刪除 Cloud Run 中的服務,請執行下列指令:

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

11. 操作成功!

910162be58c0f6d6.png

恭喜!您已成功根據提示編寫 LLM 提示,並部署 Cloud Run 微服務。現在你可以用自然語言寫程式,與全世界分享你的創作!

在此提供一個重要問題:

當應用程式開始在開發人員環境中運作後,您還需要修改幾行程式碼,才能將應用程式部署至雲端,以及 Cloud Run 提供的所有實際工作環境等級屬性。

當然,答案是 0。:)。

其他應查看的程式碼研究室...

參考說明文件...

12. 行動號召

如果您喜歡本程式碼研究室,且有可能會投入更多時間進行 Google Cloud 實作,建議您立即加入 Google Cloud Innovators 計畫

498cab7d87ec12d3.png

Google Cloud Innovators 可以免費體驗,內容涵蓋:

  • 透過即時討論、AMA 和藍圖講座,直接向 Google 員工學習最新消息
  • 直接透過收件匣接收 Google Cloud 最新消息
  • 數位徽章和視訊會議背景
  • 提供 500 點數:包含研究室和 Skills Boost 學習資源

按一下這裡報名參加!