1. Введение
Добро пожаловать в мир питомцев! Здесь рады всем! 🐈🐶🐍🐟🦄
Предварительные требования
- Базовое понимание консоли Google Cloud
- Базовое понимание SQL-запросов.
Что вы узнаете
- Создавайте наборы данных и таблицы в BigQuery.
- Создайте столбцы ObjectRef для ссылки на мультимедийные файлы в хранилище BigQuery.
- Используйте функции искусственного интеллекта в BigQuery для улучшения вашего набора данных на основе содержимого неструктурированных данных.
- Создавайте встроенные мультимедийные файлы для поиска похожих медиафайлов.
- Создайте векторные представления текста для выполнения семантического поиска с помощью функции VECTOR_SEARCH.
- Используйте Gemini CLI для создания веб-приложения.
Что вам понадобится
- Учетная запись Google Cloud и проект Google Cloud с платёжным аккаунтом.
- Веб-браузер, например Chrome.
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



- Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как
PROJECT_ID). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта. - К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
- Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
3. Откройте Cloud Shell.
Перейдите по ссылке https://shell.cloud.google.com/?show=ide%2Cterminal . При появлении запроса нажмите «Авторизовать» .

Убедитесь, что редактор и консоль отображаются:

4. Создайте вспомогательный скрипт.
Для упрощения этого процесса вам потребуется создать вспомогательный скрипт, который будет устанавливать соответствующие переменные окружения.
Замените <<Идентификатор проекта>> на идентификатор вашего проекта ниже.
Скопируйте следующую команду в терминал Cloud Shell и нажмите Enter для выполнения.
gcloud config set project <<PROJECT_ID>>
Скопируйте следующую команду в терминал Cloud Shell и нажмите Enter для выполнения. Это активирует необходимые службы, создаст файл и позволит редактировать его в Cloud Shell.
gcloud services enable compute.googleapis.com \
cloudresourcemanager.googleapis.com \
aiplatform.googleapis.com \
storage-component.googleapis.com \
bigqueryconnection.googleapis.com \
run.googleapis.com \
secretmanager.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
iap.googleapis.com
edit ~/petverse-setup.sh
Вы должны увидеть новую вкладку с названием файла. Вставьте следующий скрипт в этот новый файл:
#!/bin/bash
# -----------------------------------------------------------------------------
# 1. Global Variables: Set your desired project ID and region here.
# -----------------------------------------------------------------------------
# 🦄 🦄 Set your project ID here ⬇️.
# Example: PROJECT_ID="your-project-id"
PROJECT_ID=""
# Set your desired region here. Default is 'us-central1'.
# Example: REGION="us-east1"
REGION="us-central1"
# -----------------------------------------------------------------------------
# 2. Check and Authenticate
# -----------------------------------------------------------------------------
echo " ➡️ Checking for active Google Cloud authentication..."
# Check if the user is authenticated; if not, prompt for authentication.
if ! gcloud auth list --format="value(account)" | grep -q @; then
echo "⚠️ Not authenticated. Please authenticate now."
gcloud auth login
fi
echo " ✅ Authentication check passed."
# -----------------------------------------------------------------------------
# 3. Get Project ID from User if not set
# -----------------------------------------------------------------------------
# If PROJECT_ID is not set in the script or as an environment variable,
# prompt the user to choose one.
if [[ -z "$PROJECT_ID" ]] && [[ -n "$DEVSHELL_PROJECT_ID" ]]; then
PROJECT_ID=$DEVSHELL_PROJECT_ID
fi
if [[ -z "$PROJECT_ID" ]]; then
echo " ⚠️ Project ID is not set. Listing available projects:"
# List projects and store them in an array.
projects_array=($(gcloud projects list --format="value(projectId)"))
# Check if projects were found.
if [[ ${#projects_array[@]} -eq 0 ]]; then
echo " ❌ No projects found. Please ensure your account has access to projects."
exit 1
fi
# Display the projects and prompt for input.
echo " "
echo "Available Projects:"
for project in "${projects_array[@]}"; do
echo "$project"
done
echo " "
read -p "Please enter your desired project ID from the list above: " PROJECT_ID
# Validate the user's input by checking if it's in the array.
if [[ ! " ${projects_array[@]} " =~ " ${PROJECT_ID} " ]]; then
echo " ❌ Invalid project ID. Please run the script again and select a valid ID."
exit 1
fi
fi
echo " ✅ Project ID set to: $PROJECT_ID"
# -----------------------------------------------------------------------------
# 4. Set Environment Variables
# -----------------------------------------------------------------------------
# Set the project and region for the current session.
echo " 🔄 Setting Google Cloud configuration for this session..."
gcloud config set project "$PROJECT_ID"
gcloud config set compute/region "$REGION"
echo " ✅ Google Cloud configuration updated."
echo "Project ID: $PROJECT_ID"
echo "Region: $REGION"
echo " "
echo " 🎉 🦄 🦄 Script execution complete. You can now use Google Cloud commands in this shell session."
Замените поле PROJECT_ID на название вашего проекта:

Скопируйте следующую команду и выполните её в терминале:
chmod +x petverse-setup.sh
~/petverse-setup.sh
Ожидаемый результат:

5. Создайте хранилище (bucket).
Создайте хранилище Cloud Storage Bucket и скопируйте в него доступные медиафайлы. Вы будете использовать его для хранения медиафайлов, связанных с нашими замечательными питомцами. Также вам потребуется создать подключение для доступа к хранилищу через BigQuery.
Вставьте и выполните следующую команду в терминале:
~/petverse-setup.sh
cd ~/
gcloud storage buckets create gs://$DEVSHELL_PROJECT_ID-petverse --uniform-bucket-level-access --location=us-central1
gcloud storage cp -r gs://sample-data-and-media/petverse/* gs://$DEVSHELL_PROJECT_ID-petverse/
bq mk --dataset --location=us-central1 --project_id=$DEVSHELL_PROJECT_ID petverse
bq mk --connection --location=us-central1 --project_id=$DEVSHELL_PROJECT_ID \
--connection_type=CLOUD_RESOURCE pet-connection
echo "your bucket is gs://$DEVSHELL_PROJECT_ID-petverse "

6. Создайте таблицу с домашними животными.
Теперь вам нужно создать таблицу в BigQuery для хранения информации о ваших питомцах.
Откройте новую вкладку в браузере. Перейдите по ссылке https://console.cloud.google.com/bigquery .
Убедитесь, что в консоли выбран тот же проект, который вы использовали ранее:

Теперь вы можете создать таблицу, используя данные из файла pets.csv. Этот файл содержит имена, любимые корма, игрушки и другую интересную информацию о ваших питомцах.
Скопируйте следующий код в новый SQL-запрос, чтобы создать физическую таблицу и загрузить данные.
LOAD DATA INTO petverse.pets
OPTIONS(
description="Table for furry friend data"
)
FROM FILES (
skip_leading_rows=1,
uris = ['gs://<<your_bucket_name>>/pets.csv'],
format = 'CSV'
);
Замените в коде заполнитель для корзины на корзину, которую вы создали на предыдущем шаге.
Проверить все свои хранилища можно в отдельной вкладке браузера, перейдя по следующему адресу: https://console.cloud.google.com/storage/browser .

Для выполнения запроса воспользуйтесь кнопкой «Выполнить» .
После успешной загрузки данных нажмите « Перейти к таблице» .

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

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

Скопируйте идентификатор учетной записи службы .
Откройте консоль администратора IAM в новой вкладке браузера ( https://console.cloud.google.com/iam-admin/ ).
Предоставьте учетной записи службы права на использование средств просмотра объектов хранилища и прав пользователя Vertex AI (эти права понадобятся вам позже).

Нажмите «Сохранить» и 🕰️ подождите пару минут .
Вернувшись на вкладку BigQuery , используйте следующий запрос в BigQuery Studio, чтобы проверить соединение между BigQuery и хранилищем.
Замените <<PROJECT_ID>> на идентификатор вашего проекта.
SET @@location='us-central1';
SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/yoda_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))
Нажмите «Просмотреть результаты». В результатах должны отобразиться метаданные:

8. Добавьте носитель информации к вашим структурированным данным.
Вы можете расширить таблицу с питомцами , добавив столбец с фотографией профиля каждого питомца (если таковая имеется). Также вы добавите еще один столбец с массивом ссылок на медиафайлы для хранения всех остальных файлов, связанных с каждым питомцем.
Для доступа к мультимедийным материалам требуется подключение, которое вы создали в начале этого практического занятия после создания своего хранилища (bucket).
Вставьте следующие команды в консоль SQL BigQuery и выполните их, чтобы добавить два столбца в таблицу ваших pets .
SET @@location='us-central1';
ALTER TABLE petverse.pets
ADD COLUMN IF NOT EXISTS profile_picture STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>,
ADD COLUMN IF NOT EXISTS additional_media ARRAY<STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>>;
Скопируйте следующие утверждения и замените заполнитель PROJECT_ID на идентификатор вашего проекта.
SET @@location='us-central1';
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/yoda_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Yoda_asks_for_cuddles.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 1;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/madonna_profile_picture.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Madonna_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 2;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/pixel_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pixel_thug_life.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pixel_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 3;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/sql_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/SQL_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/SQL_favorite_toy.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 4;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/buddy_golden_retriever.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = NULL
WHERE Id = 5;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/daisy_french_bulldog.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = NULL
WHERE Id = 6;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/max_german_shepherd.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/max_description_tells_jokes.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 7;
UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 8;
UPDATE petverse.pets SET profile_picture = NULL, additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/rocky_description.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))] WHERE Id = 9;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/pip_hamster.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pip_Hamster_Wheel_Video_Generated.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 10;
UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 11;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/scales_snake.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = NULL
WHERE Id = 12;
UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 13;
UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/Joel_Profile_Picture.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Catwalk.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Flowers.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Plays.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 14;
Выполните запрос. Через несколько минут вы должны увидеть успешное выполнение:

