1. はじめに
このラボでは、トリビア クイズを生成するウェブサービスを構築し、楽しい動作するアプリに統合します。これまで使用したことのないプログラミング言語(英語)を使用します。
演習内容
- 一連の条件に従って雑学クイズを生成するプロンプトを作成します。
- シンプルなウェブアプリを構築し、開発環境で想定どおりに動作することを確認します。
- ウェブアプリにロジックを段階的に追加して、一連の入力パラメータに従ってクイズを生成する API サーバーにします。
- Google Cloud Run を使用してクイズ生成サービスをクラウドに簡単にデプロイする方法を説明します。
- 最後に、デプロイしたクイズ作成サービスを使用するように実際のアプリ(quizaic.com)を構成します。これにより、出力に基づいてライブクイズをプレイできるようになります。
学習内容
- 大規模言語モデル(LLM)のテンプレート プロンプトを作成する方法。
- Python でシンプルなウェブサーバー アプリを作成する方法。
- Google の LLM のサポートをウェブアプリに追加する方法。
- アプリをクラウドにデプロイして、誰でも新しい作品を試せるようにする方法。
- クイズ ジェネレータを大規模なアプリに統合する方法。
必要なもの
- Chrome ウェブブラウザ
- Google アカウント
- 課金が有効になっている Cloud プロジェクト
このラボは、初心者を含むあらゆるレベルのデベロッパーを対象としています。Python を使用しますが、表示されるすべてのコードを説明するため、内容を理解するために Python プログラミングに精通している必要はありません。
2. セットアップ

このセクションでは、このラボを始めるために必要なすべての手順について説明します。
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_IDと識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell を起動する
このラボでは、Cloud Shell セッションで作業します。Cloud Shell は、Google のクラウド内で実行されている仮想マシンによってホストされたコマンド インタープリタです。このセクションは、パソコンでもローカルで簡単に実行できますが、Cloud Shell を使用することで、誰もが一貫した環境での再現可能な操作性を利用できるようになります。本ラボの後、このセクションをパソコン上で再度実行してみてください。

Cloud Shell をアクティブにする
- Cloud Console で、[Cloud Shell をアクティブにする]
をクリックします。

Cloud Shell を初めて起動する場合は、その内容を説明する中間画面が表示されます。中間画面が表示された場合は、[続行] をクリックします。

すぐにプロビジョニングが実行され、Cloud Shell に接続されます。

この仮想マシンには、必要な開発ツールがすべて用意されています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。このコードラボで行う作業のほとんどはブラウザから実行できます。
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
- 難易度: 中級
- 言語: 英語
[送信] ボタンをクリックして出力を確認します。
次のスクリーンショットに示すように、右側のパネルでは、使用するモデルを選択し、一部の設定を微調整できます。

次の設定を使用できます。
- リージョンは、生成リクエストを実行する場所です。
- Model: 使用する大規模言語モデルを選択します。この Codelab では、「gemini-1.0-pro-001」を使用します。
- 温度は、トークン選択のランダム性の度合いを制御します。低い温度は、正しいレスポンスや適切なレスポンスが求められるプロンプトに適しています。一方、温度が高いと、多様な結果や想定外の結果が生じる可能性があります。
- トークンの上限により、1 つのプロンプトから出力されるテキストの最大量が決まります。トークンは約 4 文字です。デフォルト値は 1024 です。
- トップ K は、モデルが出力用にトークンを選択する方法を変更します。トップ K が 1 の場合、選択されるトークンは、モデルの語彙内のすべてのトークンで最も確率の高いものであることになります(グリーディ デコードとも呼ばれます)。トップ K が 3 の場合は、最も確率が高い上位 3 つのトークンから次のトークン選択されることになります(温度を使用します)。トップ K のデフォルト値は 40 です。
- Top-P は、モデルが出力用にトークンを選択する方法を変更します。確率の合計が 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. シンプルなウェブサーバーを構築する

プロンプトが機能するようになったので、これを大規模なアプリに統合します。もちろん、プロンプトを大規模なアプリのソースコードに埋め込むこともできますが、他のアプリにクイズ生成サービスを提供するマイクロサービスとしてジェネレータを機能させたいと考えています。そのためには、シンプルなウェブサーバーを作成して一般公開する必要があります。次の手順でこれを行います。
まず、Cloud Shell パネルの上部にある Open Editor ボタンをクリックします。たとえば、次のようになります。

