生成 AI と Cloud Run を使用してクイズ生成ツールを構築する

1. はじめに

このラボでは、クイズを生成するためのウェブサービスを構築し、それを楽しいアプリに統合します。これまで使用したことのないプログラミング言語(英語)を使用します。

演習内容

  • 一連の条件に従って雑学クイズを生成するプロンプトを作成します。
  • シンプルなウェブアプリを構築し、開発環境で想定どおりに動作することを確認します。
  • ウェブアプリにロジックを段階的に追加して、一連の入力パラメータに従ってクイズを生成する API サーバーに変えます。
  • Google Cloud Run を使用してクイズ生成サービスをクラウドに簡単にデプロイする方法を学びます。
  • 最後に、デプロイしたクイズ生成サービスを使用するように実際のアプリ(quizaic.com)を構成し、出力に基づいてライブクイズをプレイできるようにします。

学習内容

  • 大規模言語モデル(LLM)用のテンプレート化されたプロンプトを作成する方法。
  • Python で簡単なウェブサーバー アプリを作成する方法。
  • Google の LLM のサポートをウェブアプリに追加する方法。
  • アプリをクラウドにデプロイして誰でも試せるようにする方法
  • クイズ ジェネレータを大規模なアプリに統合する方法。

必要なもの

  • Chrome ウェブブラウザ
  • Google アカウント
  • 課金が有効になっている Cloud プロジェクト

このラボは、初心者を含むあらゆるレベルのデベロッパーを対象としています。Python を使用しますが、内容を理解するために Python プログラミングに精通している必要はありません。表示されるコードはすべて説明します。

2. セットアップ

a08aa5878e36b60c.png

このセクションでは、このラボを始めるために必要なすべての手順について説明します。

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

Cloud Shell を起動する

このラボでは、Cloud Shell セッションで作業します。Cloud Shell は、Google のクラウドで実行されている仮想マシンによってホストされるコマンド インタープリタです。このセクションは、パソコンでもローカルで簡単に実行できますが、Cloud Shell を使用することで、誰もが一貫した環境での再現可能な操作性を利用できるようになります。本ラボの後、このセクションをパソコン上で再度実行してみてください。

4a95152439f0159b.png

Cloud Shell をアクティブにする

  1. Cloud Console で、[Cloud Shell をアクティブにする] 853e55310c205094.png をクリックします。

3c1dabeca90e44e5.png

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

9c92662c6a846a5c.png

Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。

9f0e51b578fecce5.png

この仮想マシンには、必要なすべての開発ツールが読み込まれます。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。この Codelab での作業のほとんどはブラウザを使って行うことができます。

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

次の設定を使用できます。

  • リージョンは、生成リクエストを実行するリージョンです。
  • Model は、使用する大規模言語モデルを選択します。この Codelab では、「gemini-1.0-pro-001」を使用します。
  • 温度は、トークン選択のランダム性の度合いを制御します。低い温度は、正しいレスポンスや適切なレスポンスが求められるプロンプトに適しています。一方、温度が高いと、多様な結果や想定外の結果が生じる可能性があります。
  • トークンの上限により、1 つのプロンプトから出力されるテキストの最大量が決まります。トークンは約 4 文字です。デフォルト値は 1,024 です。
  • トップ K は、モデルが出力用にトークンを選択する方法を変更します。トップ K が 1 の場合、選択されるトークンは、モデルの語彙内のすべてのトークンで最も確率の高いものであることになります(グリーディ デコードとも呼ばれます)。トップ K が 3 の場合は、最も確率が高い上位 3 つのトークンから次のトークン選択されることになります(温度を使用します)。トップ K のデフォルト値は 40 です。
  • トップ P は、モデルが出力用にトークンを選択する方法を変更します。確率の合計が Top-P の値と等しくなるまで、最も確率が高いものから最も確率が低いものの順に、トークンが選択されます。
  • 最大レスポンスは、プロンプトごとに生成されるモデル レスポンスの最大数です。
  • 停止シーケンスはスペースを含む一連の文字で、モデルは停止シーケンスを検出するとレスポンスの生成を停止します。
  • ストリーミング レスポンスでは、レスポンスを生成時に出力するか、保存して完了後に表示するかを選択できます。
  • 安全フィルタのしきい値を使用すると、有害な可能性があるレスポンスが表示される可能性を調整できます。

上記の要件に従った合理的なクイズを生成できるプロンプトができたら、カスタムコードを使用してこのクイズを解析できますが、プログラムに直接読み込める構造化形式で LLM にクイズを生成させる方が効率的でしょうか。このラボの後半で生成ツールを呼び出すプログラムでは、クイズが JSON で表現されることを想定しています。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 コードが表示されます。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 Editor ボタンと Open Terminal ボタンをクリックします。では、この 2 つの環境を切り替えてみます。

次に、このラボの作業を保存するフォルダを作成します。フォルダの追加ボタン 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 Editor では変更が自動的に保存されるため、このファイルを明示的に保存する必要はありません。

同じ手法で、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)

既存のウェブブラウザのタブを再読み込みして、結果を確認します。これで、URL にクエリ パラメータ(authuser)が自動的に追加され、「クイズ ジェネレータ」が表示されます。ブラウザのアドレスバーの URL の末尾に「&param1=val1&param2=val2」という文字列を追加して、ページを再読み込みすると、次のような表示になります。

