1. Введение
В этом практическом занятии мы создадим приложение для прогнозирования рейтинга успеха фильмов и выписки рецептов с использованием SQL-запросов BigQuery и API Vertex AI PaLM. Модель, используемая для генерации текста, — text-bison , размещенная в качестве удаленной функции в BigQuery.
Использован следующий список услуг:
- BigQuery ML
- Vertex AI PaLM API
- Облачная оболочка
Что вы построите
Вы создадите
- Набор данных BigQuery для размещения модели.
- Модель машинного обучения BigQuery, которая прогнозирует рейтинг успеха фильма на основе атрибутов GENRE и RUNTIME.
- Модель BigQuery, которая предоставляет API Vertex AI PaLM в качестве удаленной функции.
- Внешнее соединение для установления связи между BigQuery и Vertex AI.
2. Требования
Прежде чем начать
- В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
- Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта.
- Убедитесь, что все необходимые API (BigQuery API, Vertex AI API, BigQuery Connection API) включены .
- Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud и поставляемую с предустановленным пакетом bq . Для получения информации о командах и использовании gcloud обратитесь к документации.
В консоли Cloud Console нажмите кнопку «Активировать Cloud Shell» в правом верхнем углу:

Если ваш проект не задан, используйте следующую команду для его настройки:
gcloud config set project <YOUR_PROJECT_ID>
- Перейдите непосредственно в консоль BigQuery , введя в браузере следующий URL-адрес: https://console.cloud.google.com/bigquery
3. Подготовка данных
В данном примере мы будем использовать набор данных о фильмах , полученный из источника movielens .
- Создайте набор данных:
Набор данных BigQuery представляет собой коллекцию таблиц. Все таблицы в наборе данных хранятся в одном и том же месте . Вы также можете добавить пользовательские элементы управления доступом, чтобы ограничить доступ к набору данных и его таблицам.
В Cloud Shell используйте команду bq mk для создания набора данных с именем "movie_insights".
bq mk --location=us-central1 movie_insights
- Скопируйте исходный файл на свой компьютер Cloud Shell:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
- Перейдите в созданную на вашем Cloud Shell директорию нового проекта:
cd movie_score_genai_insights
- Используйте команду `bq load` для загрузки CSV-файла в таблицу BigQuery (обратите внимание, что вы также можете загружать файлы непосредственно из пользовательского интерфейса BigQuery):
bq load --source_format=CSV --skip_leading_rows=1 movie_insights.movie_score \
./movies_data.csv \ Id:numeric,name:string,rating:string,genre:string,year:numeric,released:string,score:string,director:string,writer:string,star:string,country:string,budget:numeric,company:string,runtime:numeric,data_cat:string
- Вы можете выполнить запрос к образцу, чтобы проверить, созданы ли таблица movie_score и соответствующие данные в наборе данных:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;
4. Данные для машинного обучения
Давайте создадим модель классификации для прогнозирования оценки успеха фильма на основе атрибутов GENRE и RUNTIME. Мы будем использовать оператор CREATE MODEL с опцией 'LOGISTIC_REG' для создания и обучения модели логистической регрессии.
Выполните следующий запрос в разделе «Редактор запросов» рабочей области SQL консоли BigQuery:
CREATE OR REPLACE MODEL
`movie_insights.model_rating_by_runtime_genre`
OPTIONS
( model_type='LOGISTIC_REG',
auto_class_weights=TRUE,
data_split_method='NO_SPLIT',
model_registry='vertex_ai',
vertex_ai_model_version_aliases=['logistic_reg', 'experimental'],
input_label_cols=['score']
) AS
SELECT name, genre,runtime, score
FROM
movie_insights.movie_score
WHERE
data_cat = 'TRAIN';
Детали запроса:
- Оператор CREATE MODEL обучает модель, используя обучающие данные из оператора SELECT.
- В разделе OPTIONS указывается тип модели и параметры обучения. Здесь параметр LOGISTIC_REG указывает тип модели логистической регрессии. Нет необходимости указывать бинарную модель логистической регрессии или многоклассовую модель логистической регрессии: BigQuery ML может определить, какую из них обучать, на основе количества уникальных значений в столбце меток.
- Параметр data_split_method='NO_SPLIT' заставляет BQML обучать модель на данных в соответствии с условиями запроса (data_cat = 'TRAIN'). Также обратите внимание, что лучше использовать параметр 'AUTO_SPLIT', чтобы позволить фреймворку (или сервису в данном случае) рандомизировать разделение на обучающую и тестовую выборки.
- Параметр input_label_cols указывает, какой столбец в операторе SELECT использовать в качестве столбца меток. В данном случае столбцом меток является score, поэтому модель будет определять, какое из 10 значений score наиболее вероятно, исходя из других значений, присутствующих в каждой строке.
- Параметр 'auto_class_weights=TRUE' уравновешивает метки классов в обучающих данных. По умолчанию обучающие данные не взвешены. Если метки в обучающих данных несбалансированы, модель может научиться предсказывать наиболее популярный класс с большей вероятностью.
- Оператор SELECT запрашивает данные из CSV-файла в загруженной таблице. Предложение WHERE фильтрует строки во входной таблице, так что на этом этапе выбирается только набор данных TRAIN.
- Следующие параметры являются НЕОБЯЗАТЕЛЬНЫМИ, чтобы BigQuery ML мог явно зарегистрировать их в реестре моделей Vertex AI. Подробнее об этом можно прочитать в этом блоге
. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']
После создания в разделе SCHEMA рабочей области BigQuery SQL отобразится следующее:

После создания модели оцените её производительность с помощью функции ML.EVALUATE . Функция ML.EVALUATE сравнивает прогнозируемые значения с фактическими данными.
Вы также можете просмотреть метрики оценки вашей модели на странице МОДЕЛЬ:

Ключевые показатели вкратце:
Точность — какая доля положительных идентификаций была действительно правильной? Точность = Истинно положительные / (Истинно положительные + Ложно положительные) Полнота — какая доля фактически положительных идентификаций была определена правильно? Полнота = Истинно положительные / (Истинно положительные + Ложно отрицательные) Уточненность — показатель для оценки моделей классификации, это доля предсказаний, которые наша модель действительно угадала правильно. Уточненность = Количество правильных предсказаний / Общее количество предсказаний
5. Прогнозирование оценки фильма с помощью модели.
Время прогнозирования!!!! Следующий запрос прогнозирует оценку каждого фильма в наборе данных, который отнесен к категории "ТЕСТОВЫЕ данные".
Выполните следующий запрос в разделе «Редактор запросов» рабочей области SQL консоли BigQuery:
SELECT
*
FROM
ML.PREDICT (MODEL movie_insights.model_rating_by_runtime_genre,
(
SELECT
*
FROM
movie_insights.movie_score
WHERE
data_cat= 'TEST'
)
);
В результате получается вот такой результат:

Результат работы модели показывает прогнозируемый балл фильма по шкале от 1 до 10 (классификация). Вы, должно быть, задаетесь вопросом, почему для каждого фильма отображается несколько строк с прогнозами. Это потому, что модель вернула возможные прогнозируемые метки и вероятность появления каждой из них в порядке убывания.
Проанализируйте прогнозируемые результаты и модель:
Для понимания результатов прогноза можно выполнить два важных этапа анализа:
- Чтобы понять, почему ваша модель выдает такие результаты прогнозирования, вы можете использовать функцию ML.EXPLAIN_PREDICT .
- Чтобы узнать, какие характеристики наиболее важны для определения категории дохода в целом, можно использовать функцию ML.GLOBAL_EXPLAIN .
Подробное описание этих шагов вы найдете в документации .
6. Данные для генеративного ИИ
Давайте проанализируем набор данных о фильмах, запросив у LLM (Large Language Model) сводку факторов, влияющих на оценку фильма выше 5, с помощью генеративного ИИ, используя модель text-bison (последняя версия) от Vertex AI и только SQL-запросы.
- Созданная нами таблица movie_score также будет использоваться в качестве входных данных на этом этапе.
- Будет создано внешнее соединение для установления связи между BigQuery ML и сервисами Vertex.
- Конструкция BigQuery GENERATE_TEXT будет использоваться для удаленного вызова API PaLM из Vertex AI.
7. Создайте внешнее соединение.
Если это еще не сделано, включите API подключения BQ и запишите идентификатор учетной записи службы из сведений о конфигурации подключения:
- Нажмите кнопку +ДОБАВИТЬ на панели «Обозреватель BigQuery» (в левой части консоли BigQuery) и выберите «Подключение к внешним источникам данных» в списке популярных источников.
- Выберите тип подключения «BigLake и удаленные функции», укажите тип местоположения «Регион» и значение «us-central1 (Айова)», а в качестве идентификатора подключения укажите «bq_llm_connection».

