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 public dataset
bigquery-public-data.new_york_citibike. - Вызов функции Gemini (облачная функция Java, которая получает информацию об адресе, используя API обратного геокодирования для координат, доступных в данных citibike_stations).
- API встраивания ИИ от Vertex и векторный поиск в BigQuery для выявления дубликатов.
Что вы построите
- Для решения поставленной задачи вам потребуется создать набор данных BigQuery. В этом наборе данных вы создадите целевую таблицу с данными из общедоступной таблицы
bigquery-public-data.new_york_citibike.citibike_stations. - Вы развернете облачную функцию, которая включает в себя Gemini Function Calling для стандартизации адресов.
- Обогащенные адресные данные будут храниться в таблицах целевых страниц (из двух источников, предоставленных для этой демонстрации).
- Вам потребуется использовать API Vertex AI Embeddings из BigQuery для обработки адресных данных.
- Для выявления повторяющихся записей вы будете использовать функцию векторного поиска BigQuery.
Следующая диаграмма иллюстрирует поток данных и этапы реализации.

3. Требования
4. Прежде чем начать
- В консоли Google Cloud на странице выбора проекта выберите или создайте проект 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 через облачную функцию. Подключения 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 Function)
Выполните следующие шаги для развертывания Java Cloud Function, включающей вызов функций 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
Ответьте «да» на вопросы «Разрешить неаутентифицированные вызовы». В идеале, согласно рекомендациям, следует настроить аутентификацию для корпоративных приложений. Но поскольку это демонстрационное приложение, мы будем использовать неаутентифицированный режим.
В результате вы получите REST-URL в следующем формате:
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
);
Проверьте запрос, чтобы использовать созданную новую удаленную функцию:
SELECT mdm_gemini.MDM_GEMINI (latlong) from mdm_gemini.CITIBIKE_STATIONS limit 1;
Если тестовый запрос, использующий новую удаленную функцию, созданную в BigQuery, завершается с ошибкой из-за проблем с разрешениями Cloud Functions, перейдите в Cloud Functions в консоли Google Cloud и найдите развернутую функцию Cloud Functions с именем " gemini-fn-calling". Перейдите на вкладку "Разрешения", добавьте субъект "allUsers" и предоставьте роль "Cloud Functions Invoker", чтобы убедиться, что Cloud Functions доступна всем пользователям (только поскольку это демонстрационное приложение).
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: Создайте таблицу
Важно: пропустите этот шаг, если вы уже использовали обходной путь, поскольку таблица, скорее всего, уже была создана.
Если вы еще не использовали обходной путь, выполните следующий DDL-скрипт в редакторе SQL BigQuery:
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-скрипты в редакторе SQL BigQuery для создания второго источника данных о местоположении с двумя записями. Назовем эту таблицу 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. Сгенерируйте векторные представления для адресных данных.
Эмбеддинги — это многомерные числовые векторы, представляющие заданную сущность, например, фрагмент текста или аудиофайл. Модели машинного обучения (МО) используют эмбеддинги для кодирования семантики таких сущностей, чтобы упростить их анализ и сравнение. Например, распространенной операцией в моделях кластеризации, классификации и рекомендаций является измерение расстояния между векторами в пространстве эмбеддингов для поиска наиболее семантически похожих элементов. 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;
Это должно создать эмбеддинги для второго источника. Обратите внимание, что мы создали поле embeddings в той же таблице 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 для этого проекта. Расскажите нам, что вы создадите, используя эти знания!