運用生成式 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

  • 「Project name」是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您隨時可以更新。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生專屬字串,您通常不需要理會這個字串。在大多數程式碼研究室中,您都需要參照專案 ID (通常會以 PROJECT_ID 表示)。如果您不喜歡系統產生的 ID,可以產生另一個隨機 ID。或者,您也可以自行嘗試,看看是否可用。在這個步驟完成後就無法變更,且會在整個專案期間維持不變。
  • 提醒您,有些 API 會使用第三個值「專案編號」。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用帳單功能,才能使用 Cloud 資源/API。執行這個程式碼研究室不會產生太多費用,甚至可能完全不會產生費用。如要關閉資源,以免產生本教學課程結束後產生的費用,您可以刪除自己建立的資源或刪除專案。Google Cloud 新使用者可享有價值 $300 美元的免費試用期

啟動 Cloud Shell

在本研究室中,您將在 Cloud Shell 工作階段中進行作業,這是由在 Google 雲端運作的虛擬機器代管的指令解譯器。您也可以在自己的電腦上執行本節內容,但使用 Cloud Shell 可讓所有人都能在一致的環境中重現體驗。實驗室結束後,歡迎您在自己的電腦上重試這一節。

4a95152439f0159b.png

啟用 Cloud Shell

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

3c1dabeca90e44e5.png

如果這是您首次啟動 Cloud Shell,系統會顯示中介畫面,說明 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. 提示 - 以自然語言進行程式設計

92f630373224ead8.png

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

bfe5706041ae6454.png

按一下 Generate Text 下方的 Text Prompt 按鈕。在下一個對話方塊中,輸入您認為可能有效產生常識測驗的提示,並符合下列規定:

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

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

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

8aa89a1970ea9335.png

可用的設定如下:

  • 區域是指產生要求應執行的位置。
  • 模型會選取要使用的大型語言模型。在本程式碼研究室中,請繼續使用「gemini-1.0-pro-001」。
  • Temperature 會決定選取詞元的隨機程度。如果您想藉由提示生成正確或適當的回覆,建議調低溫度參數。如果溫度參數較高,則可能產生較多樣化或預料之外的結果。
  • 符記限制會決定針對單則提示輸出的文字數量上限。一個符記約為四個字元,預設值為 1024。
  • 「前 K 個」會調整模型選取輸出符記的方式。如果 Top-K 設為 1,代表所選詞元是模型詞彙表的所有詞元中可能性最高者 (也稱為「貪婪解碼」)。如果 Top-K 設為 3,則代表模型會依據溫度參數,從可能性最高的 3 個詞元中選取下一個詞元。「前 K 個」的預設值為 40。
  • 「可能性總和為 P」會調整模型選取輸出符記的方式。模型會按照可能性最高到最低的順序選取符記,直到所選符記的可能性總和等於 Top-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 包含代理機制,可讓您從全球網際網路的任何位置存取在虛擬機器上執行的網頁伺服器 (例如您剛剛啟動的伺服器)。

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

7f938c0bc1b4154c.png

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

aaaf366f9bf74a28.png

5. 新增含有參數剖析的產生方法

現在,我們要開始支援提供名為 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

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

恭喜,您的微服務已完成,恭喜!在下一個步驟中,您將瞭解如何在雲端部署服務,讓任何人都能隨時隨地存取。

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

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

328ee05579ea05f9.png

幾秒鐘後,您應該會看到新的測驗 (請參閱下圖中的「我的新測驗」),以及 AI 產生的縮圖。您可以透過對應的按鈕編輯、播放、複製或刪除縮圖。這項新的測驗是使用您剛剛部署的網路服務,根據您的範本提示建立的!

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 學習資源

按一下這裡報名參加!