Codelab — создайте контекстное рекомендательное приложение для поз йоги с помощью Firestore, Vector Search, Langchain и Gemini (версия Python)

1. Введение

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

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

  1. Используйте существующий набор данных «Обнимающие лица» с позами йоги (в формате JSON).
  2. Дополните набор данных описанием поля, используя Gemini для генерации описаний каждой из поз.
  3. Используйте Langchain для создания документа, а интеграцию Firestore с Langchain — для создания коллекции и встраивания данных в Firestore.
  4. Создайте составной индекс в Firestore для обеспечения возможности векторного поиска.
  5. Используйте векторный поиск в приложении Flask, который объединяет все необходимые инструменты, как показано ниже:

84e1cbf29cbaeedc.png

Что вы будете делать

  • Разработать, создать и развернуть веб-приложение, использующее векторный поиск для рекомендации поз йоги.

Что вы узнаете

  • Как использовать Gemini для генерации текстового контента и, в контексте этого практического занятия, для создания описаний поз йоги.
  • Как использовать Langchain Document Loader для Firestore для загрузки записей из расширенного набора данных Hugging Face в Firestore вместе с векторными представлениями.
  • Как использовать Langchain Vector Store для Firestore для поиска данных на основе запроса на естественном языке.
  • Как использовать API Google Cloud Text to Speech для генерации аудиоконтента

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

  • Веб-браузер Chrome
  • Аккаунт Gmail
  • Облачный проект с включенной функцией выставления счетов.

Этот практический урок, разработанный для разработчиков всех уровней (включая начинающих), использует Python в качестве примера приложения. Однако знание Python не требуется для понимания представленных концепций.

2. Прежде чем начать

Создать проект

  1. В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
  2. Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .
  3. Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud и поставляемую с предустановленным bq. Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud.

Изображение кнопки «Активировать Cloud Shell»

  1. После подключения к Cloud Shell необходимо проверить, прошли ли вы аутентификацию и установлен ли идентификатор вашего проекта, используя следующую команду:
gcloud auth list
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте.
gcloud config list project
  1. Если ваш проект не задан, используйте следующую команду для его установки:
gcloud config set project <YOUR_PROJECT_ID>
  1. Включите необходимые API с помощью команды, указанной ниже. Это может занять несколько минут, поэтому, пожалуйста, наберитесь терпения.
gcloud services enable firestore.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudfunctions.googleapis.com \
                       aiplatform.googleapis.com \
                       texttospeech.googleapis.com

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

Operation "operations/..." finished successfully.

Альтернативой команде gcloud является поиск каждого продукта в консоли или использование этой ссылки .

Если какой-либо API отсутствует, вы всегда можете включить его в процессе реализации.

Для получения информации о командах gcloud и их использовании обратитесь к документации .

Клонируйте репозиторий и настройте параметры среды.

Следующий шаг — клонирование репозитория с примерами кода, на который мы будем ссылаться в остальной части практического занятия. Предполагая, что вы находитесь в Cloud Shell, выполните следующую команду из своей домашней директории:

git clone https://github.com/rominirani/yoga-poses-recommender-python

Чтобы запустить редактор, нажмите «Открыть редактор» на панели инструментов окна Cloud Shell. Щелкните строку меню в верхнем левом углу и выберите «Файл» → «Открыть папку», как показано ниже:

66221fd0d0e5202f.png

Выберите папку yoga-poses-recommender-python , и вы увидите открывшуюся папку со следующими файлами, как показано ниже:

44699efc7fb1b911.png

Теперь нам нужно настроить переменные среды, которые мы будем использовать. Щелкните файл config.template.yaml , и вы увидите его содержимое, как показано ниже:

project_id: your-project-id
location: us-central1
gemini_model_name: gemini-1.5-flash-002
embedding_model_name: text-embedding-004
image_generation_model_name: imagen-3.0-fast-generate-002
database: (default)
collection: poses
test_collection: test-poses
top_k: "3"

Пожалуйста, обновите значения project_id и location в соответствии с тем, что вы выбрали при создании проекта Google Cloud и региона базы данных Firestore. В идеале значения location должны быть одинаковыми для проекта Google Cloud и базы данных Firestore, например, us-central1 .

Для целей этого практического занятия мы будем использовать предварительно настроенные значения (за исключением, конечно, project_id и location , которые вам необходимо установить в соответствии с вашей конфигурацией).