- После установления соединения запишите учетную запись службы, сгенерированную в параметрах конфигурации соединения.
Предоставить разрешения
На этом этапе мы предоставим учетной записи службы права доступа к сервису Vertex AI:
Откройте IAM и добавьте учетную запись службы, скопированную после создания внешнего подключения, в качестве основного пользователя, затем выберите роль "Пользователь Vertex AI".

8. Создайте удалённую модель машинного обучения.
Создайте удалённую модель, представляющую собой размещённую большую языковую модель Vertex AI:
CREATE OR REPLACE MODEL
movie_insights.llm_model REMOTE
WITH CONNECTION `us-central1.bq_llm_connection` OPTIONS (remote_service_type = 'CLOUD_AI_LARGE_LANGUAGE_MODEL_V1');
Эта функция создает модель с именем llm_model в наборе данных movie_insights , которая использует API CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 от Vertex AI в качестве удаленной функции. Выполнение этой операции займет несколько секунд.
9. Сгенерируйте текст, используя модель машинного обучения.
После создания модели используйте её для генерации, обобщения или категоризации текста.
SELECT
ml_generate_text_result['predictions'][0]['content'] AS generated_text,
ml_generate_text_result['predictions'][0]['safetyAttributes']
AS safety_attributes,
* EXCEPT (ml_generate_text_result)
FROM
ML.GENERATE_TEXT(
MODEL `movie_insights.llm_model`,
(
SELECT
CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
FROM (
SELECT
REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
FROM (
SELECT
*
FROM
`movie_insights.movie_score`
WHERE
CAST(SCORE AS INT64) > 5
LIMIT
50) ) AS MOVIES
),
STRUCT(
0.2 AS temperature,
100 AS max_output_tokens));
**Объяснение:
ml_generate_text_result** — это ответ от модели генерации текста в формате JSON, содержащий атрибуты содержимого и безопасности: a. Содержимое представляет собой сгенерированный текстовый результат; b. Атрибуты безопасности представляют собой встроенный фильтр содержимого с регулируемым порогом, который включен в API Vertex AI Palm для предотвращения любых непредвиденных или неожиданных ответов от большой языковой модели — ответ блокируется, если он нарушает порог безопасности.
ML.GENERATE_TEXT — это конструкция, используемая в BigQuery для доступа к Vertex AI LLM для выполнения задач генерации текста.
CONCAT добавляет ваш оператор PROMPT и запись в базу данных.
movie_insights — это название набора данных, а movie_score — это название таблицы, содержащей данные, которые мы будем использовать в дизайне задания.
Температура — это параметр, позволяющий контролировать случайность реакции: чем ниже температура, тем лучше с точки зрения релевантности.
Max_output_tokens — это количество слов, которое вы хотите получить в ответе.
Ответ на запрос выглядит следующим образом:

Как видите, ответ вложенный и не отформатированный.
10. Сгладьте результат запроса.
Давайте преобразуем результат в однородный формат, чтобы нам не приходилось явно декодировать JSON в запросе:
SELECT
*
FROM
ML.GENERATE_TEXT( MODEL movie_insights.llm_model,
(
SELECT
CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
FROM (
SELECT
REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
FROM (
SELECT
*
FROM
`movie_insights.movie_score`
WHERE
CAST(SCORE AS INT64) > 5
LIMIT
50) ) AS MOVIES),
STRUCT( 0.2 AS temperature,
100 AS max_output_tokens,
TRUE AS flatten_json_output));
**Объяснение:
Параметр Flatten_json_output** представляет собой логическое значение, которое, если установлено в true, возвращает понятный текст, извлеченный из JSON-ответа.
Ответ на запрос выглядит следующим образом:

11. Уборка
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этой статье, вы можете удалить конечную точку Vertex AI, созданную вами на этапе машинного обучения, перейдя на страницу конечных точек Vertex AI.
12. Поздравляем!
Поздравляем! Вы успешно создали модель BQML и выполнили аналитику на основе LLM, используя API Vertex AI, только на вашем наборе данных о фильмах с помощью SQL-запросов. Для получения дополнительной информации о доступных моделях ознакомьтесь с документацией по продукту Vertex AI LLM .