Проверьте результаты с помощью предварительного просмотра таблицы. Вы должны увидеть метаданные для существующих фотографий профиля и дополнительные медиафайлы для кота по имени Пиксель.
SELECT *
FROM `petverse.pets`
WHERE name = 'Pixel'

9. Составьте описания домашних животных.
Если вы просмотрите таблицу питомцев , то заметите, что у некоторых из них — например, у Йоды, Пикселя или Рокки — отсутствует любимая еда или любимая игрушка.
Ответы на эти вопросы могут содержаться в видеороликах и аудиоматериалах, посвященных этим животным. Для проверки вам понадобятся встроенные функции искусственного интеллекта.
Проверьте это с помощью следующего утверждения:
SELECT name,
AI.GENERATE(
prompt=> ('What are this pet\'s favorite toy and favorite foods', additional_media ),
connection_id => 'us-central1.pet-connection',
endpoint => 'gemini-2.5-flash',
output_schema => 'food STRING, toy STRING')
FROM petverse.pets
WHERE name = 'Rocky'
Видео Рокки можно посмотреть в вашем хранилище .
Используйте следующее выражение для обновления отсутствующих описаний:
UPDATE petverse.pets AS p
SET FavoriteFood = aigen.food
FROM
(
SELECT Id, name,
AI.GENERATE(
prompt=> ('What are this pet\'s favorite toy and favorite foods', additional_media ),
connection_id => 'us-central1.pet-connection',
endpoint => 'gemini-2.5-flash',
output_schema => 'food STRING').food
FROM petverse.pets ) AS aigen
WHERE p.Id = aigen.Id
AND p.FavoriteFood IS NULL
AND p.additional_media IS NOT NULL
Используйте следующее выражение для создания описания питомцев на основе их мультимедийных данных в новом столбце:
ALTER TABLE petverse.pets ADD COLUMN MediaDescription STRING;
UPDATE petverse.pets AS p
SET MediaDescription = aigen.description
FROM
(
SELECT Id, name,
AI.GENERATE(
prompt=> ('Create a description in an epic tone for this pet based on these media: ', additional_media ),
connection_id => 'us-central1.pet-connection',
endpoint => 'gemini-2.5-flash',
output_schema => 'description STRING').description
FROM petverse.pets ) AS aigen
WHERE p.Id = aigen.Id
AND p.MediaDescription IS NULL
AND p.additional_media IS NOT NULL
Через несколько минут вы увидите несколько креативных описаний:

