Создайте генератор викторин с помощью GenAI и Cloud Run

1. Введение

В ходе этой лабораторной работы вы создадите веб-службу для создания викторин и интегрируете ее в интересное и работающее приложение. Вы будете использовать другой язык программирования, чем тот, который вы использовали раньше: английский!

Что ты сделаешь...

  • Вы создадите подсказку, которая создаст викторину в соответствии с набором критериев.
  • Вы создадите простое веб-приложение и убедитесь, что оно работает должным образом в вашей среде разработки.
  • Вы будете постепенно добавлять логику в свое веб-приложение, чтобы превратить его в сервер API, который генерирует тесты в соответствии с набором входных параметров.
  • Вы увидите, насколько легко развернуть службу создания тестов в облаке с помощью Google Cloud Run.
  • Наконец, вы настроите реальное приложение ( quizaic.com ) для использования развернутой службы генератора викторин и сможете играть в викторины в реальном времени на основе результатов.

Чему вы научитесь...

  • Как создать шаблонное приглашение для большой языковой модели (LLM).
  • Как создать простое приложение веб-сервера на Python.
  • Как добавить поддержку Google LLM в ваше веб-приложение.
  • Как развернуть ваше приложение в облаке, чтобы каждый мог опробовать ваше новое творение.
  • Как интегрировать генератор викторин в более крупное приложение.

Что вам понадобится...

  • Веб-браузер Chrome
  • Аккаунт Google
  • Облачный проект с включенной оплатой

Эта лабораторная работа ориентирована на разработчиков всех уровней, включая новичков. Хотя вы будете использовать Python, вам не обязательно быть знакомым с программированием на Python, чтобы понять, что происходит, потому что мы объясним весь код, который вы увидите.

2. Настройка

a08aa5878e36b60c.png

В этом разделе описано все, что вам нужно сделать, чтобы начать работу с этой лабораторной работой.

Самостоятельная настройка среды

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы всегда можете обновить его.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (невозможно изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно идентифицируемый как PROJECT_ID ). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Альтернативно, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага и он сохраняется на протяжении всего проекта.
  • К вашему сведению, есть третье значение — номер проекта , которое используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой кодовой лаборатории не будет стоить много, если вообще что-то стоить. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Запустить 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 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью браузера.

После подключения к Cloud Shell вы увидите, что вы прошли аутентификацию и что для проекта установлен идентификатор вашего проекта.

  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 Console > Vertex AI > Vertex AI Studio (Язык). Вы должны увидеть такую ​​страницу:

bfe5706041ae6454.png

В разделе Generate Text нажмите кнопку Text Prompt . В следующем диалоговом окне введите подсказку, которая, по вашему мнению, может быть эффективной для создания викторины в соответствии со следующими требованиями:

  • Тема: Всемирная история
  • Количество вопросов: 5
  • Уровень сложности: средний
  • Английский язык

Нажмите кнопку «Отправить», чтобы увидеть результат.

Как показано на следующем снимке экрана, правая панель дает вам возможность выбрать модель, которую вы хотите использовать, и выполнить точную настройку некоторых параметров:

8aa89a1970ea9335.png

Доступны следующие настройки:

  • Регион — это место, где должен выполняться ваш запрос на создание.
  • Модель выбирает, какую большую языковую модель вы хотите использовать. Для этой кодовой лаборатории придерживайтесь «gemini-1.0-pro-001».
  • Температура контролирует степень случайности при выборе токенов. Более низкие температуры хороши для подсказок, которые ожидают истинного или правильного ответа, тогда как более высокие температуры могут привести к более разнообразным или неожиданным результатам.
  • Предел токена определяет максимальный объем текстового вывода из одного приглашения. Токен состоит примерно из четырех символов. Значение по умолчанию — 1024.
  • Top-k меняет способ выбора токенов моделью для вывода. Значение top-k, равное 1, означает, что выбранный токен является наиболее вероятным среди всех токенов в словаре модели (также называемое жадным декодированием), тогда как значение top-k, равное 3, означает, что следующий токен выбирается из трех наиболее вероятных токенов ( используя температуру). Значение top-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.

  1. Укажите словами точный формат, который вы ищете (например, предложение, выделенное курсивом выше).
  2. Включите в приглашение пример желаемого формата JSON.

После того как у вас есть тесты, генерирующие приглашения в соответствии с желаемой спецификацией, нажмите кнопку GET CODE в правом верхнем углу страницы, чтобы увидеть код Python, который можно использовать для программной отправки вашего приглашения в Vertex AI LLM. Если вы заинтересованы в использовании другого языка программирования, кроме Python, посетите https://cloud.google.com/vertex-ai/docs/samples?text=generative .

4. Создайте простой веб-сервер

c73008bb8a72b57b.png

Теперь, когда у вас есть работающая подсказка, мы хотим интегрировать ее в более крупное приложение. Конечно, мы могли бы встроить ваше приглашение в исходный код более крупного приложения, но мы хотим, чтобы ваш генератор функционировал как микросервис, предоставляющий услугу создания тестов для других приложений. Чтобы это произошло, нам нужно создать простой веб-сервер и сделать его общедоступным. Мы сделаем это на следующих шагах.

Начните с нажатия кнопки Open Editor в верхней части панели Cloud Shell. Это выглядит так:

e2a06b5304079efc.png

После этого вы окажетесь в среде IDE, похожей на Visual Studio Code, в которой вы сможете создавать проекты, редактировать исходный код, запускать свои программы и т. д.