Visual Studio Code に似た IDE 環境が表示され、プロジェクトの作成、ソースコードの編集、プログラムの実行などを行うことができます。
画面が狭すぎる場合は、コンソールと編集/ターミナル ウィンドウの間の分割線を拡大または縮小できます。それには、次の図でハイライト表示されている 2 つの領域の間の水平バーをドラッグします。

[Open Editor] ボタンと [Open Terminal] ボタンをそれぞれクリックすると、エディタとターミナルを切り替えることができます。それでは、この 2 つの環境を切り替えてみましょう。
次に、フォルダ追加ボタン
をクリックして、このラボの作業を保存するフォルダを作成します。quiz-generator と入力して、Enter キーを押します。このラボで作成するすべてのファイルと、Cloud Shell で行うすべての作業は、このフォルダで行われます。
次に、requirements.txt ファイルを作成します。これにより、アプリが依存するライブラリが Python に通知されます。このシンプルなウェブアプリでは、ウェブサーバーの構築に使用する一般的な Python モジュールである Flask,、google-cloud-aiplatform クライアント ライブラリ、gunicorn というウェブサーバー フレームワークを使用します。ファイル ナビゲーション ペインで、quiz-generator フォルダを右クリックし、次のように New file メニュー項目を選択します。

新しいファイルの名前の入力を求められたら、「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 メニュー項目をクリックします。

実行中のアプリのウェブブラウザタブが開きます。次のような画面が表示されます。

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」が表示され、URL にクエリ パラメータ(authuser)が自動的に追加されます。ブラウザのアドレスバーの URL の末尾に「`¶m1=val1¶m2=val2`」という文字列を追加して、さらに 2 つのパラメータを追加してみましょう。ページを再読み込みすると、次のような結果が表示されます。

URL でクエリ パラメータを送信して解析する方法を確認したので、クイズ ジェネレータに送信する特定のパラメータのサポートを追加します。パラメータは次のとおりです。
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)
既存のウェブブラウザのタブを再読み込みして、結果を確認します。次のようなウェブページが表示されます。

URL を変更して、さまざまなパラメータの値を設定してみましょう。たとえば、アドレスバーの URL の末尾に「?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French」というサフィックスを追加してみてください。

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)
既存のウェブブラウザのタブを再読み込みして、結果を確認します。次のようなウェブページが表示されます。

URL を変更して、これらの 4 つのパラメータを変更してみてください。
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 リクエストを実際に送信するため、数秒かかることがあります。次のようなウェブページが表示されます。

URL を変更して、別のクイズのトピック、質問数、難易度をリクエストしてみてください。
これでマイクロサービスは完成です。おめでとうございます。次のステップでは、どこからでもアクセスできるように、サービスをクラウドにデプロイする方法を学習します。
8. クラウドへ!