Пожалуйста, сохраните этот файл как config.yaml в той же папке, что и файл config.template.yaml .

Теперь последний шаг — создание локальной среды Python со всеми необходимыми зависимостями. Подробную информацию об этом можно найти в файле pyproject.toml , содержимое которого показано ниже:

dependencies = [
    "datasets>=3.2.0",
    "flask>=3.1.0",
    "google-cloud-aiplatform>=1.78.0",
    "google-cloud-texttospeech>=2.24.0",
    "langchain-community>=0.3.15",
    "langchain-core>=0.3.31",
    "langchain-google-community>=2.0.4",
    "langchain-google-firestore>=0.5.0",
    "langchain-google-vertexai>=2.0.7",
    "pydantic-settings>=2.7.1",
    "pyyaml>=6.0.2",
    "tenacity>=9.0.0",
]

Эти зависимости уже зафиксированы по версии в файле requirements.txt . Вкратце, нам нужно создать виртуальную среду Python с зависимостями пакетов Python из файла requirements.txt , которые будут установлены в этой виртуальной среде. Для этого перейдите в Command Palette (Ctrl+Shift+P) в IDE Cloud Shell и введите Python: Create Environment . Выполните следующие несколько шагов, чтобы выбрать Virtual Environment(venv) , Python 3.x interpreter и файл requirements.txt .

После создания среды нам потребуется активировать её с помощью следующей команды.

source .venv/bin/activate

В консоли вы должны увидеть (.venv). Например: -> (.venv) yourusername@cloudshell:

Отлично! Теперь мы готовы приступить к настройке базы данных Firestore.

3. Настройка Firestore

Cloud Firestore — это полностью управляемая бессерверная база данных документов, которую мы будем использовать в качестве бэкэнда для данных нашего приложения. Данные в Cloud Firestore структурированы в виде коллекций документов .

Инициализация базы данных Firestore

Перейдите на страницу Firestore в консоли Cloud.

Если вы ранее не инициализировали базу данных Firestore в проекте, создайте базу данных default , нажав кнопку Create Database . При создании базы данных используйте следующие значения:

  • Режим Firestore: Native.
  • Выберите тип местоположения Region и укажите местоположение us-central1 в качестве региона.
  • Для правил безопасности используйте Test rules .
  • Создайте базу данных.

61d0277510803c8d.png

В следующем разделе мы заложим основу для создания коллекции с именем poses в нашей базе данных Firestore по умолчанию. Эта коллекция будет содержать примеры данных (документы) или информацию о позах йоги, которые мы затем будем использовать в нашем приложении.

На этом завершается раздел по настройке базы данных Firestore.

4. Подготовьте набор данных по позам йоги.

Наша первая задача — подготовить набор данных «Позы йоги», который мы будем использовать в приложении. Мы начнем с существующего набора данных «Обнимающее лицо», а затем дополним его дополнительной информацией.

Ознакомьтесь с набором данных «Обнимающее лицо» для поз йоги . Обратите внимание, что хотя в этом практическом занятии используется один из наборов данных, вы можете использовать любой другой набор данных и следовать тем же методам, которые были продемонстрированы для улучшения этого набора данных.

298cfae7f23e4bef.png

Если мы перейдем в раздел Files and versions , мы сможем получить JSON-файл с данными для всех поз.

3fe6e55abdc032ec.png

Мы скачали файл yoga_poses.json и предоставили его вам. Этот файл называется yoga_poses_alldata.json и находится в папке /data .

В редакторе Cloud Shell перейдите к файлу data/yoga_poses.json и посмотрите список JSON-объектов, где каждый JSON-объект представляет собой позу йоги. Всего у нас 3 записи, пример одной из которых показан ниже:

{
   "name": "Big Toe Pose",
   "sanskrit_name": "Padangusthasana",
   "photo_url": "https://pocketyoga.com/assets/images/full/ForwardBendBigToe.png",
   "expertise_level": "Beginner",
   "pose_type": ["Standing", "Forward Bend"]
 }

Сейчас у нас есть прекрасная возможность представить Gemini и показать, как мы можем использовать саму модель по умолчанию для генерации поля description .

В редакторе Cloud Shell перейдите к файлу generate-descriptions.py . Содержимое этого файла показано ниже:

