Анализ постеров фильмов в BigQuery с помощью удаленных моделей

1. Введение

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

3e75cd7cdc8ffcf6.jpeg

На изображении выше: примеры изображений кинопостеров, которые вы будете анализировать.

BigQuery — это полностью управляемая платформа для анализа данных, готовая к использованию искусственного интеллекта, которая помогает максимально эффективно использовать ваши данные и разработана для работы с различными механизмами, форматами и облачными средами. Одна из её ключевых особенностей — BigQuery Machine Learning для вывода результатов, которая позволяет создавать и запускать модели машинного обучения (ML) с помощью запросов GoogleSQL.

Gemini — это семейство генеративных моделей искусственного интеллекта, разработанных Google для многомодальных сценариев использования.

Запуск моделей машинного обучения с использованием запросов GoogleSQL

Как правило, применение машинного обучения или искусственного интеллекта (ИИ) к большим наборам данных требует обширного программирования и знаний в области фреймворков машинного обучения. Это ограничивает разработку решений небольшой группой специалистов внутри каждой компании. С помощью BigQuery Machine Learning для вывода результатов специалисты по SQL могут использовать существующие инструменты и навыки работы с SQL для построения моделей и получения результатов из LLM и API облачного ИИ.

Предварительные требования

Что вы узнаете

  • Как настроить среду и учетную запись для использования API
  • Как создать подключение к облачному ресурсу в BigQuery
  • Как создать набор данных и таблицу объектов в BigQuery для изображений постеров к фильмам
  • Как создать удалённые модели Gemini в BigQuery
  • Как заставить модель Gemini предоставлять краткие описания фильмов для каждого постера?
  • Как сгенерировать текстовые вставки для фильма, представленного на каждом постере.
  • Как использовать VECTOR_SEARCH в BigQuery для сопоставления изображений постеров фильмов с похожими фильмами в наборе данных.

Что вам понадобится

  • Учетная запись Google Cloud и проект Google Cloud с включенной функцией выставления счетов.
  • Веб-браузер, например Chrome.

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как PROJECT_ID ). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии вы будете использовать Google Cloud Shell — среду командной строки, работающую в облаке.

В консоли Google Cloud нажмите на значок Cloud Shell на панели инструментов в правом верхнем углу:

55efc1aaa7a4d3ad.png

It should only take a few moments to provision and connect to the environment. When it is finished, you should see something like this:

7ffe5cbb04455448.png

Эта виртуальная машина содержит все необходимые инструменты разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Вся работа в этом практическом задании может выполняться в браузере. Вам не нужно ничего устанавливать.

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

Для работы с моделями Gemini в BigQuery необходимо выполнить несколько подготовительных шагов, включая включение API, создание подключения к облачному ресурсу и предоставление учетной записи службы для этого подключения определенных разрешений. Эти шаги выполняются один раз для каждого проекта и будут рассмотрены в следующих разделах.

Включить API

Внутри Cloud Shell убедитесь, что идентификатор вашего проекта указан правильно:

gcloud config set project [YOUR-PROJECT-ID]

Установите переменную среды PROJECT_ID :

PROJECT_ID=$(gcloud config get-value project)

Настройте регион по умолчанию для использования с моделями Vertex AI. Подробнее о доступных регионах для Vertex AI можно прочитать здесь. В примере мы используем регион us-central1 .

gcloud config set compute/region us-central1

Установите переменную среды REGION :

REGION=$(gcloud config get-value compute/region)

Включите все необходимые службы:

gcloud services enable bigqueryconnection.googleapis.com \
                       aiplatform.googleapis.com

Ожидаемый результат после выполнения всех вышеперечисленных команд:

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable bigqueryconnection.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

4. Создайте подключение к облачному ресурсу.

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

  1. В консоли Google Cloud, в меню навигации ( значок навигационного меню ), нажмите BigQuery .

68ddff3628a55957.png

  1. Чтобы создать подключение, нажмите кнопку «+ ДОБАВИТЬ» , а затем — « Подключения к внешним источникам данных» .

