1. 简介
在本实验中,您将构建一个用于生成冷知识测验的 Web 服务,并将其集成到一个有趣且实用的应用中。您将使用一种可能从未用过的编程语言:英语!
实践内容…
- 您将根据一组条件精心设计提示,让 Gemini 生成一个知识问答测验。
- 您将构建一个简单的 Web 应用,并验证它在开发环境中是否按预期运行。
- 您将逐步向 Web 应用添加逻辑,将其转变为一个 API 服务器,该服务器可根据一组输入参数生成测验。
- 您将了解使用 Google Cloud Run 将测验生成服务部署到云端是多么轻松。
- 最后,您将配置一个真实的应用 ( quizaic.com) 以使用已部署的测验生成器服务,并且能够根据输出结果进行实时测验。
学习内容…
- 如何为大语言模型 (LLM) 创建模板化提示。
- 如何在 Python 中创建简单的 Web 服务器应用。
- 如何向 Web 应用添加对 Google LLM 的支持。
- 如何将应用部署到云端,以便任何人都可以试用您的新作品。
- 如何将测验生成器集成到更大的应用中。
所需条件…
- Chrome 网络浏览器
- Google 账号
- 启用了结算功能的 Cloud 项目
本实验的适用对象为各种水平的开发者,包括新手。虽然您将使用 Python,但无需熟悉 Python 编程就能理解代码内容,因为我们会解释您看到的所有代码。
2. 设置

本部分涵盖了开始此实验所需执行的所有操作。
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。



- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用
PROJECT_ID标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。 - 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。
启动 Cloud Shell
在本实验中,您将使用 Cloud Shell 会话,这是一个由在 Google 云中运行的虚拟机托管的命令解释器。您也可以在自己的计算机上本地运行本部分,但使用 Cloud Shell 可让每个人在一致的环境中获得可重现的体验。完成本实验后,欢迎您在自己的计算机上重试本部分。

激活 Cloud Shell
- 在 Cloud Console 中,点击激活 Cloud Shell
。

如果您是第一次启动 Cloud Shell,系统会显示一个介绍其功能的过渡页面。如果您看到了过渡页面,请点击继续。

预配和连接到 Cloud Shell 只需花几分钟时间。