import json
import time
import logging
import vertexai
from langchain_google_vertexai import VertexAI
from tenacity import retry, stop_after_attempt, wait_exponential
from settings import get_settings

settings = get_settings()
logging.basicConfig(
    level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
)
# Initialize Vertex AI SDK
vertexai.init(project=settings.project_id, location=settings.location)
logging.info("Done Initializing Vertex AI SDK")


@retry(
    stop=stop_after_attempt(5),
    wait=wait_exponential(multiplier=1, min=4, max=10),
)
def generate_description(pose_name, sanskrit_name, expertise_level, pose_types):
    """Generates a description for a yoga pose using the Gemini API."""

    prompt = f"""
    Generate a concise description (max 50 words) for the yoga pose: {pose_name}
    Also known as: {sanskrit_name}
    Expertise Level: {expertise_level}
    Pose Type: {", ".join(pose_types)}

    Include key benefits and any important alignment cues.
    """
    try:
        model = VertexAI(model_name=settings.gemini_model_name, verbose=True)
        response = model.invoke(prompt)
        return response
    except Exception as e:
        logging.info(f"Error generating description for {pose_name}: {e}")
        return ""


def add_descriptions_to_json(input_file, output_file):
    """Loads JSON data, adds descriptions, and saves the updated data."""

    with open(input_file, "r") as f:
        yoga_poses = json.load(f)

    total_poses = len(yoga_poses)
    processed_count = 0

    for pose in yoga_poses:
        if pose["name"] != " Pose":
            start_time = time.time()  # Record start time
            pose["description"] = generate_description(
                pose["name"],
                pose["sanskrit_name"],
                pose["expertise_level"],
                pose["pose_type"],
            )
            end_time = time.time()  # Record end time

            processed_count += 1
            end_time = time.time()  # Record end time
            time_taken = end_time - start_time
            logging.info(
                f"Processed: {processed_count}/{total_poses} - {pose['name']} ({time_taken:.2f} seconds)"
            )

        else:
            pose["description"] = ""
            processed_count += 1
            logging.info(
                f"Processed: {processed_count}/{total_poses} - {pose['name']} ({time_taken:.2f} seconds)"
            )
        # Adding a delay to avoid rate limit
        time.sleep(30)

    with open(output_file, "w") as f:
        json.dump(yoga_poses, f, indent=2)


def main():
    # File paths
    input_file = "./data/yoga_poses.json"
    output_file = "./data/yoga_poses_with_descriptions.json"

    # Add descriptions and save the updated JSON
    add_descriptions_to_json(input_file, output_file)


if __name__ == "__main__":
    main()

Это приложение добавит новое поле description к каждой записи JSON с позой йоги. Оно получит описание, обратившись к модели Gemini, которая предоставит ему необходимую подсказку. Поле будет добавлено в JSON-файл, и новый файл будет записан в data/yoga_poses_with_descriptions.json .

Давайте рассмотрим основные этапы:

  1. В функции main() вы обнаружите, что она вызывает функцию add_descriptions_to_json и предоставляет ожидаемые входной и выходной файлы.
  2. Функция add_descriptions_to_json выполняет следующие действия для каждой записи JSON, например, информации о публикации по йоге:
  3. Он извлекает pose_name , sanskrit_name , expertise_level и pose_types .
  4. Он вызывает функцию generate_description, которая формирует запрос, а затем вызывает класс модели Langchain VertexAI для получения текста ответа.
  5. Затем этот ответный текст добавляется в JSON-объект.
  6. Обновленный JSON-список объектов затем записывается в целевой файл.

Давайте запустим это приложение. Откройте новое окно терминала (Ctrl+Shift+C) и введите следующую команду:

python generate-descriptions.py

Если вас попросят предоставить какое-либо разрешение, пожалуйста, сделайте это.

Вы увидите, что приложение начнет выполняться. Мы добавили задержку в 30 секунд между записями, чтобы избежать ограничений скорости запросов, которые могут возникнуть в новых учетных записях Google Cloud, поэтому, пожалуйста, наберитесь терпения.

Ниже представлен пример запуска программы в процессе выполнения:

8e830d9ea9b6c60.png

После того, как все 3 записи будут дополнены с помощью вызова Gemini, будет сгенерирован файл data/yoga_poses_with_description.json . Вы можете ознакомиться с ним.

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

5. Импортируйте данные в Firestore и сгенерируйте векторные представления.