8b70fdd209f540b6.png

  1. В списке «Тип подключения» выберите удаленные модели Vertex AI, удаленные функции и BigLake (облачный ресурс) .
  2. В поле «Идентификатор подключения» введите gemini_conn для вашего подключения.
  3. В поле «Тип местоположения» выберите «Многорегиональный» , а затем из выпадающего списка выберите «Многорегиональный США» .
  4. Для остальных настроек используйте значения по умолчанию.

deb25a1dd65ee9dd.png

  1. Нажмите «Создать соединение» .
  2. Нажмите «Перейти к подключению» .
  3. В панели «Информация о подключении» скопируйте идентификатор учетной записи службы в текстовый файл для использования в следующей задаче. Вы также увидите, что подключение добавлено в раздел «Внешние подключения» вашего проекта в обозревателе BigQuery.

5. Предоставьте учетную запись службы подключения разрешения IAM.

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

  1. В консоли Google Cloud в меню «Навигация» выберите «IAM и администрирование» .
  2. Нажмите «Предоставить доступ» .
  3. В поле «Новые участники» введите идентификатор учетной записи службы, который вы скопировали ранее.
  4. В поле «Выберите роль» введите Vertex AI , а затем выберите роль пользователя Vertex AI .

55ed0ac6cd92aa1e.png

  1. Нажмите «Сохранить» . В результате идентификатор учетной записи службы теперь будет включать роль пользователя Vertex AI.

6. Создайте набор данных и таблицу объектов в BigQuery для изображений постеров к фильмам.

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

The dataset of movie poster images used in this tutorial are stored in a public Google Cloud Storage bucket: gs://cloud-samples-data/vertex-ai/dataset-management/datasets/classic-movie-posters

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

В этом руководстве вы создадите набор данных для хранения объектов базы данных, включая таблицы и модели.

  1. В консоли Google Cloud выберите меню «Навигация» ( значок навигационного меню ), а затем выберите BigQuery .
  2. В панели «Проводник» рядом с названием проекта выберите «Действия просмотра» ( Значок меню «Ещё» ), а затем выберите «Создать набор данных» .
  3. В панели «Создать набор данных» введите следующую информацию:
  • Идентификатор набора данных: gemini_demo
  • Тип местоположения: выберите «Многорегиональный».
  • Многорегиональный: выберите США
  1. Остальные поля оставьте со значениями по умолчанию.

9a787006017d5b47.png

  1. Нажмите «Создать набор данных» .

В результате создается набор данных gemini_demo , который отображается в BigQuery Explorer под вашим проектом.

Создайте таблицу объектов.

BigQuery хранит не только структурированные данные, но и может получать доступ к неструктурированным данным (например, к изображениям постеров) через объектные таблицы.

Вы создаете таблицу объектов, указывая на сегмент Cloud Storage, и в результирующей таблице объектов содержится строка для каждого объекта из сегмента с его путем хранения и метаданными.

Для создания таблицы объектов вы будете использовать SQL-запрос.

  1. Нажмите кнопку «+» , чтобы создать новый SQL-запрос .
  2. В редакторе запросов вставьте приведенный ниже запрос.
CREATE OR REPLACE EXTERNAL TABLE
  `gemini_demo.movie_posters`
WITH CONNECTION `us.gemini_conn`
OPTIONS (
  object_metadata = 'SIMPLE',
  uris = ['gs://cloud-samples-data/vertex-ai/dataset-management/datasets/classic-movie-posters/*']
  );
  1. Выполните запрос. В результате в набор данных gemini_demo будет добавлена ​​таблица объектов movie_posters , содержащая URI (адрес в Cloud Storage) каждого изображения постера к фильму.
  2. В обозревателе щелкните по таблице movie_posters и просмотрите схему и подробные сведения. При желании вы можете выполнить запрос к таблице, чтобы просмотреть конкретные записи.

7. Создайте удаленную модель Gemini в BigQuery.

Теперь, когда таблица объектов создана, вы можете начать с ней работать. В этом задании вы создадите удалённую модель для Gemini 1.5 Flash, чтобы сделать её доступной в BigQuery.

Создайте модель пульта дистанционного управления Gemini 1.5 Flash.

  1. Нажмите кнопку «+» , чтобы создать новый SQL-запрос .
  2. В редакторе запросов вставьте приведенный ниже запрос и выполните его.