10. Создайте эмбеддинги
Создайте таблицу для хранения векторных представлений фотографий профиля, а также описаний и хобби, которые будут использоваться в семантическом поиске. Мы будем искать сходства между домашними животными с помощью векторного поиска.
SET @@location='us-central1';
CREATE OR REPLACE MODEL petverse.multimodalembedding
REMOTE WITH CONNECTION `us-central1.pet-connection`
OPTIONS(ENDPOINT = 'multimodalembedding@001');
CREATE TABLE IF NOT EXISTS petverse.profile_embeddings
AS
SELECT *
FROM ML.GENERATE_EMBEDDING(
MODEL petverse.multimodalembedding,
(
SELECT profile_picture as content,
Id
FROM petverse.pets)
);
CREATE OR REPLACE MODEL petverse.textembedding
REMOTE WITH CONNECTION `us-central1.pet-connection`
OPTIONS (ENDPOINT = 'text-embedding-005');
CREATE OR REPLACE TABLE petverse.text_embeddings AS
SELECT * FROM ML.GENERATE_EMBEDDING(
MODEL petverse.textembedding,
(
SELECT CONCAT(AdoptionStory, ' . This pet\'s hobby is: ', Hobby, ' and their nickname(s) is: ', COALESCE(Nicknames, Name)) AS content,
Id, Name
FROM petverse.pets
WHERE LENGTH(AdoptionStory) > 0 AND LENGTH(Hobby) > 0
)
)
WHERE LENGTH(ml_generate_embedding_status) = 0;
Проверьте новую таблицу на вкладке «Результаты».