Если ваш экран слишком тесный, вы можете расширить или уменьшить разделительную линию между консолью и окном редактирования/терминала, перетащив горизонтальную полосу между этими двумя областями, выделенными здесь:

8dea35450851af53.png

Вы можете переключаться между редактором и терминалом, нажимая кнопки Open Editor и Open 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 и нажмите клавишу ввода. Убедитесь, что новый файл находится в папке проекта 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

Откроется вкладка веб-браузера с запущенным приложением, которая должна выглядеть примерно так:

аааф366f9bf74a28.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 ). Попробуйте добавить два дополнительных параметра, добавив строку «`&param1=val1&param2=val2`» в конец 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 " в конце URL-адреса в адресной строке:

f629dba5fa207cef.png

6. Добавьте и отформатируйте приглашение

Далее мы добавим поддержку конкретных параметров, которые мы хотим отправить нашему генератору тестов, а именно:

  • topic - желаемая тема викторины
  • num_q - количество желаемых вопросов
  • diff - желаемый уровень сложности (легкий, средний, сложный)
  • lang - желаемый язык теста

Скопируйте приглашение, которое вы разработали с помощью Vertex Generative AI Studio на предыдущем этапе, но измените жестко запрограммированные значения темы, количества вопросов и уровня сложности с помощью следующих строк:

  • {тема}
  • {num_q}
  • {разница}
  • {язык}
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-адрес, чтобы изменить эти четыре параметра.

7. Добавьте клиентскую библиотеку Vertex AI.

Теперь мы готовы использовать клиентскую библиотеку Vertex AI Python для создания вашего теста. Это позволит автоматизировать интерактивные подсказки, которые вы выполняли на шаге №3, и предоставит вашему сервису-генератору программный доступ к возможностям Google LLM. Обновите файл main.py следующим образом:

Обязательно замените «ВАШ_ПРОЕКТ» фактическим идентификатором проекта.

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, ознакомьтесь с лабораторной работой по написанию кода «Разработка для разработки за три простых шага с Cloud Run» .

Разверните свое приложение в Cloud Run

Cloud Run — это региональная служба. Это означает, что инфраструктура, на которой работают ваши службы Cloud Run, расположена в определенном регионе и управляется Google, чтобы обеспечить резервную доступность во всех зонах этого региона. Для простоты в этой лабораторной работе мы будем использовать жестко запрограммированный регион us-central1 .

Мы собираемся использовать так называемый buildpack для автоматической генерации вашего контейнера. Создайте новый файл с именем Procfile в Cloud Editor и вставьте одну строку текста:

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 , что вы хотите, чтобы она использовала пакеты сборки для создания образа контейнера на основе исходных файлов, которые она находит в текущем каталоге ( dot в --source . является сокращением текущего каталога). Поскольку служба неявно заботится об образе контейнера, вам не нужно указывать изображение в этой команде 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

Эта ссылка представляет собой выделенный URL-адрес с защитой TLS для вашего сервиса Cloud Run. Эта ссылка является постоянной (до тех пор, пока вы не отключите свою службу) и ее можно использовать в любом месте в Интернете. Он не использует упомянутый ранее механизм прокси-сервера Cloud Shell, который зависел от временной виртуальной машины.

Нажмите на выделенный Service URL , чтобы открыть вкладку веб-браузера для работающего приложения. Убедитесь, что результат такой же, как тот, который вы видели в своей среде разработки. Также убедитесь, что вы можете настроить созданный тест, указав параметры в конце URL-адреса.

Поздравляем! Ваше приложение теперь работает в облаке Google. Даже не задумываясь об этом, ваше приложение становится общедоступным, с шифрованием TLS (HTTPS) и автоматическим масштабированием до ошеломляющего уровня трафика.

9. Собираем все части вместе

9927db1725bcd5d6.png

На этом последнем этапе мы готовы запустить генератор викторин как часть приложения Quizaic. Посетите URL-адрес викторины , войдите в свою учетную запись Google и перейдите на вкладку Create Quiz . Выберите тип генератора Custom , вставьте URL-адрес Cloud Run в поле URL-адреса, заполните другие обязательные поля и отправьте форму.

328ee05579ea05f9.png

Через несколько минут у вас должен появиться новый тест (см. «Мой новый тест» на изображении ниже) с миниатюрным изображением, созданным искусственным интеллектом, которое вы можете редактировать, воспроизводить, клонировать или удалять с помощью соответствующих кнопок. Этот новый тест был создан с использованием только что развернутого вами веб-сервиса на основе шаблонного приглашения!

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?

Ответ, конечно, ноль. :)

Другие кодовые лаборатории, которые стоит проверить...

Справочные документы...

12. Призыв к действию

Если вам понравилась эта лаборатория кода и вы, вероятно, будете уделять больше времени практическому использованию Google Cloud, тогда вам действительно стоит присоединиться к Google Cloud Innovators уже сегодня!

498cab7d87ec12d3.png

Google Cloud Innovators бесплатна и включает в себя:

  • Живые дискуссии , конференции AMA и сеансы планов действий, позволяющие узнавать последние новости непосредственно от сотрудников Google.
  • последние новости Google Cloud прямо в вашем почтовом ящике
  • Цифровой бейдж и фон видеоконференции
  • 500 кредитов лабораторных исследований и обучения в программе Skills Boost

Нажмите здесь , чтобы зарегистрироваться!