1. Введение
В этой лабораторной работе вы создадите веб-сервис для генерации викторин и интегрируете его в увлекательное, работающее приложение. Вы будете использовать другой язык программирования, чем тот, который, возможно, использовали раньше: английский!
Что вы будете делать...
- Вам предстоит создать подсказку, которая сгенерирует викторину на основе заданных критериев.
- Вам предстоит создать простое веб-приложение и убедиться, что оно работает должным образом в вашей среде разработки.
- Вы будете постепенно добавлять логику в свое веб-приложение, чтобы превратить его в API-сервер, генерирующий викторины в соответствии с набором входных параметров.
- Вы увидите, как легко развернуть сервис генерации викторин в облаке с помощью Google Cloud Run.
- Наконец, вы настроите реальное приложение ( quizaic.com ) для использования развернутого вами сервиса генерации викторин, и сможете играть в викторины в режиме реального времени на основе полученных результатов.
Что вы узнаете...
- Как создать шаблон запроса для большой языковой модели (LLM).
- Как создать простое веб-серверное приложение на Python.
- Как добавить поддержку Google LLM в ваше веб-приложение.
- Как развернуть приложение в облаке, чтобы любой желающий мог опробовать ваше новое творение.
- Как интегрировать генератор викторин в более крупное приложение.
Что вам понадобится...
- Веб-браузер Chrome
- Аккаунт Google
- Облачный проект с включенной функцией выставления счетов.
Этот практический урок предназначен для разработчиков всех уровней, включая начинающих. Хотя вы будете использовать Python, вам не обязательно быть знакомым с программированием на Python, чтобы понять происходящее, потому что мы сами объясним весь код, который вы увидите.
2. Настройка

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



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

Активировать Cloud Shell
- В консоли Cloud нажмите «Активировать Cloud Shell» .
.

Если вы запускаете Cloud Shell впервые, вам будет показан промежуточный экран с описанием его возможностей. Если вам был показан промежуточный экран, нажмите «Продолжить» .

Подготовка и подключение к Cloud Shell займут всего несколько минут.

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, ваша работа в этом практическом задании может быть выполнена с помощью браузера.
После подключения к Cloud Shell вы увидите, что прошли аутентификацию и что проект настроен на ваш идентификатор проекта.
- Выполните следующую команду в 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
- Уровень сложности: средний
- Язык: английский
Нажмите кнопку «Отправить», чтобы увидеть результат.
Как показано на следующем снимке экрана, правая панель позволяет выбрать нужную модель и точно настроить некоторые параметры:

Доступны следующие настройки:
- Регион — это место, где должен выполняться ваш запрос на генерацию.
- В разделе «Модель» вы выбираете, какую большую языковую модель вы хотите использовать. Для этого практического занятия используйте модель "gemini-1.0-pro-001".
- Температура регулирует степень случайности при выборе токенов. Более низкие температуры подходят для запросов, ожидающих истинного или правильного ответа, в то время как более высокие температуры могут привести к более разнообразным или неожиданным результатам.
- Параметр «Ограничение на количество токенов» определяет максимальный объем текста, выводимого из одного запроса. Один токен примерно равен четырем символам. Значение по умолчанию — 1024.
- Параметр top-k изменяет способ выбора токенов для выходных данных. Значение top-k, равное 1, означает, что выбранный токен является наиболее вероятным среди всех токенов в словаре модели (также называемое жадным декодированием), а значение top-k, равное 3, означает, что следующий токен выбирается из числа 3 наиболее вероятных токенов (используя температуру). Значение top-k по умолчанию равно 40.
- Параметр Top-p изменяет способ выбора токенов для выходных данных. Токены выбираются от наиболее вероятных к наименее вероятным до тех пор, пока сумма их вероятностей не сравняется со значением Top-p.
- Max responses — это максимальное количество ответов модели, генерируемых на один запрос.
- Стоп-последовательность — это серия символов (включая пробелы), которая останавливает генерацию ответа, если модель её встречает.
- Функция потоковой передачи ответов позволяет выбрать, следует ли выводить ответы по мере их генерации или сохранять их, а также отображать их после завершения.
- Пороговое значение фильтра безопасности регулирует вероятность появления реакций, которые могут быть опасными.
Если у вас есть запрос, который, кажется, генерирует приемлемый тест в соответствии с указанными выше требованиями, мы могли бы обработать этот тест с помощью пользовательского кода, но разве не было бы лучше, если бы 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 в правом верхнем углу страницы, чтобы увидеть код на Python, который можно использовать для программной отправки вашего задания в Vertex AI LLM. Если вас интересует использование другого языка программирования, помимо Python, ознакомьтесь с информацией по ссылке https://cloud.google.com/vertex-ai/docs/samples?text=generative .
4. Создайте простой веб-сервер

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

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