Для проверки состояния всех эмбеддингов используйте следующее выражение:
SELECT DISTINCT(ml_generate_embedding_status),
COUNT(content.uri) AS num_rows
FROM petverse.profile_embeddings
GROUP BY 1;
Если возникнут ошибки , вы увидите их в непустом статусе. Это правильный вывод — записей с ошибками нет**:**

Ниже приведён пример записей с ошибками. Эти ошибки не ожидаются, но их необходимо исправить, прежде чем переходить к следующим шагам:

Поищите похожих питомцев.
В стандартном наборе данных есть похожие домашние животные. Вот два примера: Pixel (Id: 3) и SQL (Id: 4):

Расстояние между векторными представлениями можно использовать для расчета похожих домашних животных:
SELECT
t2.id AS similar_pet_id,
COSINE_DISTANCE(t1.ml_generate_embedding_result, t2.ml_generate_embedding_result) AS distance
FROM
petverse.profile_embeddings AS t1,
petverse.profile_embeddings AS t2
WHERE
t1.Id = 3 -- The pet you want to find similar ones to
AND t1.Id != t2.Id -- Exclude the pet itself from the results
AND t1.content.uri IS NOT NULL
AND t2.content.uri IS NOT NULL
ORDER BY
distance
LIMIT 5;
В результате вы получите идентификаторы похожих друг на друга изображений. Это будет включать все, что изображено на картинке. В этом примере похожи Pixel и SQL, а следующее по сходству животное — Джоэл (идентификатор: 14).