CREATE OR REPLACE MODEL `gemini_demo.gemini_1_5_flash`
REMOTE WITH CONNECTION `us.gemini_conn`
OPTIONS (endpoint = 'gemini-1.5-flash')

В результате создается модель gemini_1_5_flash , и вы видите, что она добавлена ​​в набор данных gemini_demo в разделе моделей.

  1. В Проводнике щелкните по модели gemini_1_5_flash и просмотрите подробные сведения.

8. С помощью модели Prompt Gemini предоставить краткие описания фильмов для каждого постера.

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

You can send requests to the model by using the ML.GENERATE_TEXT function , referencing the model in the parameters.

Проанализируйте изображения с помощью модели Gemini 1.5 Flash.

  1. Создайте и выполните новый запрос, содержащий следующий SQL-запрос:
CREATE OR REPLACE TABLE
`gemini_demo.movie_posters_results` AS (
SELECT
    uri,
    ml_generate_text_llm_result
FROM
    ML.GENERATE_TEXT( MODEL `gemini_demo.gemini_1_5_flash`,
    TABLE `gemini_demo.movie_posters`,
    STRUCT( 0.2 AS temperature,
        'For the movie represented by this poster, what is the movie title and year of release? Answer in JSON format with two keys: title, year. title should be string, year should be integer. Do not use JSON decorators.' AS PROMPT,
        TRUE AS FLATTEN_JSON_OUTPUT)));

При выполнении запроса BigQuery запрашивает у модели Gemini данные для каждой строки таблицы объектов, объединяя изображение с указанным статическим запросом. В результате создается таблица movie_posters_results .

  1. Теперь давайте посмотрим результаты. Создайте и выполните новый запрос со следующим SQL-запросом:
SELECT * FROM `gemini_demo.movie_posters_results`

В результате получаются строки для каждого постера фильма, содержащие URI (адрес изображения постера в облачном хранилище) и JSON-файл, включающий название фильма и год его выпуска, созданный на основе модели Gemini 1.5 Flash.

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

  1. Создайте и выполните новый запрос, содержащий следующий SQL-запрос:
CREATE OR REPLACE TABLE
  `gemini_demo.movie_posters_results_formatted` AS (
  SELECT
    uri,
    JSON_VALUE(ml_generate_text_llm_result, "$.title") AS title,
    JSON_VALUE(ml_generate_text_llm_result, "$.year") AS year
  FROM
    `gemini_demo.movie_posters_results` results )

В результате создается таблица movie_posters_result_formatted .

  1. Вы можете выполнить запрос к таблице с помощью приведенного ниже запроса, чтобы увидеть созданные строки.
SELECT * FROM `gemini_demo.movie_posters_results_formatted`

Обратите внимание, что результаты в столбце URI остаются неизменными, но JSON-данные теперь преобразуются в столбцы title и year для каждой строки.

Модель Flash Prompt Gemini 1.5 позволяет предоставлять краткие описания фильмов.

А что, если вам потребуется немного больше информации о каждом из этих фильмов, например, текстовое описание каждого из них? Этот вариант использования для создания контента идеально подходит для модели LLM, такой как модель Gemini 1.5 Flash.

  1. С помощью Gemini 1.5 Flash вы можете получить краткое описание фильмов для каждого постера, выполнив следующий запрос:
SELECT
  uri,
  title,
  year,
  prompt,
  ml_generate_text_llm_result
  FROM
 ML.GENERATE_TEXT( MODEL `gemini_demo.gemini_1_5_flash`,
   (
   SELECT
     CONCAT('Provide a short summary of movie titled ',title, ' from the year ',year,'.') AS prompt,
     uri,
     title,
     year
   FROM
     `gemini_demo.movie_posters_results_formatted`
   LIMIT
     20 ),
   STRUCT(0.2 AS temperature,
     TRUE AS FLATTEN_JSON_OUTPUT));     

Обратите внимание на поле ml_generate_text_llm_result в результатах; оно содержит краткое описание фильма.

9. Создание векторных представлений текста с использованием удаленной модели.