У нас есть файл data/yoga_poses_with_description.json , и теперь нам нужно заполнить им базу данных Firestore, а главное — сгенерировать векторные представления для каждой записи. Векторные представления пригодятся позже, когда нам потребуется выполнить поиск сходства между ними и пользовательским запросом, предоставленным на естественном языке.

Для реализации описанного выше процесса мы будем использовать компоненты Langchain Firestore .

Для этого потребуется выполнить следующие действия:

  1. Мы преобразуем список JSON-объектов в список объектов Langchain Document . Каждый документ будет иметь два атрибута: page_content и metadata . Объект metadata будет содержать весь JSON-объект с такими атрибутами, как name , description , sanskrit_name и т. д. page_content будет представлять собой текстовую строку, являющуюся конкатенацией нескольких полей.
  2. Получив список объектов Document , мы воспользуемся классом FirestoreVectorStore Langchain, а именно методом from_documents , и укажем этот список документов, имя коллекции (мы используем переменную TEST_COLLECTION , указывающую на test-poses ), класс встраивания Vertex AI и данные для подключения к Firestore ( PROJECT_ID и имя DATABASE ). Это создаст коллекцию и сгенерирует поле embedding для каждого из атрибутов.

Ниже приведён код файла import-data.py (для краткости некоторые части кода сокращены):

... 

def create_langchain_documents(poses):
   """Creates a list of Langchain Documents from a list of poses."""
   documents = []
   for pose in poses:
       # Convert the pose to a string representation for page_content
       page_content = (
           f"name: {pose.get('name', '')}\n"
           f"description: {pose.get('description', '')}\n"
           f"sanskrit_name: {pose.get('sanskrit_name', '')}\n"
           f"expertise_level: {pose.get('expertise_level', 'N/A')}\n"
           f"pose_type: {pose.get('pose_type', 'N/A')}\n"
       ).strip()
       # The metadata will be the whole pose
       metadata = pose

       document = Document(page_content=page_content, metadata=metadata)
       documents.append(document)
   logging.info(f"Created {len(documents)} Langchain documents.")
   return documents

def main():
    all_poses = load_yoga_poses_data_from_local_file(
        "./data/yoga_poses_with_descriptions.json"
    )
    documents = create_langchain_documents(all_poses)
    logging.info(
        f"Successfully created langchain documents. Total documents: {len(documents)}"
    )

    embedding = VertexAIEmbeddings(
        model_name=settings.embedding_model_name,
        project=settings.project_id,
        location=settings.location,
    )

    client = firestore.Client(project=settings.project_id, database=settings.database)

    vector_store = FirestoreVectorStore.from_documents(
        client=client,
        collection=settings.test_collection,
        documents=documents,
        embedding=embedding,
    )
    logging.info("Added documents to the vector store.")


if __name__ == "__main__":
    main()

Давайте запустим это приложение. Откройте новое окно терминала (Ctrl+Shift+C) и введите следующую команду:

python import-data.py

Если всё пройдёт гладко, вы увидите сообщение, похожее на приведённое ниже:

2025-01-21 14:50:06,479 - INFO - Added documents to the vector store.

Чтобы проверить, были ли записи успешно вставлены и сгенерированы ли эмбеддинги, перейдите на страницу Firestore в консоли Cloud.

504cabdb99a222a5.png

Щёлкните по базе данных (по умолчанию), это отобразит коллекцию test-poses и несколько документов в этой коллекции. Каждый документ представляет собой одну позу йоги.

d0708499e403aebc.png

Щелкните по любому из документов, чтобы изучить поля. В дополнение к импортированным нами полям вы также найдете поле embedding , которое представляет собой векторное поле, автоматически сгенерированное для вас с помощью класса Langchain VertexAIEmbeddings , который мы использовали, предоставив модель text-embedding-004 Vertex AI Embedding.

d67113e2dc63cd6b.png

Теперь, когда записи загружены в базу данных Firestore с уже созданными векторными представлениями, мы можем перейти к следующему шагу и посмотреть, как выполнить поиск векторного сходства в Firestore.

6. Импортируйте полные позы йоги в коллекцию базы данных Firestore.

Теперь мы создадим коллекцию poses , которая представляет собой полный список из 160 поз йоги. Для этого мы сгенерировали файл импорта в базу данных, который вы можете импортировать напрямую. Это сделано для экономии времени в лаборатории. Процесс генерации базы данных, содержащей описание и векторные представления, тот же, что мы рассматривали в предыдущем разделе.