这个虚拟机已加载了所需的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器即可完成本 Codelab 中的大部分工作。
连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID。
- 在 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`
- 在 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. 提示 - 使用自然语言进行编程

首先,我们将学习如何为大语言模型开发提示。前往 Google Cloud 控制台 > Vertex AI > Vertex AI Studio(语言)。您应该会看到如下所示的页面:

在 Generate Text 下,点击 Text Prompt 按钮。在下一个对话框中,输入您认为可能有效的问题,以根据以下要求生成知识问答测验:
- 主题:世界历史
- 问题数量:5
- 难度等级:中级
- 语言:英语
点击“提交”按钮即可查看输出。
如以下屏幕截图所示,您可以在右侧面板中选择要使用的模型,并微调部分设置:

您可以使用以下设置:
- 区域是指生成请求应运行的区域。
- 模型:选择要使用的大语言模型。在此 Codelab 中,请坚持使用“gemini-1.0-pro-001”。
- 温度可以控制词元选择的随机性。较低的温度适合希望获得真实或正确回复的提示,而较高的温度可能会引发更加多样化或意想不到的结果。
- 词元限制决定了一条提示的最大文本输出量。词元约为 4 个字符。默认值为 1024。
- Top-k 可更改模型选择输出词元的方式。如果 Top-k 设为 1,表示所选词元是模型词汇表的所有词元中概率最高的词元(也称为贪心解码)。如果 Top-k 设为 3,则表示系统将从 3 个概率最高的词元(通过温度确定)中选择下一个词元。Top-k 的默认值为 40。
- Top-p 可更改模型选择输出词元的方式。系统会按照概率从最高到最低的顺序选择 token,直到所选 token 的概率总和等于 top-p 的值。
- “回答数量上限”是指模型针对每个提示生成的回答数量上限。
- 停止序列是一连串字符(包括空格),如果模型遇到停止序列,则会停止生成回答。
- “流式回答”用于选择是即时输出生成的回答,还是保存起来并在完成后显示。
- 安全过滤器阈值用于调整您看到可能有害的回答的可能性。
获得一个似乎能根据上述要求生成合理测验的提示后,我们可以使用自定义代码解析此测验,但如果能让 LLM 以结构化格式生成测验,以便我们直接加载到程序中,岂不是更好?我们将在本实验后面部分使用的程序需要以 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 格式输出。
- 用文字明确指定您要查找的确切格式(例如上面的斜体句子)。
- 在提示中添加所需 JSON 格式的示例。
当您获得可根据所需规范生成测验的提示后,点击页面右上角的 GET CODE 按钮,查看可用于以编程方式将提示提交给 Vertex AI LLM 的 Python 代码。如果您有兴趣使用 Python 以外的编程语言,请访问 https://cloud.google.com/vertex-ai/docs/samples?text=generative。
4. 构建简单的 Web 服务器

现在,您已经有了一个可正常运行的提示,接下来我们希望将其集成到更大的应用中。当然,我们可以将提示嵌入到较大应用的源代码中,但我们希望生成器作为微服务运行,为其他应用提供测验生成服务。为此,我们需要创建一个简单的 Web 服务器并将其设为公开可用。我们将在后续步骤中进行此操作。
首先,点击 Cloud Shell 面板顶部的 Open Editor 按钮。如下所示:

然后,您会发现自己身处类似于 Visual Studio Code 的 IDE 环境中,您可以在其中创建项目、修改源代码、运行程序等。
如果屏幕空间过于狭小,您可以拖动控制台与编辑/终端窗口之间的水平栏(此处突出显示),以展开或收缩这两个区域之间的分隔线:

您可以分别点击 Open Editor 和 Open Terminal 按钮,在编辑器和终端之间来回切换。现在,尝试在这两种环境之间来回切换。
接下来,点击“添加文件夹”按钮
,输入 quiz-generator,然后按 Enter 键,创建一个用于存储本实验作业的文件夹。您在本实验中创建的所有文件以及在 Cloud Shell 中完成的所有工作都将在此文件夹中进行。
现在,创建一个 requirements.txt 文件。这会告知 Python 您的应用依赖哪些库。对于这个简单的 Web 应用,您将使用一个用于构建 Web 服务器的热门 Python 模块(名为 Flask,)、google-cloud-aiplatform 客户端库和一个名为 gunicorn 的 Web 服务器框架。在文件导航窗格中,右键点击 quiz-generator 文件夹,然后选择 New file 菜单项,如下所示:

当系统提示您输入新文件的名称时,请输入 requirements.txt,然后按 Enter 键。确保新文件最终位于 quiz-generator 项目文件夹中。
将以下行粘贴到新文件中,以指定您的应用依赖于 Python flask 软件包、gunicorn Web 服务器和 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 菜单项,如下所示:

系统随即会打开一个浏览器标签页,其中显示正在运行的应用,该应用应如下所示:

5. 添加了具有参数解析功能的生成方法
现在,我们希望添加对一种名为 generate 的新方法的支持。为此,请添加一个用于操纵 HTTP 请求的 import 语句,并修改主路由以解析此请求并打印参数,如下所示:
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)。尝试在浏览器地址栏中网址的末尾附加字符串“`¶m1=val1¶m2=val2`”,添加两个额外的参数,然后重新加载页面,您应该会看到类似以下内容:

现在,我们已经了解了如何在网址上发送和解析查询参数,接下来,我们将添加对特定参数的支持,以便将这些参数发送给测验生成器,这些参数如下所示:
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)
现在,重新加载现有的浏览器标签页,即可查看结果。您应该会看到类似以下内容的网页:

尝试更改网址,为各种参数设置值。例如,尝试在地址栏中的网址末尾添加后缀“?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French”:

6. 添加提示并设置提示格式
接下来,我们将添加对要发送给测验生成器的特定参数的支持,这些参数如下所示:
topic- 所需的测验主题num_q- 所需的问题数量diff- 所需的难度级别(简单、中等、困难)lang- 所需的测验语言
复制您在之前的步骤中使用 Vertex 生成式 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)
现在,重新加载现有的浏览器标签页,即可查看结果。您应该会看到类似以下内容的网页:

您可以尝试修改网址来更改这四个参数。
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 请求。您应该会看到类似以下内容的网页:

尝试更改网址,以请求其他测验主题、问题数量和难度级别。
这样一来,您的微服务就完成了 - 恭喜!在下一步中,您将学习如何在云端部署服务,以便任何人都可以随时随地访问该服务。
8. 云端!

现在,您已经构建了自己的测验生成器,接下来您需要将其部署到云端,以便与世界各地的用户分享这一精彩应用。但您想做的不仅仅是分享。您需要确保它:
- 运行可靠 - 如果运行应用的计算机崩溃,您将获得自动容错功能
- 自动扩缩 - 您的应用将能够应对大量流量,并在不使用时自动减少资源占用空间
- 可最大限度地降低您的费用,因为您无需为未使用的资源付费,只需为响应流量时消耗的资源付费
- 可通过自定义域名访问 - 您可以使用一键式解决方案为服务分配自定义域名
- 提供出色的响应时间 - 冷启动的响应速度相当快,但您可以通过指定实例数下限配置来进一步优化
- 支持使用标准 SSL/TLS 网络安全技术的端到端加密 - 当您部署服务时,系统会自动免费为您提供标准网络加密和相应的必需证书
将应用部署到 Google Cloud Run 后,您不仅可以获得上述所有优势,还能获得更多好处。与 Cloud Run 共享应用的基本构建块是容器。
借助容器,我们可以创建一个模块化盒子,在其中运行应用及其捆绑在一起的所有依赖项。由于容器几乎可以在任何虚拟或实际服务器上使用,因此我们可以将应用部署到您喜欢的任何位置,从本地到云端,甚至可以将应用从一个服务提供商迁移到另一个服务提供商。
如需详细了解容器及其在 Google Cloud Run 中的运作方式,请查看 Cloud Run 助力实现从开发到生产的三步轻松过渡 Codelab。
将应用部署到 Cloud Run
Cloud Run 是一项区域级服务,这意味着运行 Cloud Run 服务的基础架构位于特定区域,并且由 Google 托管,以便在该区域内的所有可用区以冗余方式提供。为简单起见,在本实验中,我们将使用硬编码的区域 us-central1。
我们将使用一种称为 buildpack 的工具来自动生成容器。在 Cloud Editor 中创建一个名为 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 命令,您希望它使用 buildpack 根据在当前目录中找到的源文件(--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
此链接是 Cloud Run 服务的专用网址,具有 TLS 安全性。此链接是永久性的(只要您不停用该服务),并且可在互联网上的任何位置使用。它不使用之前提到的 Cloud Shell 代理机制,该机制依赖于临时虚拟机。
点击突出显示的 Service URL 以打开一个浏览器标签页,其中包含正在运行的应用。验证结果是否与您在开发环境中看到的结果相同。另请验证您是否可以通过在网址末尾提供参数来调整生成的测验。
恭喜!您的应用现在正在 Google Cloud 中运行。无需考虑任何问题,您的应用即可公开提供,并使用 TLS (HTTPS) 加密,而且可以自动扩缩到令人难以置信的流量水平。
9. 将所有内容整合在一起
在最后一步中,我们准备运行测验生成器,作为 quizaic 应用的一部分。访问 quizaic 网址,登录您的 Google 账号,然后前往 Create Quiz 标签页。选择生成器类型 Custom,将 Cloud Run 网址粘贴到“网址”字段中,填写其他必填字段,然后提交表单。

稍等片刻,您应该会看到一个新测验(请参阅下图中的“我的新测验”),其中包含 AI 生成的缩略图,您可以通过相应的按钮编辑、进行、克隆或删除该测验。这个新测验是根据您的模板化提示,使用您刚刚部署的 Web 服务创建的!

10. 清理

虽然 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. 大功告成!

恭喜!您已成功编写 LLM 提示,并使用该提示部署了 Cloud Run 微服务。现在,您可以用自然语言进行编程,并与全世界分享您的作品!
最后,我想问您一个重要的问题:
在开发环境中成功运行应用后,您需要修改多少行代码才能将其部署到云端,并获得 Cloud Run 提供的所有生产级属性?
答案当然是零。:)
其他值得一试的 Codelab…
- 使用 Cloud Run,只需三个简单步骤即可从开发环境过渡到生产环境
- 使用 Vertex AI 和 Svelte Kit 构建的文本摘要应用
- 在 Cloud Run 上使用 PaLM API 的聊天应用
- 封装 PaLM Text Bison 模型的 Cloud Functions 函数
- 使用 Spanner 和 Vertex AI Imagen API 将数据转换为生成式 AI
参考文档…
12. 号召性用语
如果您喜欢此 Codelab,并且可能会花更多时间实际操作 Google Cloud,那么您应该立即加入 Google Cloud Innovators!

Google Cloud Innovators 计划是免费的,包含以下福利:
- 参加实时讨论、AMA 和路线图会议,获取直接由 Google 员工分享的最新动态
- 通过电子邮件接收最新的 Google Cloud 资讯
- 数字徽章和视频会议背景
- 500 点数,可用于 Skills Boost 上的实验和学习
点击此处即可报名!
