간소화된 마스터 데이터 관리: 일치 및 생성형 AI와 병합하세요

1. 개요

마스터 데이터 관리란 무엇인가요?

마스터 데이터 관리 (MDM)는 조직의 가장 중요한 데이터에 대한 신뢰할 수 있는 단일 정보 소스를 만드는 데 중점을 둡니다. 모든 책 (데이터 포인트)에 올바른 라벨이 지정되어 있고 최신 상태이며 쉽게 찾을 수 있는 세심하게 정리된 도서관을 상상해 보세요.

마스터 데이터는 회사의 운영에 필수적인 핵심 기반 비즈니스 엔티티를 나타냅니다. 마스터 데이터의 주요 요소는 다음과 같습니다.

  • 비즈니스 항목: 고객, 제품, 공급업체, 위치, 직원과 같은 항목으로, 비즈니스의 중심이 되는 명사입니다.
  • 식별자: 시스템 전반에서 각 항목을 고유하게 식별하고 추적할 수 있도록 하는 고유 식별자
  • 속성: 각 항목을 설명하는 특성입니다(예: 고객의 주소, 제품의 가격 등).

마스터 데이터를 더 잘 이해할 수 있도록 트랜잭션 데이터와 비교해 보겠습니다. 거래 데이터는 개별 이벤트 (구매, 배송 등)를 포착합니다. 반면 마스터 데이터는 관련 항목을 정의하여 이러한 이벤트의 컨텍스트를 제공합니다. 예를 들어 판매 거래는 고객, 제품, 영업사원의 마스터 데이터에 연결됩니다.

강력한 MDM을 구현하는 것은 전략적 의사결정에 필수적이지만 복잡하고 리소스 집약적일 수 있습니다. 이때 생성형 AI, 특히 Gemini 1.0 Pro, Gemini 1.0 Pro Vision, Gemini 1.5 Pro와 같은 모델의 혁신적인 힘이 발휘됩니다.

2. 목표

이 Codelab에서는 BigQuery 공개 데이터 세트에서 사용할 수 있는 citibike_stations 데이터에 대해 Gemini 1.0 Pro가 보강 및 중복 삭제와 같은 마스터 데이터 관리 애플리케이션을 간소화하는 방법을 보여줍니다.

사용하는 기능

  1. BigQuery 공개 데이터 세트 bigquery-public-data.new_york_citibike
  2. Gemini 함수 호출 (citibike_stations 데이터에서 사용할 수 있는 좌표에 리버스 지오코딩 API를 사용하여 주소 정보를 가져오는 Java Cloud Functions)
  3. Vertex AI Embeddings API와 BigQuery의 벡터 검색을 사용하여 중복을 식별합니다.

빌드할 항목

  1. 사용 사례에 사용할 BigQuery 데이터 세트를 만듭니다. 이 데이터 세트에서는 공개 데이터 세트 테이블 bigquery-public-data.new_york_citibike.citibike_stations의 데이터로 방문 페이지 테이블을 만듭니다.
  2. 주소 표준화를 위한 Gemini 함수 호출이 포함된 Cloud 함수를 배포합니다.
  3. 이 데모에 제공된 두 소스의 풍부한 주소 데이터를 방문 페이지 테이블에 저장합니다.
  4. 주소 데이터에 대해 BigQuery에서 Vertex AI Embeddings API를 호출합니다.
  5. BigQuery 벡터 검색을 사용하여 중복 레코드를 식별합니다.

다음 다이어그램은 구현과 관련된 데이터 흐름과 단계를 나타냅니다.

사용 사례의 대략적인 흐름

3. 요구사항

  • 브라우저(Chrome 또는 Firefox 등)
  • 결제가 사용 설정된 Google Cloud 프로젝트.

4. 시작하기 전에

  1. Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
  2. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요 .
  3. bq가 미리 로드되어 제공되는 Google Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다. Google Cloud 콘솔 상단에서 Cloud Shell 활성화를 클릭합니다.

Cloud Shell 활성화 버튼 이미지

  1. Cloud Shell에 연결되면 다음 명령어를 사용하여 이미 인증되었는지, 프로젝트가 프로젝트 ID로 설정되었는지 확인합니다.
gcloud auth list
  1. Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project
  1. 프로젝트가 설정되지 않은 경우 다음 명령어를 사용하여 설정합니다.