Вот фотография Джоэла для наглядности:

Попробуйте семантический поиск
Вы можете использовать функцию VECTOR_SEARCH для семантического поиска по текстовым векторным представлениям. Если бы эта таблица была больше, вам потребовалось бы создать индекс для этих векторных представлений.
SELECT query.query, base.content, base.Name
FROM VECTOR_SEARCH(
TABLE `petverse.text_embeddings`, 'ml_generate_embedding_result',
(
SELECT ml_generate_embedding_result, content AS query
FROM ML.GENERATE_EMBEDDING(
MODEL `petverse.textembedding`,
(SELECT 'Pets who like to relax' AS content))
),
top_k => 5, options => '{"fraction_lists_to_search": 0.50}')
ORDER BY distance DESC
Попробуйте изменить семантический поисковый запрос ( Pets who like to relax »), а также параметр fraction_lists_to_search и посмотрите, что произойдет. Подробнее об этих функциях можно узнать здесь .
11. Создайте страницу профиля с помощью кода Vibe.
Вы будете использовать интерфейс командной строки Gemini в Cloud Shell, чтобы быстро запустить простое демонстрационное веб-приложение. Интерфейс командной строки этого веб-приложения упрощен, чтобы показать, как может воплотиться в жизнь Petverse.
Вернитесь в Cloud Shell . Для лучшего взаимодействия с программой лучше использовать консоль в полноэкранном режиме:

Запустите скрипт инициализации, чтобы убедиться в правильности установки переменных окружения, создайте каталог для этого проекта и выполните команду Gemini CLI:
~/petverse-setup.sh
mkdir petverse-profiles
cd petverse-profiles
gemini
Вам следует ознакомиться с интерфейсом командной строки Gemini:

Замените название корзины в приведенном ниже запросе.
Вставьте приглашение в командную строку Gemini.
You are a fullstack engineer creating an application to display the profiles of cats, dogs and other pets stored in BigQuery. The table where these are stored is called pets, in the dataset petverse.
1.Application Requirements: Display the pets with their profile picture, all the other information in the Pets table, and other media that may be available. The pictures are in a GCS bucket, the field in the table pets profile_picture.uri contains the URI for the storage bucket of that profile picture. The field additional_media is an array of objectref that contains multiple URI to different media stored in a GCS bucket.
Important: In the code, in the values for the URIs retrieved from BigQuery, replace gs://<<YOUR_PROJECT_ID>>-petverse/ with https://storage.mtls.cloud.google.com/<<YOUR_PROJECT_ID>>-petverse/ as follows: replace('gs://', 'https://storage.mtls.cloud.google.com/'). Use the python library. Media can be pictures, videos and audio. Consider these formats in the code. Some pets may not have profile pictures or additional media.
2.Hosting: Create a web application hosted in a single container and service in Cloud Run, use the following syntax to deploy it using IAP. IMPORTANT: DO NOT ADD IAM AUTHENTICATION AND DO NOT ALLOW UNAUTHENTICATED: gcloud beta run deploy SERVICE_NAME --region=REGION --image=IMAGE_URL --no-allow-unauthenticated --iap
3.Database access: Display similar pets based on a similarity between embeddings in table petverse.profile_embeddings.
Here's the schema for the pets table in CSV format (Field name, type, mode):
Id,INTEGER,NULLABLE
Name,STRING,NULLABLE
Species,STRING,NULLABLE
Breed,STRING,NULLABLE
Nationality,STRING,NULLABLE
Nicknames,STRING,NULLABLE
Hobby,STRING,NULLABLE
AdoptionStory,STRING,NULLABLE
FavoriteFood,STRING,NULLABLE
FavoriteToy,STRING,NULLABLE
profile_picture,RECORD,NULLABLE
additional_media,RECORD,REPEATED
profile_embeddings,FLOAT,REPEATED
Here's a sample query to check for similarity:
SELECT
t2.id AS similar_pet_id,
COSINE_DISTANCE(t1.ml_generate_embedding_result, t2.ml_generate_embedding_result) AS distance
FROM
petverse.profile_embeddings AS t1,
petverse.profile_embeddings AS t2
WHERE
t1.Id = 3 -- The pet you want to find similar ones to
AND t1.Id != t2.Id -- Exclude the pet itself from the results
AND t1.content.uri IS NOT NULL
AND t2.content.uri IS NOT NULL
ORDER BY
distance
LIMIT 5;
Complement the profile of each pet with a description. Here's an example of the access to such table:
SELECT Name, MediaDescription from petverse.pets;
4.For each access to BigQuery, show the SQL statement that is used in the console logs.
5.Search functionality: Add a search bar for a semantic search for pets. There's a text embedding for the Adoption story, the pet's past-time or hobby and their nicknames in the table: petverse.text_embeddings . This is a sample of semantic search:
SELECT query.query, base.content, base.Name FROM VECTOR_SEARCH(TABLE `petverse.text_embeddings`, 'ml_generate_embedding_result', ( SELECT ml_generate_embedding_result, content AS query FROM ML.GENERATE_EMBEDDING(MODEL `petverse.textembedding`,(SELECT 'Pets who like to relax' AS content))), top_k => 5, options => '{"fraction_lists_to_search": 0.50}') ORDER BY distance DESC
6.Use Python for the backend. Generate the deployment scripts for an authenticated service using IAP with the flags --no-allow-unauthenticated --iap
7. Make the UI look like a modern art museum.
8. Use the gunicorn library. Validate version dependencies.
Теперь это ваше приключение. Вам будет показан план, и по ходу дела вас попросят подтвердить его.
Крайне маловероятно, что созданный код и развертывание сработают с первого раза. Вам потребуется многократно использовать Gemini CLI, пока не добьетесь нужного результата.
Если вы видите, что процесс зациклился, остановите его с помощью CTRL/Command + C , выясните причину проблемы и запустите его снова.

Мы рекомендуем внимательно прочитать каждое подтверждение по отдельности, чтобы понять, что будет делать интерфейс командной строки:

Через несколько минут приложение должно быть готово к запуску. Возможно, консоль зависнет:

Вы можете вручную протестировать приложение в новой вкладке Cloud Shell с помощью gunicorn. Убедитесь, что проект настроен:

Вы должны увидеть свой новый сайт (он может выглядеть иначе). Если что-то не работает, вы сможете увидеть журналы ошибок и отладки в командной строке Cloud Shell, запущенной локально.

Если все выглядит хорошо, при желании вы можете развернуть приложение в Cloud Run.
Если ваш проект входит в организацию, обязательно настройте IAP, следуя этим инструкциям . Если ваш проект не является частью организации, вы можете вместо этого следовать этим инструкциям для обеспечения безопасного доступа к вашему приложению. Особенно для производственных условий мы рекомендуем НЕ разрешать неаутентифицированный доступ.

Если развертывание прошло успешно, вы должны увидеть запущенное приложение Cloud Run в консоли Cloud Run.
Убедитесь, что доступ разрешен только через IAP. Используйте функцию «Редактировать политику» , чтобы добавить пользователя в привязку, и сохраните изменения .
Подождите несколько минут, пока обработаются привязки IAP, и щелкните по URL-адресу вверху страницы. Сайт должен отобразиться.

12. Уборка
Этот шаг поможет вам удалить ресурсы, созданные в ходе выполнения данного практического задания.
Удалите службу Cloud Run (при необходимости измените названия служб и региона):
gcloud run services delete petverse-profiles --region us-central1
Удалите все ресурсы BigQuery:
bq rm -f petverse
gcloud bigquery connections delete pet-connection --location=us-central1