独自のクイズ ジェネレータを作成したので、この素晴らしい機能を世界中のユーザーと共有しましょう。そのためには、Cloud にデプロイする必要があります。しかし、単に共有するだけでなく、もっと活用したいと考えているかもしれません。以下の点を確認してください。
- 信頼性の高い実行 - アプリを実行しているコンピュータがクラッシュした場合に、自動的にフォールト トレランスが適用されます。
- 自動的にスケーリング - アプリは大量のトラフィックに対応し、使用されていないときはフットプリントを自動的に削減します。
- 使用していないリソースに対して課金されないため、費用を最小限に抑えることができます。課金されるのは、トラフィックへの応答中に消費されたリソースのみです。
- カスタム ドメイン名でアクセス可能 - サービスにカスタム ドメイン名を割り当てるワンクリック ソリューションにアクセスできます。
- 優れたレスポンス時間を提供します。コールド スタートのレスポンスは妥当ですが、最小インスタンス構成を指定することで微調整できます。
- 標準の SSL/TLS ウェブ セキュリティを使用したエンドツーエンドの暗号化をサポートします。サービスをデプロイすると、標準のウェブ暗号化と、対応する必要な証明書が無料で自動的に取得されます。
アプリを Google Cloud Run にデプロイすると、上記のすべてのメリットが得られます。Cloud Run でアプリを共有するための基本的な構成要素はコンテナです。
コンテナを使用すると、すべての依存関係がバンドルされたアプリケーションを実行するためのモジュール式ボックスを作成できます。コンテナはほぼすべての仮想サーバーまたは実サーバーで使用できるため、オンプレミスからクラウドまで、任意の場所にアプリケーションをデプロイできます。また、アプリケーションをあるサービス プロバイダから別のサービス プロバイダに移行することもできます。
コンテナと Google Cloud Run でのコンテナの仕組みについて詳しくは、Cloud Run で 3 つの簡単なステップで開発から本番環境への移行の Codelab をご覧ください。
アプリを Cloud Run にデプロイする
Cloud Run はリージョナル サービスです。つまり、Cloud Run サービスを実行するインフラストラクチャは特定のリージョンに配置され、そのリージョン内のすべてのゾーンで冗長的に利用できるよう Google によって管理されます。このラボでは、簡略化のため、ハードコードされたリージョン us-central1 を使用します。
Buildpack というものを使用して、コンテナを自動的に生成します。Cloud エディタで Procfile という名前の新しいファイルを作成し、次の 1 行のテキストを挿入します。
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 コマンドは、現在のディレクトリにあるソースファイルに基づいて(--source . の dot は現在のディレクトリの短縮形)、Buildpack を使用してコンテナ イメージを作成するように指示されます。サービスがコンテナ イメージを暗黙的に処理するため、この gcloud コマンドでイメージを指定する必要はありません。
デプロイが完了するまで少しお待ちください。成功すると、gcloud コマンドに新しいサービスの URL が表示されます。
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
次のコマンドを使用して、サービス URL を取得することもできます。
gcloud run services describe quiz-generator \ --region us-central1 \ --format "value(status.url)"
次のような内容が表示されます。
https://quiz-generator-co24gukjmq-uc.a.run.app
このリンクは、Cloud Run サービスの専用 URL で、TLS セキュリティが適用されています。このリンクは永続的で(サービスを無効にしない限り)、インターネット上のどこでも使用できます。これは、前述の一時的な仮想マシンに依存する Cloud Shell のプロキシ メカニズムを使用しません。
ハイライト表示された Service URL をクリックして、実行中のアプリのウェブブラウザタブを開きます。結果が開発環境で確認した結果と同じであることを確認します。また、URL の末尾にパラメータを指定して、生成されたクイズを調整できることも確認します。
おめでとうございます!アプリが Google Cloud で実行されるようになりました。アプリは、TLS(HTTPS)暗号化と、驚くほどのトラフィック レベルへの自動スケーリングにより、公開されます。
9. すべてを組み合わせる
最後のステップでは、quizaic アプリの一部としてクイズ ジェネレータを実行します。quizaic の URL にアクセスし、Google アカウントにログインして、[Create Quiz] タブに移動します。ジェネレータ タイプ Custom を選択し、Cloud Run URL を URL フィールドに貼り付け、他の必須項目を入力して、フォームを送信します。

数分後には、AI で生成されたサムネイル画像を含む新しいクイズ(下の画像の「My new quiz」を参照)が作成されます。このクイズは、対応するボタンを使用して編集、再生、複製、削除できます。この新しいクイズは、テンプレート化されたプロンプトに基づいてデプロイしたウェブサービスを使用して作成されました。

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 マイクロサービスをデプロイできました。自然言語でプログラミングして、作品を世界に公開できるようになりました。
最後に、重要な質問を 1 つご紹介します。
開発環境でアプリが動作するようになったら、Cloud Run が提供するすべての本番環境グレードの属性を使用して、アプリをクラウドにデプロイするために何行のコードを変更する必要がありましたか?
答えは 0 です。
その他の Codelab もご覧ください。
- Cloud Run: 3 ステップで簡単に開発から本番環境へ
- 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 の最新ニュースをメールでお届けします
- デジタルバッジとビデオ会議の背景
- Skills Boost でラボと学習に利用できる 500 クレジット
登録するには、こちらをクリックしてください。
