1. Введение
В этой кодовой лаборатории мы создадим приложение для прогнозирования и назначения рейтинга успеха фильмов с помощью SQL-запросов BigQuery и API-интерфейса Vertex AI PaLM. Для генерации текста используется модель text-bison , которая размещается как удаленная функция в BigQuery.
Список используемых услуг:
- BigQuery ML
- Vertex AI PaLM API
- Облачная оболочка
Что ты построишь
Вы создадите
- Набор данных BigQuery, содержащий модель.
- Модель BigQuery ML, которая прогнозирует рейтинг успеха фильма на основе атрибутов ЖАНР и ВРЕМЯ ПРОКАТА фильма.
- Модель 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 Machine:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
- Перейдите в новый каталог проекта, созданный на вашем Cloud Shell Machine:
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. Данные для машинного обучения
Давайте создадим модель классификации, чтобы предсказать рейтинг успеха фильма на основе атрибутов «ЖАНР» и «ВРЕМЯ ПРОДОЛЖЕНИЯ». Мы будем использовать оператор CREATE MODEL с опцией «LOGISTIC_REG» для создания и обучения модели логистической регрессии.
Запустите приведенный ниже запрос в разделе РЕДАКТОРА ЗАПРОСОВ SQL Workspace консоли 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 использовать в качестве столбца метки. Здесь столбец метки представляет собой оценку, поэтому модель узнает, какое из 10 значений оценки наиболее вероятно основано на других значениях, присутствующих в каждой строке.
- Опция auto_class_weights=TRUE балансирует метки классов в обучающих данных. По умолчанию данные обучения не взвешены. Если метки в обучающих данных несбалансированы, модель может научиться более точно прогнозировать наиболее популярный класс меток.
- Инструкция SELECT запрашивает таблицу, которую мы загрузили с данными CSV. Предложение WHERE фильтрует строки во входной таблице так, что на этом этапе выбирается только набор данных TRAIN.
- Следующие конструкции являются НЕОБЯЗАТЕЛЬНЫМИ, поэтому BigQuery ML может явно зарегистрировать их в реестре моделей Vertex AI. Подробнее об этом можно прочитать в этом блоге
. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']
После создания в разделе СХЕМА рабочей области BigQuery SQL появится следующее:
После создания модели оцените ее производительность с помощью функции ML.EVALUATE . Функция ML.EVALUATE сравнивает прогнозируемые значения с фактическими данными.
Вы также можете просмотреть оценочные показатели вашей модели на странице МОДЕЛЬ:
Краткий обзор основных показателей:
Точность. Какая доля положительных идентификаций была действительно верной? Точность = истинно положительный результат / (истинный положительный результат + ложный положительный результат). Напомним: какая доля фактических положительных результатов была определена правильно? Отзыв = Истинно положительный / (Истинно положительный + Ложно отрицательный). Точность. Показатель для оценки моделей классификации. Это доля прогнозов, которые наша модель фактически выполнила правильно. Точность = Количество правильных прогнозов / Общее количество прогнозов.
5. Прогнозирование оценки фильма с помощью модели
Время предсказаний!!!! Следующий запрос прогнозирует оценку каждого фильма в наборе данных, который относится к категории данных «ТЕСТ».
Запустите приведенный ниже запрос в разделе РЕДАКТОРА ЗАПРОСОВ SQL Workspace консоли 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 (большую языковую модель) сводку факторов, влияющих на оценку фильма, которая превышает 5, с помощью генеративного ИИ, использующего модель Text-Bison (последняя версия) Vertex AI, использующую только SQL-запросы.
- Созданная нами таблица movie_score также будет входными данными для этого шага.
- Внешнее соединение будет создано для установления доступа между BigQuery ML и сервисами Vertex.
- Конструкция BigQuery GENERATE_TEXT будет использоваться для удаленного вызова API PaLM из Vertex AI.
7. Создайте внешнее соединение
Включите API подключения BQ, если это еще не сделано, и запишите идентификатор учетной записи службы в деталях конфигурации соединения:
- Нажмите кнопку «+ДОБАВИТЬ» на панели BigQuery Explorer (слева от консоли 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. Сгенерируйте текст с помощью модели ML
После создания модели используйте ее для создания, обобщения или категоризации текста.
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. Атрибуты безопасности представляют собой встроенный фильтр контента с настраиваемым пороговым значением, который включен в Vertex AI Palm API, чтобы избежать любых непреднамеренных или непредвиденных ответов от большой языковой модели — ответ блокируется, если он нарушает порог безопасности.
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, созданную на этапе ML, перейдя на страницу Vertex AI Endpoint.
12. Поздравления
Поздравляем! Вы успешно создали модель BQML и выполнили аналитику на основе LLM с использованием API Vertex AI для набора данных ваших фильмов только с помощью SQL-запросов. Ознакомьтесь с документацией по продукту Vertex AI LLM , чтобы узнать больше о доступных моделях.