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

1. はじめに

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

演習内容

  • 一連の基準に従って雑学クイズを生成するプロンプトを作成します。
  • 簡単なウェブアプリを作成し、開発環境で期待どおりに動作することを確認します。
  • ウェブアプリにロジックを段階的に追加して、一連の入力パラメータに従ってクイズを生成する 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

この仮想マシンには、必要なすべての開発ツールが読み込まれます。5 GB の永続的なホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。この 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

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

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

画面が大きすぎる場合は、コンソールと編集/ターミナル ウィンドウの境界線を拡大または縮小できます。これは、以下の図でハイライト表示されているように、この 2 つの領域の間にある水平バーをドラッグして変更します。

8dea35450851af53.png

[Open Editor] ボタンと [Open Terminal] ボタンをクリックすると、エディタとターミナルを切り替えることができます。この 2 つの環境を行き来してみてください。

次に、このラボの作業を保存するフォルダを作成します。フォルダ追加ボタン 5f4e64909bc15e30.png をクリックし、「quiz-generator」と入力して Enter キーを押します。このラボで作成するすべてのファイルと、Cloud Shell でのすべての作業はこのフォルダに配置されます。

次に、requirements.txt ファイルを作成します。これにより、アプリが依存するライブラリを Python に伝えます。このシンプルなウェブアプリでは、Flask, というウェブサーバーを構築するための一般的な Python モジュール(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 という新しいメソッドのフィールド作成のサポートを追加します。そのためには、次のように import ステートメントを追加して、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)に自動的に追加されたクエリ パラメータが表示されます。文字列「`&param1=val1&param2=val2`」を付加して、2 つのパラメータを追加してみましょう。ブラウザのアドレスバーに表示されている URL の末尾に追加して、ページを再読み込みすると、次のように表示されます。

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 を変更してさまざまなパラメータの値を設定してみてください。たとえば、サフィックス「?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 を変更して、クイズのトピック、問題の数、難易度を変えるようリクエストしてみてください。

これで、マイクロサービスが完成します。お疲れさまでした。次のステップでは、サービスをクラウドにデプロイして、誰もがどこからでもサービスにアクセスできるようにする方法について説明します。

8. クラウドへ!

67c99bf45a7b7805.png

独自のクイズ生成ツールが構築されたので、その素晴らしい機能を世界中の人々と共有したいと考えているので、次はそれをクラウドにデプロイします。ただし、共有する目的は他にもあることです。次の点をご確認ください。

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

アプリを Google Cloud Run にデプロイすると、上記のすべてが得られます。アプリを Cloud Run と共有するための基本的な構成要素はコンテナです。

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

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

アプリを Cloud Run にデプロイする

Cloud Run はリージョン サービスです。つまり、Cloud Run サービスを実行するインフラストラクチャは特定のリージョンに配置され、そのリージョン内のすべてのゾーンで冗長的に利用できるように Google によって管理されます。わかりやすくするため、このラボではハードコードされたリージョン us-central1 を使用します。

Buildpack というものを使用してコンテナを自動的に生成します。Cloud Editor で 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

この最後のステップでは、クイズ生成アプリの一部としてクイズ生成ツールを実行する準備が整いました。quizaic の 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 で提供される本番環境グレードの属性がすべて揃っていますか。

答えはもちろんゼロです。

その他の Codelab...

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

12. 行動を促すフレーズ

この Codelab を楽しんでいて、Google Cloud の実践に多くの時間を費やす可能性が高い方は、今すぐ Google Cloud Innovators に参加することをおすすめします。

498cab7d87ec12d3.png

Google Cloud Innovators は無料で、以下が含まれます。

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

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