Импортируйте базу данных, выполнив следующие действия:

  1. Создайте хранилище (bucket) в вашем проекте с помощью приведенной ниже команды gsutil . Замените переменную <PROJECT_ID> в приведенной ниже команде на идентификатор вашего проекта Google Cloud.
gsutil mb -l us-central1 gs://<PROJECT_ID>-my-bucket
  1. Теперь, когда бакет создан, нам нужно скопировать подготовленный экспорт базы данных в этот бакет, прежде чем мы сможем импортировать его в базу данных Firebase. Используйте приведенную ниже команду:
gsutil cp -r gs://yoga-database-firestore-export-bucket/2025-01-27T05:11:02_62615  gs://<PROJECT_ID>-my-bucket

Теперь, когда у нас есть данные для импорта, мы можем перейти к заключительному шагу — импорту данных в созданную нами базу данных Firebase ( default ).

  1. Воспользуйтесь приведенной ниже командой gcloud:
gcloud firestore import gs://<PROJECT_ID>-my-bucket/2025-01-27T05:11:02_62615

Импорт займет несколько секунд, и как только он будет готов, вы сможете проверить свою базу данных Firestore и коллекцию, перейдя по ссылке https://console.cloud.google.com/firestore/databases , выбрав базу данных default и коллекцию poses , как показано ниже:

a8f5a6ba69bec69b.png

На этом завершается создание коллекции Firestore, которую мы будем использовать в нашем приложении.

7. Выполните поиск векторного сходства в Firestore.

Для выполнения поиска по векторному сходству мы будем использовать запрос пользователя. Примером такого запроса может быть: "Suggest me some exercises to relieve back pain" .

Взгляните на файл search-data.py . Ключевая функция, на которую следует обратить внимание, — это функция поиска, показанная ниже. В общих чертах, она создает класс встраивания, который будет использоваться для генерации встраивания для пользовательского запроса. Затем она использует класс FirestoreVectorStore для вызова своей функции similarity_search .

def search(query: str):
    """Executes Firestore Vector Similarity Search"""
    embedding = VertexAIEmbeddings(
        model_name=settings.embedding_model_name,
        project=settings.project_id,
        location=settings.location,
    )

    client = firestore.Client(project=settings.project_id, database=settings.database)

    vector_store = FirestoreVectorStore(
        client=client, collection=settings.collection, embedding_service=embedding
    )

    logging.info(f"Now executing query: {query}")
    results: list[Document] = vector_store.similarity_search(
        query=query, k=int(settings.top_k), include_metadata=True
    )
    for result in results:
        print(result.page_content)

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

Ниже приведена команда gcloud для создания составного индекса:

gcloud firestore indexes composite create --project=<YOUR_PROJECT_ID> --collection-group=poses --query-scope=COLLECTION --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding

Создание индекса займет несколько минут, так как в базе данных содержится более 150 записей. После завершения вы сможете просмотреть индекс с помощью команды, показанной ниже:

gcloud firestore indexes composite list

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

Попробуйте выполнить следующую команду прямо сейчас:

python search-data.py --prompt "Recommend me some exercises for back pain relief"

Вам будет предоставлено несколько рекомендаций. Пример выполнения показан ниже:

2025-01-21 15:48:51,282 - INFO - Now executing query: Recommend me some exercises for back pain relief
name: Supine Spinal Twist Pose
description: A gentle supine twist (Supta Matsyendrasana), great for beginners.  Releases spinal tension, improves digestion, and calms the nervous system.  Keep shoulders flat on the floor and lengthen the spine.

sanskrit_name: Supta Matsyendrasana
expertise_level: Beginner
pose_type: ['Supine', 'Twist']
name: Cow Pose
description: Cow Pose (Bitilasana) is a gentle backbend, stretching the chest, shoulders, and abdomen.  Maintain a neutral spine, lengthen the tailbone, and avoid hyperextension.  Benefits include improved posture and stress relief.

sanskrit_name: Bitilasana
expertise_level: Beginner
pose_type: ['Arm Leg Support', 'Back Bend']
name: Locust I Pose
description: Locust Pose I (Shalabhasana A) strengthens the back, glutes, and shoulders.  Lie prone, lift chest and legs simultaneously, engaging back muscles.  Keep hips grounded and gaze slightly forward.