Теперь вы можете объединить созданные вами структурированные данные с другими структурированными данными в вашем хранилище. Общедоступный набор данных IMDB, доступный в BigQuery, содержит огромное количество информации о фильмах, включая оценки зрителей и некоторые примеры свободных отзывов пользователей. Эти данные могут помочь вам углубить анализ кинопостеров и понять, как эти фильмы воспринимались.

Для объединения данных потребуется ключ. В этом случае названия фильмов, сгенерированные моделью Gemini, могут не совсем точно совпадать с названиями в наборе данных IMDB.

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

Создайте удаленную модель

Для генерации текстовых векторных представлений вам потребуется создать новую удаленную модель, указывающую на конечную точку text-multilingual-embedding-002 .

  1. Создайте и выполните новый запрос, содержащий следующий SQL-запрос:
CREATE OR REPLACE MODEL `gemini_demo.text_embedding`
REMOTE WITH CONNECTION `us.gemini_conn`
OPTIONS (endpoint = 'text-multilingual-embedding-002')

В результате создается модель text_embedding , которая отображается в проводнике под набором данных gemini_demo .

Сгенерируйте текстовые вставки для заголовка и года, связанных с плакатами.

Теперь вы будете использовать эту удалённую модель с функцией ML.GENERATE_EMBEDDING для создания встраивания для каждого названия и года выпуска кинопостера.

  1. Создайте и выполните новый запрос, содержащий следующий SQL-запрос:
CREATE OR REPLACE TABLE
  `gemini_demo.movie_posters_results_embeddings` AS (
  SELECT
    *
  FROM
    ML.GENERATE_EMBEDDING(
    MODEL `gemini_demo.text_embedding`,
    (
    SELECT
      CONCAT('The movie titled ', title, ' from the year ', year,'.') AS content,
      title,
      year,
      uri
    FROM
      `gemini_demo.movie_posters_results_formatted` ),
    STRUCT(TRUE AS flatten_json_output)));

В результате создается таблица movie_poster_results_embeddings , содержащая векторные представления текстового контента, объединенного для каждой строки таблицы gemini_demo.movie_posters_results_formatted .

  1. Результаты запроса можно просмотреть, используя новый запрос, приведенный ниже:
SELECT * FROM `gemini_demo.movie_posters_results_embeddings`

Здесь вы видите векторные представления (векторы, представленные числами) для каждого фильма, сгенерированные моделью.

Сгенерировать текстовые векторные представления для подмножества данных IMDB.

Вам предстоит создать новое представление данных из общедоступного набора данных IMDB, содержащего только фильмы, выпущенные до 1935 года (известный период выхода фильмов, судя по изображениям на постерах).

  1. Создайте и выполните новый запрос, содержащий следующий SQL-запрос:
CREATE OR REPLACE VIEW
  `gemini_demo.imdb_movies` AS (
  WITH
    reviews AS (
      SELECT
        reviews.movie_id AS movie_id,
        title.primary_title AS title,
        title.start_year AS year,
        reviews.review AS review
      FROM
        `bigquery-public-data.imdb.reviews` reviews
      LEFT JOIN
        `bigquery-public-data.imdb.title_basics` title
      ON
        reviews.movie_id = title.tconst)
  SELECT
    DISTINCT(movie_id),
    title,
    year
  FROM
    reviews
  WHERE
    year < 1935)

В результате получается новое представление, содержащее список уникальных идентификаторов фильмов, названий и годов выпуска из таблицы bigquery-public-data.imdb.reviews для всех фильмов в наборе данных, выпущенных до 1935 года.

  1. Теперь вы создадите векторные представления для подмножества фильмов с IMDB, используя процесс, аналогичный предыдущему разделу. Создайте и выполните новый запрос со следующим SQL-запросом:
CREATE OR REPLACE TABLE
  `gemini_demo.imdb_movies_embeddings` AS (
  SELECT
    *
  FROM
    ML.GENERATE_EMBEDDING( MODEL `gemini_demo.text_embedding`,
      (
      SELECT
        CONCAT('The movie titled ', title, ' from the year ', year,'.') AS content,
        title,
        year,
        movie_id
      FROM
        `gemini_demo.imdb_movies` ),
      STRUCT(TRUE AS flatten_json_output) )
  WHERE
    ml_generate_embedding_status = '' );

