Генеративный анализ с помощью BigQuery SQL и Vertex AI

1. Введение

В этом практическом занятии мы создадим приложение для прогнозирования рейтинга успеха фильмов и выписки рецептов с использованием SQL-запросов BigQuery и API Vertex AI PaLM. Модель, используемая для генерации текста, — text-bison , размещенная в качестве удаленной функции в BigQuery.

Использован следующий список услуг:

  1. BigQuery ML
  2. Vertex AI PaLM API
  3. Облачная оболочка

Что вы построите

Вы создадите

  • Набор данных BigQuery для размещения модели.
  • Модель машинного обучения BigQuery, которая прогнозирует рейтинг успеха фильма на основе атрибутов GENRE и RUNTIME.
  • Модель BigQuery, которая предоставляет API Vertex AI PaLM в качестве удаленной функции.
  • Внешнее соединение для установления связи между BigQuery и Vertex AI.

2. Требования

  • Браузер, например Chrome или Firefox.
  • Проект Google Cloud с включенной функцией выставления счетов.

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

  1. В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
  2. Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта.
  3. Убедитесь, что все необходимые API (BigQuery API, Vertex AI API, BigQuery Connection API) включены .
  4. Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud и поставляемую с предустановленным пакетом bq . Для получения информации о командах и использовании gcloud обратитесь к документации.

В консоли Cloud Console нажмите кнопку «Активировать Cloud Shell» в правом верхнем углу:

51622c00acec2fa.png

Если ваш проект не задан, используйте следующую команду для его настройки:

gcloud config set project <YOUR_PROJECT_ID>
  1. Перейдите непосредственно в консоль BigQuery , введя в браузере следующий URL-адрес: https://console.cloud.google.com/bigquery

3. Подготовка данных

В данном примере мы будем использовать набор данных о фильмах , полученный из источника movielens .

  1. Создайте набор данных:

Набор данных BigQuery представляет собой коллекцию таблиц. Все таблицы в наборе данных хранятся в одном и том же месте . Вы также можете добавить пользовательские элементы управления доступом, чтобы ограничить доступ к набору данных и его таблицам.

В Cloud Shell используйте команду bq mk для создания набора данных с именем "movie_insights".

bq mk --location=us-central1 movie_insights
  1. Скопируйте исходный файл на свой компьютер Cloud Shell:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. Перейдите в созданную на вашем Cloud Shell директорию нового проекта:
cd movie_score_genai_insights
  1. Используйте команду `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
  1. Вы можете выполнить запрос к образцу, чтобы проверить, созданы ли таблица 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';

Детали запроса:

  1. Оператор CREATE MODEL обучает модель, используя обучающие данные из оператора SELECT.
  2. В разделе OPTIONS указывается тип модели и параметры обучения. Здесь параметр LOGISTIC_REG указывает тип модели логистической регрессии. Нет необходимости указывать бинарную модель логистической регрессии или многоклассовую модель логистической регрессии: BigQuery ML может определить, какую из них обучать, на основе количества уникальных значений в столбце меток.
  3. Параметр data_split_method='NO_SPLIT' заставляет BQML обучать модель на данных в соответствии с условиями запроса (data_cat = 'TRAIN'). Также обратите внимание, что лучше использовать параметр 'AUTO_SPLIT', чтобы позволить фреймворку (или сервису в данном случае) рандомизировать разделение на обучающую и тестовую выборки.
  4. Параметр input_label_cols указывает, какой столбец в операторе SELECT использовать в качестве столбца меток. В данном случае столбцом меток является score, поэтому модель будет определять, какое из 10 значений score наиболее вероятно, исходя из других значений, присутствующих в каждой строке.
  5. Параметр 'auto_class_weights=TRUE' уравновешивает метки классов в обучающих данных. По умолчанию обучающие данные не взвешены. Если метки в обучающих данных несбалансированы, модель может научиться предсказывать наиболее популярный класс с большей вероятностью.
  6. Оператор SELECT запрашивает данные из CSV-файла в загруженной таблице. Предложение WHERE фильтрует строки во входной таблице, так что на этом этапе выбирается только набор данных TRAIN.
  7. Следующие параметры являются НЕОБЯЗАТЕЛЬНЫМИ, чтобы BigQuery ML мог явно зарегистрировать их в реестре моделей Vertex AI. Подробнее об этом можно прочитать в этом блоге . model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']

После создания в разделе SCHEMA рабочей области BigQuery SQL отобразится следующее:

2e43087f914aa466.png

После создания модели оцените её производительность с помощью функции ML.EVALUATE . Функция ML.EVALUATE сравнивает прогнозируемые значения с фактическими данными.

Вы также можете просмотреть метрики оценки вашей модели на странице МОДЕЛЬ:

7f2dc168bac0ac1a.png

Ключевые показатели вкратце:

Точность — какая доля положительных идентификаций была действительно правильной? Точность = Истинно положительные / (Истинно положительные + Ложно положительные) Полнота — какая доля фактически положительных идентификаций была определена правильно? Полнота = Истинно положительные / (Истинно положительные + Ложно отрицательные) Уточненность — показатель для оценки моделей классификации, это доля предсказаний, которые наша модель действительно угадала правильно. Уточненность = Количество правильных предсказаний / Общее количество предсказаний

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'
     )
  );

В результате получается вот такой результат:

c719844860ce7c27.png

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

Проанализируйте прогнозируемые результаты и модель:

Для понимания результатов прогноза можно выполнить два важных этапа анализа:

  1. Чтобы понять, почему ваша модель выдает такие результаты прогнозирования, вы можете использовать функцию ML.EXPLAIN_PREDICT .
  2. Чтобы узнать, какие характеристики наиболее важны для определения категории дохода в целом, можно использовать функцию ML.GLOBAL_EXPLAIN .

Подробное описание этих шагов вы найдете в документации .

6. Данные для генеративного ИИ

Давайте проанализируем набор данных о фильмах, запросив у LLM (Large Language Model) сводку факторов, влияющих на оценку фильма выше 5, с помощью генеративного ИИ, используя модель text-bison (последняя версия) от Vertex AI и только SQL-запросы.

  1. Созданная нами таблица movie_score также будет использоваться в качестве входных данных на этом этапе.
  2. Будет создано внешнее соединение для установления связи между BigQuery ML и сервисами Vertex.
  3. Конструкция BigQuery GENERATE_TEXT будет использоваться для удаленного вызова API PaLM из Vertex AI.

7. Создайте внешнее соединение.

Если это еще не сделано, включите API подключения BQ и запишите идентификатор учетной записи службы из сведений о конфигурации подключения:

  1. Нажмите кнопку +ДОБАВИТЬ на панели «Обозреватель BigQuery» (в левой части консоли BigQuery) и выберите «Подключение к внешним источникам данных» в списке популярных источников.
  2. Выберите тип подключения «BigLake и удаленные функции», укажите тип местоположения «Регион» и значение «us-central1 (Айова)», а в качестве идентификатора подключения укажите «bq_llm_connection».

8a87802ab0846a6.png

  1. После установления соединения запишите учетную запись службы, сгенерированную в параметрах конфигурации соединения.

Предоставить разрешения

На этом этапе мы предоставим учетной записи службы права доступа к сервису Vertex AI:

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

ff8e1d730879f972.png

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 — это количество слов, которое вы хотите получить в ответе.

Ответ на запрос выглядит следующим образом:

a3691afc0a97e724.png

Как видите, ответ вложенный и не отформатированный.

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-ответа.

Ответ на запрос выглядит следующим образом:

1aaa0c514fccab59.png

11. Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этой статье, вы можете удалить конечную точку Vertex AI, созданную вами на этапе машинного обучения, перейдя на страницу конечных точек Vertex AI.

12. Поздравляем!

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