sanskrit_name: Shalabhasana A
expertise_level: Intermediate
pose_type: ['Prone', 'Back Bend']

После того, как мы это настроили, мы поняли, как работать с векторной базой данных Firestore для загрузки записей, генерации векторных представлений и выполнения поиска векторного сходства. Теперь мы можем создать веб-приложение, которое интегрирует векторный поиск в веб-интерфейс.

8. Веб-приложение

Веб-приложение Python Flask находится в файле main.py , а HTML-файл интерфейса расположен в templates/index.html.

Рекомендуется ознакомиться с обоими файлами. Начните с файла main.py , который содержит обработчик /search , принимающий запрос, переданный из HTML-файла index.html на стороне клиента. Затем он вызывает метод search, который выполняет поиск по векторному сходству, рассмотренный в предыдущем разделе.

Затем ответ отправляется обратно в index.html со списком рекомендаций. После этого index.html отображает рекомендации в виде различных карточек.

Запустите приложение локально.

Откройте новое окно терминала (Ctrl+Shift+C) или любое существующее окно терминала и введите следующую команду:

python main.py

Пример выполнения показан ниже:

 * Serving Flask app 'main'
 * Debug mode: on
2025-01-21 16:02:37,473 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:8080
 * Running on http://10.88.0.4:8080
2025-01-21 16:02:37,473 - INFO - Press CTRL+C to quit
2025-01-21 16:02:37,474 - INFO -  * Restarting with stat
2025-01-21 16:02:41,462 - WARNING -  * Debugger is active!
2025-01-21 16:02:41,484 - INFO -  * Debugger PIN: 440-653-555

После запуска приложения перейдите по его основному URL-адресу, нажав кнопку «Предварительный просмотр веб-страницы», расположенную ниже:

de297d4cee10e0bf.png

В результате вы должны увидеть файл index.html , как показано ниже:

20240a0e885ac17b.png

Введите пример запроса (например: Provide me some exercises for back pain relief ») и нажмите кнопку Search . Это должно вывести несколько рекомендаций из базы данных. Вы также увидите кнопку Play Audio , которая сгенерирует аудиопоток на основе описания, который вы сможете прослушать напрямую.

789b4277dc40e2be.png

9. (Необязательно) Развертывание в Google Cloud Run

Наш заключительный шаг — развертывание этого приложения в Google Cloud Run. Команда развертывания показана ниже; перед развертыванием убедитесь, что вы заменили значения переменной (<<YOUR_PROJECT_ID>>) на значения, специфичные для вашего проекта. Эти значения вы сможете получить из файла config.yaml .

gcloud run deploy yogaposes --source . \
  --port=8080 \
  --allow-unauthenticated \
  --region=us-central1 \
  --platform=managed  \
  --project=<<YOUR_PROJECT_ID>> \
  --env-vars-file=config.yaml

Выполните указанную выше команду из корневой папки приложения. Вас также могут попросить включить API Google Cloud; подтвердите предоставление различных разрешений, пожалуйста, сделайте это.

Процесс развертывания займет примерно 5-7 минут, поэтому, пожалуйста, наберитесь терпения.

3a6d86fd32e4a5e.png

После успешного развертывания в выходных данных будет указан URL-адрес службы Cloud Run. Он будет иметь следующий формат:

Service URL: https://yogaposes-<<UNIQUEID>.us-central1.run.app

Перейдите по указанному общедоступному URL-адресу, и вы увидите, что то же самое веб-приложение развернуто и успешно работает.

84e1cbf29cbaeedc.png

Вы также можете зайти в Cloud Run из консоли Google Cloud и увидеть список сервисов Cloud Run. Сервис yogaposes должен быть одним из перечисленных (если не единственным).

f2b34a8c9011be4c.png

Вы можете просмотреть подробную информацию о сервисе, такую ​​как URL-адрес, конфигурации, журналы и многое другое, щелкнув по названию конкретного сервиса (в нашем случае yogaposes ).

faaa5e0c02fe0423.png

На этом завершается разработка и развертывание нашего веб-приложения для рекомендаций поз йоги на платформе Cloud Run.

10. Поздравляем!

Поздравляем, вы успешно создали приложение, которое загружает набор данных в Firestore, генерирует векторные представления и выполняет поиск векторного сходства на основе запроса пользователя.

Справочная документация