1. Обзор
Что такое управление основными данными?
Управление основными данными (MDM) — это создание единого надежного источника достоверных данных для наиболее важных данных вашей организации. Представьте себе тщательно организованную библиотеку, в которой каждая книга (точка данных) правильно помечена, актуальна и ее легко найти.
Основные данные представляют собой основные, основополагающие бизнес-объекты, которые необходимы для деятельности компании. Вот ключевые элементы основных данных:
- Бизнес-субъекты: такие сущности, как клиенты, продукты, поставщики, местоположения и сотрудники, которые являются существительными, вокруг которых вращается ваш бизнес.
- Идентификаторы: уникальные идентификаторы, которые гарантируют, что каждый объект отличен и прослеживается в разных системах.
- Атрибуты : характеристики, описывающие каждую сущность, например, адрес клиента, цена продукта и т. д.
Чтобы помочь вам лучше понять основные данные, давайте сравним их с транзакционными данными. Транзакционные данные фиксируют отдельные события (покупка, отгрузка и т. д.). Принимая во внимание, что основные данные обеспечивают контекст для этих событий, определяя задействованные объекты. Например, транзакция продажи связана с основными данными клиента, продукта и продавца.
Хотя внедрение надежного MDM имеет важное значение для принятия стратегических решений, оно может быть сложным и ресурсоемким. Именно здесь вступает в игру преобразующая сила генеративного искусственного интеллекта, особенно таких моделей, как Gemini 1.0 Pro, Gemini 1.0 Pro Vision, Gemini 1.5 Pro.
2. Цель
В этой лаборатории кода вы продемонстрируете, как Gemini 1.0 Pro упрощает приложения для управления основными данными, такие как обогащение и дедупликация, для данных citibike_stations, доступных в общедоступном наборе данных BigQuery.
Что вы будете использовать
- Общедоступный набор данных BigQuery
bigquery-public-data.new_york_citibike
. - Вызов функции Gemini (облачная функция Java, которая получает информацию об адресе с помощью API обратного геокодирования для координат, доступных в данных citibike_stations).
- API Vertex AI Embeddings и векторный поиск в BigQuery для выявления дубликатов.
Что ты построишь
- Для этого варианта использования вы создадите набор данных BigQuery. В этом наборе данных вы создадите целевую таблицу с данными из таблицы общедоступного набора данных
bigquery-public-data.new_york_citibike.citibike_stations
. - Вы развернете облачную функцию, включающую вызов функции Gemini для стандартизации адресов.
- Вы сохраните расширенные данные об адресах в целевых таблицах (из двух источников, предоставленных для этой демонстрации).
- Вы вызовете API Vertex AI Embeddings из BigQuery для данных адреса.
- Вы будете использовать векторный поиск BigQuery для выявления повторяющихся записей.
На следующей диаграмме представлен поток данных и шаги, необходимые для реализации.
3. Требования
4. Прежде чем начать
- В Google Cloud Console на странице выбора проекта выберите или создайте проект Google Cloud.
- Убедитесь, что для вашего облачного проекта включена оплата. Узнайте, как проверить, включена ли оплата в проекте .
- Вы будете использовать Cloud Shell , среду командной строки, работающую в Google Cloud, в которую предварительно загружен bq. Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud.
- После подключения к Cloud Shell вы проверяете, что вы уже прошли аутентификацию и что для проекта установлен идентификатор вашего проекта, используя следующую команду:
gcloud auth list
- Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте.
gcloud config list project
- Если ваш проект не установлен, используйте следующую команду, чтобы установить его:
gcloud config set project <YOUR_PROJECT_ID>
- Перейдите на Gemini for Google Cloud Marketplace, чтобы включить API. Вы также можете использовать следующую команду в терминале Cloud Shell:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Убедитесь, что API BigQuery, BigQuery Connection, Cloud Function, Cloud Run, Vertex AI и Cloud Build включены. Альтернатива команде gcloud — через консоль по этой ссылке .
Обратитесь к документации по командам и использованию gcloud.
5. Создайте набор данных BigQuery и внешнее подключение.
Начнем с создания набора данных и подключения к облачному ресурсу.
Набор данных в BigQuery — это контейнер для всех таблиц и объектов вашего приложения.
Чтобы создать набор данных , выполните следующие действия:
- Перейдите на страницу BigQuery в консоли Google Cloud.
- На панели «Проводник» выберите проект, в котором вы хотите создать набор данных.
- Разверните параметр «Действия» (значок вертикального многоточия) и нажмите « Создать набор данных» .
- Введите
mdm_gemini
в поле «Идентификатор набора данных» . - Установите тип местоположения «
Multi-region
и примите значение по умолчанию —US(multiple regions in United States.
- Нажмите Создать набор данных .
- Убедитесь, что набор данных создан и указан под идентификатором вашего проекта на панели Проводника .
Для взаимодействия с вашей облачной функцией требуется подключение к BigQuery. Чтобы создать удаленную функцию, необходимо создать соединение с BigQuery. В этой лаборатории кода мы будем использовать соединение BigLake для доступа к модели из BigQuery через функцию Cloud. Соединения BigLake помогают подключить внешний источник данных, сохраняя при этом детальный контроль доступа и безопасность BigQuery, которыми в нашем случае является API Vertex AI Gemini Pro.
Чтобы создать соединение BigLake , выполните следующие действия:
- Нажмите «Добавить» на панели «Проводник» страницы BigQuery.
- Щелкните Подключения к внешним источникам данных .
- В списке Тип подключения выберите Удаленные модели Vertex AI, Удаленные функции и BigLake (Облачный ресурс).
- В поле «Идентификатор подключения» введите имя подключения как
gemini-bq-conn
. - Установите тип местоположения «
Multi-region
и примите значение по умолчанию —US(multiple regions in United States.
- Нажмите Создать соединение .
- Нажмите Перейти к подключению, а затем скопируйте идентификатор учетной записи службы в области сведений о подключении .
- Перейдите на страницу IAM и администратора и нажмите «Предоставить доступ» .
- Вставьте идентификатор сервисной учетной записи в поле Новые принципы .
- Выберите роль
Vertex AI user
из списка ролей и нажмите «Сохранить» .
Теперь вы успешно создали набор данных и соединение с BigQuery.
6. Развертывание вызова функции Gemini (функция Java Cloud)
Выполните следующие действия, чтобы развернуть облачную функцию Java, включающую вызов функции Gemini.
- Клонируйте репозиторий github из терминала Cloud Shell, используя следующую команду:
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
- Замените заполнители
YOUR_API_KEY
иYOUR_PROJECT_ID
своими значениями.
Если вы прочитаете блог здесь , вы узнаете, что реализации вызова функций используют API обратного геокодирования . Создать свой API_KEY можно по инструкции здесь .
- В терминале Cloud Shell перейдите в недавно клонированный каталог проекта GeminiFunctionCalling и выполните следующий оператор, чтобы создать и развернуть облачную функцию:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http
Скажите «да», когда появится вопрос «Разрешить неаутентифицированные вызовы». В идеале вы должны настроить аутентификацию для своих корпоративных приложений по рекомендации. Но поскольку это демонстрационное приложение, мы будем действовать без аутентификации.
Выходные данные представляют собой URL-адрес REST в следующем формате:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling
- Проверьте эту облачную функцию, выполнив следующую команду из терминала:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'
Ответ на запрос случайной выборки:
'{"replies":["{ \"DOOR_NUMBER\": \"277\", \"STREET_ADDRESS\": \"Bedford Ave\", \"AREA\":
null, \"CITY\": \"Brooklyn\", \"TOWN\": null, \"COUNTY\": \"Kings County\", \"STATE\":
\"NY\", \"COUNTRY\": \"USA\", \"ZIPCODE\": \"11211\", \"LANDMARK\": null}}```"]}'
Параметры запроса и ответа этой облачной функции реализованы способом, совместимым с удаленным вызовом функции BigQuery. Его можно напрямую использовать из данных BigQuery на месте. Это означает, что если ваши входные данные (данные широты и долготы) находятся в BigQuery, вы можете вызвать удаленную функцию для данных и получить ответ функции, который можно сохранить или обработать непосредственно в BigQuery.
- Запустите следующий DDL из BigQuery, чтобы создать удаленную функцию, которая вызывает эту развернутую облачную функцию:
CREATE OR REPLACE FUNCTION
`mdm_gemini.MDM_GEMINI` (latlng STRING) RETURNS STRING
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (
endpoint = 'https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling', max_batching_rows = 1
);
Тестовый запрос на использование новой созданной удаленной функции:
ВЫБЕРИТЕ mdm_gemini.MDM_GEMINI
(широта) из предела 1 mdm_gemini.CITIBIKE_STATIONS;
Если тестовый запрос, использующий новую удаленную функцию, созданную в BigQuery, завершится неудачей из-за проблемы с разрешениями облачных функций, перейдите в раздел «Облачные функции» из Google Cloud Console и найдите развернутую облачную функцию с именем « gemini-fn-calling». Перейдите на вкладку «Разрешения», добавьте участника как «allUsers» и назначьте роль «Вызов облачных функций», чтобы убедиться, что облачные функции доступны всем пользователям (только потому, что это демонстрационное приложение).
7. Попробуйте обходной путь
Если у вас нет необходимого API_KEY для подхода к вызову функции обратного геокодирования или по какой-то причине у вас не развернута облачная функция, вы можете сделать следующее в качестве альтернативы:
- Загрузите файл CITIBIKE_STATIONS.csv из репозитория в папку проекта Cloud Shell и перейдите в эту папку.
- Экспортируйте данные из CSV в новый набор данных BigQuery
mdm_gemini
используя следующую команду в терминале Cloud Shell:
bq load --source_format=CSV --skip_leading_rows=1 mdm_gemini.CITIBIKE_STATIONS ./CITIBIKE_STATIONS.csv \ name:string,latlng:string,capacity:numeric,num_bikes_available:numeric,num_docks_available:numeric,last_reported:timestamp,full_address_string:string
8. Создайте таблицу и дополните адресные данные.
Шаг 1. Создайте таблицу.
Imp: пропустите этот шаг, если вы использовали обходной путь, поскольку таблица уже должна быть создана.
Если вы не использовали обходной путь, запустите следующий DDL в редакторе BigQuery SQL:
CREATE TABLE mdm_gemini.CITIBIKE_STATIONS as (
select name, latitude || ',' || longitude as latlong, capacity, num_bikes_available, num_docks_available,last_reported,
'' as full_address_string
from bigquery-public-data.new_york_citibike.citibike_stations) ;
Теперь давайте обогатим адресные данные, вызвав удаленную функцию для координат широты и долготы, доступных в таблице. Установите следующие условия для данных:
- Сообщается в 2024 году.
- Количество доступных велосипедов > 0
- Вместимость > 100
Запустите следующий запрос:
update `mdm_gemini.CITIBIKE_STATIONS`
set full_address_string = `mdm_gemini.MDM_GEMINI`(latlong)
where EXTRACT(YEAR FROM last_reported) = 2024 and num_bikes_available > 0 and capacity > 100;
Шаг 2. Создайте второй источник данных о местоположении велостанции.
Не пропускайте этот шаг, даже если вы использовали обходной путь для создания таблицы.
На этом этапе вы создадите второй источник данных о местоположении велосипедной станции для целей этой лаборатории кода. Это должно продемонстрировать, что MDM объединяет данные из нескольких источников и выявляет золотую истину.
Запустите следующие DDL в редакторе BigQuery SQL, чтобы создать второй источник данных о местоположении с двумя записями в нем. Назовем эту таблицу mdm_gemini.CITIBIKE_STATIONS_SOURCE2
и вставим в нее две записи.
CREATE TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE2 (name STRING(55), address STRING(1000), embeddings_src ARRAY<FLOAT64>);
insert into mdm_gemini.CITIBIKE_STATIONS_SOURCE2 VALUES ('Location broadway and 29','{ "DOOR_NUMBER": "1593", "STREET_ADDRESS": "Broadway", "AREA": null, "CITY": "New York", "TOWN": null, "COUNTY": "New York County", "STATE": "NY", "COUNTRY": "USA", "ZIPCODE": "10019", "LANDMARK": null}', null);
insert into mdm_gemini.CITIBIKE_STATIONS_SOURCE2 VALUES ('Allen St & Hester','{ "DOOR_NUMBER": "36", "STREET_ADDRESS": "Allen St", "AREA": null, "CITY": "New York", "TOWN": null, "COUNTY": "New York County", "STATE": "NY", "COUNTRY": "USA", "ZIPCODE": "10002", "LANDMARK": null}', null);
9. Создание вложений для адресных данных
Вложения — это многомерные числовые векторы, которые представляют данный объект, например фрагмент текста или аудиофайл. Модели машинного обучения (ML) используют внедрения для кодирования семантики таких объектов, чтобы их было легче анализировать и сравнивать. Например, обычной операцией в моделях кластеризации, классификации и рекомендаций является измерение расстояния между векторами в пространстве внедрения, чтобы найти элементы, которые наиболее семантически похожи. API встраивания текста Vertex AI позволяет создавать встраивание текста с помощью генеративного ИИ в Vertex AI. Встраивание текста — это числовое представление текста, которое фиксирует отношения между словами и фразами. Подробнее о встраивании текста Vertex AI здесь .
- Запустите приведенный ниже DDL, чтобы создать удаленную модель для API встраивания текста Vertex AI:
CREATE OR REPLACE MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (ENDPOINT = 'textembedding-gecko@latest');
- Теперь, когда модель удаленного внедрения готова, давайте сгенерируем внедрения для первого источника и сохраним его в таблице, используя следующий запрос:
CREATE TABLE `mdm_gemini.CITIBIKE_STATIONS_SOURCE1` AS (
SELECT *
FROM ML.GENERATE_EMBEDDING(
MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`,
( select name, full_address_string as content from `mdm_gemini.CITIBIKE_STATIONS`
where full_address_string is not null )
)
);
Вместо создания новой таблицы вы также можете сохранить поле результата внедрения в той же таблице mdm_gemini.CITIBIKE_STATIONS , которую вы создали ранее.
- Чтобы создать внедрения для адресных данных в таблице CITIBIKE_STATIONS_SOURCE2, выполните следующий запрос:
update `mdm_gemini.CITIBIKE_STATIONS_SOURCE2` a set embeddings_src =
(
SELECT ml_generate_embedding_result
FROM ML.GENERATE_EMBEDDING(
MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`,
( select name, address as content from `mdm_gemini.CITIBIKE_STATIONS_SOURCE2` ))
where name = a.name) where name is not null;
Это должно создать вложения для второго источника. Обратите внимание, что мы создали поле внедрения в той же таблице CITIBIKE_STATIONS_SOURCE2 .
- Чтобы визуализировать внедрения, созданные для таблиц исходных данных 1 и 2, выполните следующий запрос:
select name,address,embeddings_src from `mdm_gemini.CITIBIKE_STATIONS_SOURCE2`;
select name,content,ml_generate_embedding_result from `mdm_gemini.CITIBIKE_STATIONS_SOURCE1`;
Теперь давайте продолжим и выполним векторный поиск для выявления дубликатов.
10. Запустите векторный поиск для выявления повторяющихся адресов.
На этом этапе вы выполните поиск в столбце встраивания адресов ml_generate_embedding_result таблицы mdm_gemini.CITIBIKE_STATIONS_SOURCE1 для двух верхних вложений, соответствующих каждой строке данных в столбце embeddings_src таблицы mdm_gemini.CITIBIKE_STATIONS_SOURCE2 .
Для этого выполните следующий запрос:
select query.name name1,base.name name2,
/* (select address from mdm_gemini.CITIBIKE_STATIONS_SOURCE2 where name = query.name) content1, base.content content2, */
distance
from VECTOR_SEARCH(
TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE1,
'ml_generate_embedding_result',
(SELECT * FROM mdm_gemini.CITIBIKE_STATIONS_SOURCE2),
'embeddings_src',
top_k => 2
) where query.name <> base.name
order by distance desc;
Таблица, к которой мы запрашиваем: mdm_gemini.CITIBIKE_STATIONS_SOURCE1
в поле ml_generate_embedding_result
Таблица, которую мы используем в качестве базовой: mdm_gemini.CITIBIKE_STATIONS_SOURCE2
в поле embeddings_src
top_k: указывает количество возвращаемых ближайших соседей. Значение по умолчанию — 10. Отрицательное значение рассматривается как бесконечность, что означает, что все значения считаются соседними и возвращаются.
distance_type: указывает тип метрики, которая будет использоваться для вычисления расстояния между двумя векторами. Поддерживаемые типы расстояний: евклидово и косинус . По умолчанию используется евклидово значение .
Результат запроса следующий:
Как видите, здесь перечислены два ближайших соседа (другими словами, ближайшие дубликаты) для двух строк в CITIBIKE_STATIONS_SOURCE2
из CITIBIKE_STATIONS_SOURCE1
. Поскольку distance_type
не указан, предполагается, что он евклидов, и расстояние читается как расстояния в значениях адреса ТЕКСТ между двумя источниками, наименьшее из которых соответствует наиболее похожим текстам адресов.
Давайте установим для distance_type
значение Cosine, используя следующий запрос:
select query.name name1,base.name name2,
/* (select address from mdm_gemini.CITIBIKE_STATIONS_SOURCE2 where name = query.name) content1, base.content content2, */
distance
from VECTOR_SEARCH(
TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE1,
'ml_generate_embedding_result',
(SELECT * FROM mdm_gemini.CITIBIKE_STATIONS_SOURCE2),
'embeddings_src',
top_k => 2,distance_type => 'COSINE'
) where query.name <> base.name
order by distance desc;
Результат запроса следующий:
Оба запроса (оба типа расстояния) упорядочены по убыванию расстояния, что означает, что мы хотим перечислить результаты в порядке убывания расстояния. Но вы заметите, что порядок расстояний во втором запросе обратный. Можете ли вы догадаться, почему?
Да!! Вы поняли это правильно! В косинусном сходстве большее число означает большее сходство и меньшее расстояние. В евклидовом расстоянии большее число означает большее расстояние между значениями.
Дополнительную информацию о понимании MDM и советы по пониманию разницы и применения евклида и косинуса можно найти в блоге .
11. Очистка
Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом посте, выполните следующие действия:
- В консоли Google Cloud перейдите на страницу «Управление ресурсами» .
- В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить» .
- В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить работу» , чтобы удалить проект.
- Если вы хотите сохранить свой проект, пропустите вышеуказанные шаги и удалите функцию облака, перейдя к функциям облака и в списке функций отметьте ту, которую хотите удалить, и нажмите «Удалить» .
12. Поздравления
Поздравляем! Вы продемонстрировали возможности использования Gemini 1.0 Pro и вызова функций при преобразовании нескольких действий MDM в упрощенные, но мощные, детерминированные и надежные возможности генеративного ИИ. Теперь, когда вы знаете, можете смело определять другие способы реализации того же варианта использования или других функций MDM. Есть ли наборы данных, которые вы могли бы проверить, пробелы в информации, которые вы могли бы заполнить, или задачи, которые можно было бы автоматизировать с помощью структурированных вызовов, встроенных в ваши генеративные ответы ИИ? Более подробные инструкции см. в документации по Vertex AI , удаленным функциям BigQuery , облачным функциям , внедрениям и векторному поиску . Вот репозиторий GitHub для этого проекта. Дайте нам знать, что вы создадите с помощью этого обучения!