gcloud config set project <YOUR_PROJECT_ID>
  1. Google Cloud를 위한 Gemini Marketplace로 이동하여 API를 사용 설정합니다. Cloud Shell 터미널에서 다음 명령어를 사용할 수도 있습니다.
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. BigQuery, BigQuery Connection, Cloud Functions, Cloud Run, Vertex AI, Cloud Build API가 사용 설정되어 있는지 확인합니다. gcloud 명령어 대신 이 링크를 사용하여 콘솔을 통해 수행할 수도 있습니다.

gcloud 명령어 및 사용법은 문서를 참조하세요.

5. BigQuery 데이터 세트 및 외부 연결 만들기

먼저 데이터 세트와 Cloud 리소스 연결을 만들어 보겠습니다.

BigQuery의 데이터 세트는 애플리케이션의 모든 테이블과 객체를 위한 컨테이너입니다.

데이터 세트를 만들려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
  2. 탐색기 패널에서 데이터 세트를 만들 프로젝트를 선택합니다.
  3. 작업 옵션 (세로 생략 기호 아이콘)을 펼치고 데이터 세트 만들기를 클릭합니다.

작업 메뉴와 데이터 세트 만들기 옵션 이미지

  1. 데이터 세트 ID 필드에 mdm_gemini를 입력합니다.
  2. 위치 유형을 Multi-region로 설정하고 기본값인 US(multiple regions in United States.을 수락합니다.
  3. 데이터 세트 만들기를 클릭합니다.
  4. 데이터 세트가 생성되어 탐색기 창의 프로젝트 ID 아래에 나열되어 있는지 확인합니다.

Cloud 함수와 상호작용하려면 BigQuery 연결이 필요합니다. 원격 함수를 만들려면 BigQuery 연결을 만들어야 합니다. 이 Codelab에서는 BigLake 연결을 사용하여 Cloud 함수를 통해 BigQuery에서 모델에 액세스합니다. BigLake 연결을 사용하면 세분화된 BigQuery 액세스 제어 및 보안을 유지하면서 외부 데이터 소스를 연결할 수 있습니다. 여기에서는 Vertex AI Gemini Pro API입니다.

BigLake 연결을 만들려면 다음 단계를 따르세요.

  1. BigQuery 페이지의 탐색기 창에서 추가를 클릭합니다.

외부 연결을 추가하기 위해 추가 버튼이 강조 표시된 BigQuery 콘솔

  1. 외부 데이터 소스에 연결을 클릭합니다.
  2. '연결 유형' 목록에서 Vertex AI 원격 모델, 원격 함수, BigLake (Cloud 리소스)를 선택합니다.
  3. 연결 ID 필드에 연결 이름을 gemini-bq-conn로 입력합니다.
  4. 위치 유형을 Multi-region로 설정하고 기본값인 US(multiple regions in United States.을 수락합니다.
  5. 연결 만들기를 클릭합니다.
  6. 연결로 이동을 클릭한 다음 연결 정보 창에서 서비스 계정 ID를 복사합니다.

연결 정보 스크린샷

  1. IAM 및 관리자 페이지로 이동하여 액세스 권한 부여를 클릭합니다.
  2. 새 주 구성원 필드에 서비스 계정 ID를 붙여넣습니다.
  3. 역할 목록에서 Vertex AI user 역할을 선택한 다음 저장을 클릭합니다.

서비스 계정에 대한 액세스 권한 부여 스크린샷

이제 데이터 세트와 BigQuery 연결을 만들었습니다.

6. Gemini 함수 호출 (Java Cloud 함수) 배포

다음 단계에 따라 Gemini 함수 호출이 포함된 Java Cloud 함수를 배포합니다.

  1. Cloud Shell 터미널에서 다음 명령어를 사용하여 github 저장소를 클론합니다.
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  1. 자리표시자 YOUR_API_KEYYOUR_PROJECT_ID을 값으로 바꿉니다.

여기에서 블로그를 읽어보면 함수 호출 구현이 Reverse Geocoding API를 사용한다는 것을 알 수 있습니다. 여기의 안내에 따라 API_KEY를 직접 만들 수 있습니다.

  1. Cloud Shell 터미널에서 새로 클론된 프로젝트 디렉터리 GeminiFunctionCalling으로 이동하고 다음 명령문을 실행하여 Cloud 함수를 빌드하고 배포합니다.
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

'인증되지 않은 호출 허용' 질문이 표시되면 'y'라고 말합니다. 권장사항에 따라 엔터프라이즈 애플리케이션에 대한 인증을 설정하는 것이 좋습니다. 하지만 데모 앱이므로 인증되지 않은 상태로 진행합니다.

출력은 다음 형식의 REST URL입니다.

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling

  1. 터미널에서 다음 명령어를 실행하여 이 Cloud 함수를 테스트합니다.
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}}```"]}'

이 Cloud 함수의 요청 및 응답 매개변수는 BigQuery의 원격 함수 호출과 호환되는 방식으로 구현됩니다. BigQuery 데이터에서 직접 사용할 수 있습니다. 즉, 데이터 입력 (위도 및 경도 데이터)이 BigQuery에 있는 경우 데이터에서 원격 함수를 호출하고 BigQuery 내에서 직접 저장하거나 처리할 수 있는 함수 응답을 가져올 수 있습니다.

  1. BigQuery에서 다음 DDL을 실행하여 배포된 Cloud 함수를 호출하는 원격 함수를 만듭니다.
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 권한 문제로 인해 실패하면 Google Cloud 콘솔에서 Cloud Functions로 이동하여 배포된 Cloud 함수 이름이 "gemini-fn-calling"인지 확인합니다. 권한 탭으로 이동하여 주 구성원을 'allUsers'로 추가하고 'Cloud Functions 호출자' 역할을 부여하여 모든 사용자가 Cloud Functions에 액세스할 수 있도록 합니다 (데모 앱이므로).

7. 해결 방법 시도

역 지오코딩 함수 호출 접근 방식에 필요한 API_KEY가 없거나 어떤 이유로 Cloud 함수가 배포되지 않은 경우 다음을 대안으로 수행할 수 있습니다.

  1. 저장소에서 CITIBIKE_STATIONS.csv 파일을 Cloud Shell 프로젝트 폴더에 다운로드하고 해당 폴더로 이동합니다.
  2. Cloud Shell 터미널에서 다음 명령어를 사용하여 csv의 데이터를 새 BigQuery 데이터 세트 mdm_gemini로 내보냅니다.
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단계: 테이블 만들기

중요: 해결 방법을 사용한 경우 이미 테이블을 만들었으므로 이 단계를 건너뛰세요.

해결 방법을 사용하지 않은 경우 BigQuery SQL 편집기에서 다음 DDL을 실행합니다.

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단계: 자전거 대여소 위치 데이터의 두 번째 소스 만들기

해결 방법을 사용하여 테이블을 만든 경우에도 이 단계를 건너뛰지 마세요.

이 단계에서는 이 Codelab의 목적으로 자전거 대여소 위치 데이터의 두 번째 소스를 만듭니다. 이는 MDM이 여러 소스의 데이터를 통합하고 골든 레코드를 식별한다는 것을 보여주기 위한 것입니다.

BigQuery SQL 편집기에서 다음 DDL을 실행하여 레코드가 2개인 두 번째 위치 데이터 소스를 만듭니다. 이 테이블의 이름을 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) 모델은 임베딩을 사용하여 이러한 항목에 대한 시맨틱스를 인코딩함으로써 손쉽게 추론하고 비교할 수 있도록 합니다. 예를 들어 클러스터링, 분류, 추천 모델에서 일반적인 작업은 임베딩 공간에서 벡터 간 거리를 측정하여 의미론적으로 가장 유사한 항목을 찾는 것입니다. Vertex AI 텍스트 임베딩 API를 사용하면 Vertex AI에서 생성형 AI를 사용하여 텍스트 임베딩을 만들 수 있습니다. 텍스트 임베딩은 단어와 구문 간의 관계를 포착하는 텍스트의 수치적 표현입니다. Vertex AI 텍스트 임베딩에 대해 자세히 알아보려면 여기를 참고하세요.

  1. 아래 DDL을 실행하여 Vertex AI 텍스트 임베딩 API의 원격 모델을 만듭니다.
CREATE OR REPLACE MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (ENDPOINT = 'textembedding-gecko@latest');
  1. 이제 원격 임베딩 모델이 준비되었으므로 다음 쿼리를 사용하여 첫 번째 소스의 임베딩을 생성하고 테이블에 저장해 보겠습니다.
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 테이블에 임베딩 결과 필드를 저장할 수도 있습니다.

  1. 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. 소스 데이터 테이블 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. 중복 주소를 신고하기 위해 벡터 검색 실행

이 단계에서는 mdm_gemini.CITIBIKE_STATIONS_SOURCE1 테이블의 주소 임베딩 ml_generate_embedding_result 열에서 mdm_gemini.CITIBIKE_STATIONS_SOURCE2 테이블의 embeddings_src 열에 있는 각 데이터 행과 일치하는 상위 2개 임베딩을 검색합니다.

이렇게 하려면 다음 쿼리를 실행하세요.

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;

쿼리 중인 테이블: 필드 ml_generate_embedding_resultmdm_gemini.CITIBIKE_STATIONS_SOURCE1

기본으로 사용하는 테이블: 필드 embeddings_srcmdm_gemini.CITIBIKE_STATIONS_SOURCE2

top_k: 반환할 최근접 이웃 수를 지정합니다. 기본값은 10입니다. 음수 값은 무한대로 처리되므로 모든 값이 이웃으로 간주되어 반환됩니다.

distance_type: 두 벡터 간의 거리를 계산하는 데 사용할 측정항목의 유형을 지정합니다. 지원되는 거리 유형은 유클리드코사인입니다. 기본값은 Euclidean입니다.

쿼리 결과는 다음과 같습니다.

결과 집합

CITIBIKE_STATIONS_SOURCE1에서 CITIBIKE_STATIONS_SOURCE2의 두 행에 대해 가장 가까운 이웃 (즉, 가장 가까운 중복)이 나열되어 있습니다. distance_type가 지정되지 않았으므로 Euclidean으로 가정하고 거리는 두 소스 간의 주소 TEXT 값의 거리로 읽히며, 가장 낮은 값이 가장 유사한 주소 텍스트입니다.

다음 쿼리를 사용하여 distance_typeCosine으로 설정해 보겠습니다.

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;

쿼리 결과는 다음과 같습니다.

결과 집합 2

두 쿼리 (두 거리 유형 모두)는 거리를 기준으로 내림차순으로 정렬됩니다. 즉, 거리가 감소하는 순서로 결과를 나열하려고 합니다. 하지만 두 번째 쿼리의 거리 순서가 반대로 되어 있습니다. 이유를 추측할 수 있나요?

잘했습니다. 정답을 고르셨습니다! 코사인 유사도에서 숫자가 클수록 유사성이 높고 거리가 짧습니다. 유클리드 거리에서 숫자가 클수록 값 간 거리가 큽니다.

MDM 이해 및 유클리드와 코사인 간의 차이점과 적용을 이해하는 데 도움이 되는 팁에 대한 자세한 내용은 블로그를 참고하세요.

11. 삭제

이 게시물에서 사용한 리소스의 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력하고 종료를 클릭하여 프로젝트를 삭제합니다.
  4. 프로젝트를 유지하려면 위의 단계를 건너뛰고 Cloud Functions로 이동하여 Cloud 함수를 삭제합니다. 함수 목록에서 삭제할 함수를 선택하고 삭제를 클릭합니다.

12. 축하합니다

축하합니다. 몇 가지 MDM 활동을 단순하면서도 강력하고 결정적이며 신뢰할 수 있는 생성형 AI 기능으로 변환하는 데 Gemini 1.0 Pro와 함수 호출을 사용하는 강력한 기능을 시연했습니다. 이제 알게 되었으니 동일한 사용 사례 또는 기타 MDM 기능을 구현하는 다른 방법을 자유롭게 파악해 보세요. 생성형 AI 대답에 구조화된 호출을 삽입하여 검증할 수 있는 데이터 세트, 채울 수 있는 정보 격차 또는 자동화할 수 있는 작업이 있나요? 자세한 안내는 Vertex AI, BigQuery 원격 함수, Cloud Functions, 임베딩, 벡터 검색 문서를 참고하세요. 이 프로젝트의 GitHub 저장소는 다음과 같습니다. 이 학습을 통해 무엇을 만들었는지 알려주세요.