Результатом запроса является таблица, содержащая векторные представления текстового содержимого таблицы gemini_demo.imdb_movies .

Теперь вы можете объединить две таблицы, используя функцию VECTOR_SEARCH .

  1. Создайте и выполните новый запрос, содержащий следующий SQL-запрос:
SELECT
  query.uri AS poster_uri,
  query.title AS poster_title,
  query.year AS poster_year,
  base.title AS imdb_title,
  base.year AS imdb_year,
  base.movie_id AS imdb_movie_id,
  distance
FROM
 VECTOR_SEARCH( TABLE `gemini_demo.imdb_movies_embeddings`,
   'ml_generate_embedding_result',
   TABLE `gemini_demo.movie_posters_results_embeddings`,
   'ml_generate_embedding_result',
   top_k => 1,
   distance_type => 'COSINE');

Запрос использует функцию VECTOR_SEARCH для поиска ближайшего соседа в таблице gemini_demo.imdb_movies_embeddings для каждой строки в таблице gemini_demo.movie_posters_results_embeddings . Ближайший сосед находится с использованием метрики косинусного расстояния, которая определяет степень сходства двух эмбеддингов.

Этот запрос можно использовать для поиска наиболее похожего фильма в наборе данных IMDB для каждого из фильмов, идентифицированных Gemini 1.5 Flash на постерах к фильмам. Например, вы можете использовать этот запрос, чтобы найти наиболее близкое совпадение для фильма "Au Secours!" в общедоступном наборе данных IMDB, где этот фильм упоминается по своему англоязычному названию "Help!".

  1. Создайте и выполните новый запрос для объединения дополнительной информации о рейтингах фильмов, представленной в общедоступном наборе данных IMDB:
SELECT
  query.uri AS poster_uri,
  query.title AS poster_title,
  query.year AS poster_year,
  base.title AS imdb_title,
  base.year AS imdb_year,
  base.movie_id AS imdb_movie_id,
  distance,
  imdb.average_rating,
  imdb.num_votes
FROM
  VECTOR_SEARCH( TABLE `gemini_demo.imdb_movies_embeddings`,
    'ml_generate_embedding_result',
    TABLE `gemini_demo.movie_posters_results_embeddings`,
    'ml_generate_embedding_result',
    top_k => 1,
    distance_type => 'COSINE') DATA
LEFT JOIN
  `bigquery-public-data.imdb.title_ratings` imdb
ON
  base.movie_id = imdb.tconst
ORDER BY
  imdb.average_rating DESC

Этот запрос похож на предыдущий. Он по-прежнему использует специальные числовые представления, называемые векторными вложениями, для поиска похожих фильмов на заданный постер. Однако он также объединяет средний рейтинг и количество голосов для каждого ближайшего соседнего фильма из отдельной таблицы из общедоступного набора данных IMDB.

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

Поздравляем с завершением практического задания! Вы успешно создали таблицу объектов для изображений постеров в BigQuery, создали удаленную модель Gemini, использовали эту модель для запроса к модели Gemini на анализ изображений и предоставление кратких описаний фильмов, сгенерировали текстовые встраивания для названий фильмов и использовали эти встраивания для сопоставления изображений постеров фильмов с соответствующими названиями фильмов в наборе данных IMDB.

Что мы рассмотрели

  • Как настроить среду и учетную запись для использования API
  • Как создать подключение к облачному ресурсу в BigQuery
  • Как создать набор данных и таблицу объектов в BigQuery для изображений постеров к фильмам
  • Как создать удалённые модели Gemini в BigQuery
  • Как заставить модель Gemini предоставлять краткие описания фильмов для каждого постера?
  • Как сгенерировать текстовые вставки для фильма, представленного на каждом постере.
  • Как использовать VECTOR_SEARCH в BigQuery для сопоставления изображений постеров фильмов с похожими фильмами в наборе данных.

Дальнейшие шаги / узнать больше

11. Опрос

Как вы будете использовать этот учебный материал?

Прочитайте только до конца. Прочитайте текст и выполните упражнения.