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 для поиска данных на основе запроса на естественном языке
  • Как использовать Google Cloud Text to Speech API для создания аудиоконтента

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

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

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

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

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

  1. В Google Cloud Console на странице выбора проекта выберите или создайте проект 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 Project и базы данных Firestore. В идеале нам бы хотелось, чтобы значения location были одинаковыми для проекта Google Cloud и базы данных Firestore, например, us-central1 .

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

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

Последний шаг — создать среду Python, которую мы будем использовать локально со всеми настроенными для нас зависимостями 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) в Cloud Shell IDE и введите 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 в облачной консоли.

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

  • Режим Firestore: Native.
  • Местоположение: используйте настройки местоположения по умолчанию.
  • В разделе «Правила безопасности» выберите Test rules .
  • Создайте базу данных.

504cabdb99a222a5.png

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

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

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

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

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

298cfae7f23e4bef.png

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

3fe6e55abdc032ec.png

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

Перейдите к файлу data/yoga_poses.json в редакторе Cloud Shell и просмотрите список объектов 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, т. е. информации о публикации Yoga:
  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

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

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

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

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

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

Шаги для этого будут следующими:

  1. Мы преобразуем список объектов JSON в список объектов документа Langchain . Каждый документ будет иметь два атрибута: page_content и metadata . Объект метаданных будет содержать весь объект JSON с такими атрибутами, как name , description , sanskrit_name и т. д. page_content будет строковым текстом, представляющим собой объединение нескольких полей.
  2. Как только у нас будет список объектов Document , мы будем использовать класс FirestoreVectorStore Langchain и, в частности, метод from_documents с этим списком документов, именем коллекции (мы используем переменную TEST_COLLECTION , которая указывает на test-poses ), класс Vertex AI Embedding и детали подключения 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 в облачной консоли.

504cabdb99a222a5.png

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

d0708499e403aebc.png

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

d67113e2dc63cd6b.png

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

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

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

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

  1. Создайте корзину в своем проекте с помощью команды 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

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

Процесс развертывания займет около 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, генерирует встраивания и выполняет поиск векторного сходства на основе запроса пользователя.

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