6e223ca358e4e009.png

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)

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

15eed60f6a805212.png

URL を変更して、さまざまなパラメータの値を設定してみてください。たとえば、アドレスバーの URL の末尾にサフィックス「?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

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 リクエストを送信するため、数秒かかることがあります。次のようなウェブページが表示されます。

f43d3ba5102857b8.png

URL を変更して、クイズのトピック、問題の数、難易度を変えるようリクエストしてみてください。

これでマイクロサービスは完成です。次のステップでは、誰でもどこからでもアクセスできるように、Cloud にサービスをデプロイする方法を学習します。

8. クラウドへの移行

67c99bf45a7b7805.png

独自のクイズ生成ツールを作成したので、この優れたツールを世界中のユーザーと共有しましょう。そのために、Cloud にデプロイします。でも、共有するだけでなく、もっと何かしたいと思っているのではないでしょうか。次の点をご確認ください。

  • 信頼性の高い動作 - アプリを実行しているパソコンがクラッシュした場合に自動的なフォールト トレランスが得られます
  • 自動的にスケールするため、アプリは膨大な量のトラフィックに対応でき、使用されていない場合は自動的にフットプリントを削減します。
  • 使用していないリソースに対しては課金されないため、コストが最小限に抑えられる。トラフィックの応答時に消費されたリソースに対してのみ課金される
  • カスタム ドメイン名でアクセス可能 - サービスにカスタム ドメイン名を割り当てるワンクリック ソリューションにアクセスできます
  • 優れた応答時間を実現します。コールド スタートは十分な応答性を備えていますが、最小インスタンス構成を指定することで、応答時間を微調整できます。
  • は、標準の SSL/TLS ウェブ セキュリティを使用したエンドツーエンドの暗号化をサポートしています。サービスをデプロイすると、標準のウェブ暗号化と対応する必要な証明書が無料で自動的に提供されます

アプリを Google Cloud Run にデプロイすると、上記のすべてのメリットに加えて、アプリを Cloud Run と共有するための基本的な構成要素はコンテナです。

コンテナを使用すると、すべての依存関係をバンドルしてアプリケーションを実行するモジュラー ボックスを作成できます。コンテナはほぼすべての仮想サーバーまたは実際のサーバーで使用できるため、オンプレミスからクラウドまで、任意の場所にアプリケーションをデプロイできます。また、アプリケーションをサービス プロバイダ間で移動することもできます。

コンテナの詳細と Google Cloud Run でコンテナがどのように機能するかについては、Codelab の 3 つの簡単なステップで開発から本番環境へをご覧ください。

アプリを 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 は現在のディレクトリの省略形)にあるソースファイルに基づいてコンテナ イメージを作成するよう指示します。コンテナ イメージはサービスが暗黙的に処理するため、この 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

このリンクは、TLS セキュリティを備えた Cloud Run サービス専用の URL です。このリンクは(サービスを無効にしない限り)永続的であり、インターネット上のどこからでも使用できます。前述の Cloud Shell のプロキシ メカニズム(一時的な仮想マシンに依存)は使用しません。

ハイライト表示された Service URL をクリックして、実行中のアプリのウェブブラウザ タブを開きます。結果が開発環境で確認した結果と同じであることを確認します。また、URL の末尾にパラメータを指定して、生成されたクイズを調整できることを確認します。

これで、これで、アプリが Google Cloud で実行されるようになりました。何も考えることなく、TLS(HTTPS)暗号化でアプリを一般公開し、トラフィックの増加に応じて自動的にスケーリングできます。

9. すべてを組み合わせる

9927db1725bcd5d6.png

この最後のステップでは、クイズ アプリの一部としてクイズ生成ツールを実行する準備が整いました。クイズの URL にアクセスし、Google アカウントにログインして、[Create Quiz] タブに移動します。生成ツールのタイプ Custom を選択し、Cloud Run の URL を URL フィールドに貼り付け、他の必須フィールドに入力してフォームを送信します。

328ee05579ea05f9.png

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

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 マイクロサービスをデプロイできました。自然言語でプログラミングし、作成した作品を世界と共有できるようになりました。

最後に、重要な質問を 1 つご紹介します。

デベロッパー環境でアプリが動作するようにしたら、Cloud Run が提供する本番環境グレードのすべての属性を備えてクラウドにデプロイするために、どのくらいのコード行を変更する必要がありましたか?

答えはもちろん 0 です。

その他の Codelab

リファレンス ドキュメント

12. 行動を促すフレーズ

この Codelab を楽しんで、Google Cloud のハンズオンをさらに学びたい場合は、ぜひ Google Cloud Innovators に参加してください。

498cab7d87ec12d3.png

Google Cloud Innovators は無料で、以下の特典が含まれています。

  • ライブディスカッション、AMA、ロードマップ セッションに参加して、Google 社員から直接最新情報を入手できます
  • Google Cloud の最新ニュースをメールでお届け
  • デジタルバッジとビデオ会議の背景
  • Skills Boost でラボと学習に使用できる 500 クレジット

こちらをクリックして登録してください。