Вы можете переключаться между редактором и терминалом, нажимая кнопки « Open Editor и Open Terminal соответственно. Попробуйте переключиться между этими двумя средами прямо сейчас.
Далее создайте папку для хранения ваших работ по этой лабораторной работе, нажав кнопку «Добавить папку».
Введите 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
Вам не нужно сохранять этот файл вручную, поскольку облачный редактор автоматически сохранит изменения.
Используя тот же метод, создайте еще один новый файл с именем 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)
Теперь перезагрузите текущую вкладку веб-браузера, чтобы увидеть результаты. На этот раз вы должны увидеть «Генератор викторин» вместе с параметром запроса, автоматически добавленным к вашему URL ( authuser ). Попробуйте добавить два дополнительных параметра, добавив строку «`¶m1=val1¶m2=val2`» в конец URL в адресной строке браузера, перезагрузите страницу, и вы должны увидеть что-то подобное:

Теперь, когда мы рассмотрели, как отправлять и анализировать параметры запроса в 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-адрес, чтобы задать значения для различных параметров. Например, попробуйте добавить суффикс " ?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French " в конец URL-адреса в адресной строке:

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)
Теперь обновите текущую вкладку веб-браузера, чтобы увидеть результаты. Вы должны увидеть страницу, похожую на следующую:

Попробуйте изменить URL-адрес, чтобы внести изменения в эти четыре параметра.
7. Добавьте клиентскую библиотеку Vertex AI.
Теперь мы готовы использовать клиентскую библиотеку Vertex AI для Python для генерации вашего теста. Это автоматизирует интерактивные подсказки, которые вы использовали на шаге №3, и предоставит вашему сервису генерации программный доступ к возможностям LLM от Google. Обновите файл main.py следующим образом:
Обязательно замените "YOUR_PROJECT" на фактический идентификатор вашего проекта.
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. В облако!

Теперь, когда вы создали собственный генератор викторин, вам захочется поделиться этой замечательной вещью со всем миром, поэтому пришло время развернуть его в облаке. Но вам бы хотелось сделать больше, чем просто поделиться им. Вы бы хотели убедиться, что он:
- Работает надежно — обеспечивается автоматическая отказоустойчивость в случае сбоя компьютера, на котором запущено ваше приложение.
- Автоматическое масштабирование — ваше приложение будет справляться с огромными объемами трафика и автоматически уменьшать свой объем занимаемой памяти, когда не используется.
- Это минимизирует ваши затраты, поскольку не взимает плату за ресурсы, которые вы не используете — с вас взимается плата только за ресурсы, потребленные во время обработки трафика.
- Доступ к сервису осуществляется через собственное доменное имя — у вас есть возможность назначить вашему сервису собственное доменное имя одним щелчком мыши.
- Обеспечивает отличное время отклика — холодные запуски достаточно быстрые, но это можно точно настроить, указав минимальную конфигурацию экземпляра.
- Поддерживает сквозное шифрование с использованием стандартной веб-безопасности 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 , что вы хотите использовать buildpacks для создания образа контейнера на основе исходных файлов, найденных в текущем каталоге ( 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. Собираем все кусочки воедино
На заключительном этапе мы готовы запустить ваш генератор викторин в рамках приложения Quizaic. Перейдите по ссылке Quizaic , войдите в свою учетную запись Google и перейдите на вкладку Create Quiz . Выберите тип генератора Custom , вставьте URL-адрес вашего Cloud Run в поле URL, заполните остальные обязательные поля и отправьте форму.

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

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. Ты это сделал!

Поздравляем! Вы успешно создали задание для магистерской диссертации и развернули микросервис Cloud Run, используя это задание. Теперь вы можете программировать на естественном языке и делиться своими творениями со всем миром!
В заключение я хочу задать вам один важный вопрос:
После того, как ваше приложение заработало в среде разработки, сколько строк кода вам пришлось изменить, чтобы развернуть его в облаке со всеми функциями Cloud Run, предназначенными для производственной среды?
Ответ, конечно же, ноль. :)
Другие курсы по программированию, которые стоит посмотреть...
- От разработки до продакшена за три простых шага с Cloud Run
- Приложение для суммирования текста с использованием Vertex AI и Svelte Kit.
- Приложение для чата с API PaLM на облачной платформе.
- Облачная функция, которая является оболочкой для моделей PaLM Text Bison.
- Преобразование данных в генеративный ИИ с помощью Spanner и Vertex AI Imagen API
Справочные документы...
12. Призыв к действию
Если вам понравился этот практический урок и вы планируете проводить больше времени за работой с Google Cloud, то вам обязательно стоит присоединиться к программе Google Cloud Innovators уже сегодня!

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