1. Введение
В этой кодовой лаборатории вы создадите приложение, которое использует векторный поиск, чтобы рекомендовать позы йоги.
Используя кодовую лабораторию, вы будете применять пошаговый подход следующим образом:
- Используйте существующий набор данных обнимающих лиц с позами йоги (формат JSON).
- Дополните набор данных дополнительным описанием поля, которое использует Gemini для создания описаний для каждой из поз.
- Используйте Langchain для создания документа, используйте интеграцию Firestore Langchain для создания коллекции и вложений в Firestore.
- Создайте составной индекс в Firestore, чтобы разрешить векторный поиск.
- Используйте векторный поиск в приложении Flask, который объединяет все, как показано ниже:
Что ты будешь делать
- Спроектируйте, создайте и разверните веб-приложение, которое использует векторный поиск для рекомендации поз йоги.
Что вы узнаете
- Как использовать Gemini для создания текстового контента и в контексте этой лаборатории создания описаний поз йоги.
- Как использовать Langchain Document Loader для Firestore для загрузки записей из расширенного набора данных из Hugging Face в Firestore вместе с векторными встраиваниями
- Как использовать Langchain Vector Store для Firestore для поиска данных на основе запроса на естественном языке
- Как использовать Google Cloud Text to Speech API для создания аудиоконтента
Что вам понадобится
- Веб-браузер Chrome
- Учетная запись Gmail
- Облачный проект с включенной оплатой
Эта лаборатория кода, предназначенная для разработчиков всех уровней (включая новичков), использует Python в своем примере приложения. Однако знание Python не требуется для понимания представленных концепций.
2. Прежде чем начать
Создать проект
- В Google Cloud Console на странице выбора проекта выберите или создайте проект Google Cloud.
- Убедитесь, что для вашего облачного проекта включена оплата. Узнайте, как проверить, включена ли оплата в проекте .
- Вы будете использовать Cloud Shell , среду командной строки, работающую в Google Cloud, в которую предварительно загружен bq. Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud.
- После подключения к Cloud Shell вы проверяете, что вы уже прошли аутентификацию и что для проекта установлен идентификатор вашего проекта, используя следующую команду:
gcloud auth list
- Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте.
gcloud config list project
- Если ваш проект не установлен, используйте следующую команду, чтобы установить его:
gcloud config set project <YOUR_PROJECT_ID>
- Включите необходимые 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. Нажмите на строку меню в верхнем левом углу и выберите «Файл» → «Открыть папку», как показано ниже:
Выберите папку yoga-poses-recommender-python
, и вы увидите открытую папку со следующими файлами, как показано ниже:
Теперь нам нужно настроить переменные среды, которые мы будем использовать. Нажмите на файл 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
. - Создайте базу данных.
В следующем разделе мы заложим основу для создания коллекции poses
в нашей базе данных Firestore по умолчанию. Эта коллекция будет содержать образцы данных (документов) или информацию о позах йоги, которую мы затем будем использовать в нашем приложении.
На этом раздел настройки базы данных Firestore завершен.
4. Подготовьте набор данных по позам йоги.
Наша первая задача — подготовить набор данных Yoga Poses, который мы будем использовать для приложения. Мы начнем с существующего набора данных Hugging Face, а затем дополним его дополнительной информацией.
Ознакомьтесь с набором данных Hugging Face для поз йоги . Обратите внимание: хотя в этой кодовой лаборатории используется один из наборов данных, на самом деле вы можете использовать любой другой набор данных и следовать тем же методам, которые продемонстрированы для улучшения набора данных.
Если мы перейдем в раздел Files and versions
, мы сможем получить файл данных JSON для всех поз.
Мы скачали 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
.
Пройдемся по основным шагам:
- В функции
main()
вы обнаружите, что она вызывает функциюadd_descriptions_to_json
и предоставляет ожидаемый входной файл и ожидаемый выходной файл. - Функция
add_descriptions_to_json
выполняет следующие действия для каждой записи JSON, т. е. информации о публикации Yoga: - Он извлекает
pose_name
,sanskrit_name
,expertise_level
иpose_types
. - Он вызывает функциюgenerate_description, которая создает приглашение, а затем вызывает класс модели Langchain VertexAI для получения текста ответа.
- Этот текст ответа затем добавляется в объект JSON.
- Обновленный список объектов JSON затем записывается в целевой файл.
Давайте запустим это приложение. Запустите новое окно терминала (Ctrl+Shift+C) и введите следующую команду:
python generate-descriptions.py
Если вас попросят какое-либо разрешение, пожалуйста, предоставьте его.
Вы обнаружите, что приложение начинает выполняться. Мы добавили задержку в 30 секунд между записями, чтобы избежать ограничений скорости, которые могут возникнуть в новых учетных записях Google Cloud, поэтому наберитесь терпения.
Пример текущего запуска показан ниже:
После того как все три записи будут улучшены с помощью вызова Gemini, будет создан файл data/yoga_poses_with_description.json
. Вы можете взглянуть на это.
Теперь мы готовы к нашему файлу данных, и следующим шагом будет понимание того, как заполнить им базу данных Firestore, а также генерировать встраивания.
5. Импортируйте данные в Firestore и создавайте векторные вложения.
У нас есть файл data/yoga_poses_with_description.json
, и теперь нам нужно заполнить им базу данных Firestore и, что немаловажно, сгенерировать векторные внедрения для каждой из записей. Векторные встраивания будут полезны позже, когда нам придется выполнять поиск по их сходству с пользовательским запросом, предоставленным на естественном языке.
Мы будем использовать компоненты Langchain Firestore для реализации описанного выше процесса.
Шаги для этого будут следующими:
- Мы преобразуем список объектов JSON в список объектов документа Langchain . Каждый документ будет иметь два атрибута:
page_content
иmetadata
. Объект метаданных будет содержать весь объект JSON с такими атрибутами, какname
,description
,sanskrit_name
и т. д.page_content
будет строковым текстом, представляющим собой объединение нескольких полей. - Как только у нас будет список объектов
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 в облачной консоли.
Нажмите на базу данных (по умолчанию), она должна отобразить коллекцию test-poses
и несколько документов в этой коллекции. Каждый документ представляет собой одну позу йоги.
Нажмите на любой из документов, чтобы изучить поля. В дополнение к полям, которые мы импортировали, вы также найдете поле embedding
, которое представляет собой векторное поле, которое было автоматически сгенерировано для вас с помощью используемого нами класса Langchain VertexAIEmbeddings
, в котором мы предоставили модель text-embedding-004
Vertex AI Embedding.
Теперь, когда у нас есть записи, загруженные в базу данных Firestore с встраиваниями, мы можем перейти к следующему шагу и посмотреть, как выполнить поиск по сходству векторов в Firestore.
6. Импортируйте полные позы йоги в коллекцию базы данных Firestore.
Теперь мы создадим коллекцию poses
, которая представляет собой полный список из 160 поз йоги, для которых мы создали файл импорта базы данных, который вы можете импортировать напрямую. Это сделано для экономии времени в лаборатории. Процесс создания базы данных, содержащей описание и внедрения, аналогичен тому, что мы видели в предыдущем разделе.
Импортируйте базу данных, выполнив действия, указанные ниже:
- Создайте корзину в своем проекте с помощью команды
gsutil
приведенной ниже. Замените переменную<PROJECT_ID>
в приведенной ниже команде идентификатором своего проекта Google Cloud.
gsutil mb -l us-central1 gs://<PROJECT_ID>-my-bucket
- Теперь, когда корзина создана, нам нужно скопировать подготовленный нами экспорт базы данных в эту корзину, прежде чем мы сможем импортировать ее в базу данных Firebase. Используйте команду, указанную ниже:
gsutil cp -r gs://yoga-database-firestore-export-bucket/2025-01-27T05:11:02_62615 gs://<PROJECT_ID>-my-bucket
Теперь, когда у нас есть данные для импорта, мы можем перейти к последнему этапу импорта данных в созданную нами базу данных Firebase ( default
).
- Используйте команду 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
, как показано ниже:
На этом создание коллекции 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-адрес приложения, нажав кнопку «Просмотр в Интернете», показанную ниже:
Он должен показать вам файл index.html
, как показано ниже:
Введите образец запроса (Пример: Provide me some exercises for back pain relief
) и нажмите кнопку Search
. Это должно получить некоторые рекомендации из базы данных. Вы также увидите кнопку Play Audio
, которая сгенерирует аудиопоток на основе описания, которое вы сможете услышать напрямую.
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 минут, поэтому наберитесь терпения.
После успешного развертывания в результатах развертывания будет указан URL-адрес службы Cloud Run. Это будет иметь вид:
Service URL: https://yogaposes-<<UNIQUEID>.us-central1.run.app
Посетите этот общедоступный URL-адрес, и вы увидите, что то же самое веб-приложение развернуто и успешно работает.
Вы также можете посетить Cloud Run из консоли Google Cloud и увидеть список сервисов в Cloud Run. Служба yogaposes
должна быть одной из служб (если не единственной), перечисленных там.
Вы можете просмотреть подробную информацию о службе, такую как URL-адрес, конфигурации, журналы и многое другое, щелкнув имя конкретной службы (в нашем случае yogaposes
).
На этом разработка и развертывание нашего веб-приложения с рекомендациями по позам йоги завершены в Cloud Run.
10. Поздравления
Поздравляем, вы успешно создали приложение, которое загружает набор данных в Firestore, генерирует встраивания и выполняет поиск векторного сходства на основе запроса пользователя.