1. 개요
최신 genAI 통합 덕분에 완벽한 의상을 찾는 데 도움을 줄 뿐만 아니라 실시간 스타일링 조언도 제공하는 패션 앱을 상상해 보세요. 이 강연에서는 AlloyDB의 벡터 검색 기능과 Google의 ScaNN 색인을 결합하여 일치하는 의상을 빠르게 검색하고 즉각적인 패션 추천을 제공하는 앱을 빌드한 방법을 살펴봅니다.
또한 AlloyDB의 ScaNN 색인이 복잡한 쿼리를 최적화하여 맞춤 스타일 제안을 생성하는 방법을 자세히 살펴봅니다. 또한 강력한 생성형 AI 모델인 Gemini 및 Imagen을 사용하여 창의적인 스타일링 아이디어를 제공하고 맞춤형 스타일을 시각화할 수도 있습니다. 이 전체 애플리케이션은 서버리스 아키텍처를 기반으로 하여 사용자에게 원활하고 확장 가능한 환경을 제공합니다.
과제: 이 앱은 맞춤형 의상 제안을 제공하여 패션 결정에 어려움을 겪는 사람들을 돕고자 합니다. 또한 옷차림을 계획할 때의 결정 피로를 피하는 데 도움이 됩니다.
해결 방법: 이 의상 추천 앱은 사용자에게 지능적이고 맞춤설정된 매력적인 패션 경험을 제공하는 문제를 해결하면서 AlloyDB, 생성형 AI, 서버리스 기술의 기능을 보여줍니다.
빌드할 항목
이 실습에서는 다음을 수행합니다.
- AlloyDB 인스턴스 만들기 및 전자상거래 데이터 세트 로드
- AlloyDB에서 pgvector 및 생성형 AI 모델 확장 프로그램 사용 설정
- 제품 설명에서 임베딩 생성
- 서버리스 Cloud Run 함수에 솔루션 배포
- Gemini에 이미지를 업로드하고 이미지 설명 프롬프트를 생성합니다.
- 전자상거래 데이터 세트 임베딩과 함께 프롬프트를 기반으로 검색 결과를 생성합니다.
- 프롬프트를 추가하여 프롬프트를 맞춤설정하고 스타일 추천을 생성합니다.
- 서버리스 Cloud Run 함수에 솔루션 배포
요구사항
2. 아키텍처
앱의 대략적인 아키텍처는 다음과 같습니다.
다음 섹션에서는 튜토리얼의 문맥 흐름을 강조 표시합니다.
처리:
첫 번째 단계는 소매 데이터 (인벤토리, 제품 설명, 고객 상호작용)를 AlloyDB로 수집하는 것입니다.
애널리틱스 엔진:
AlloyDB를 분석 엔진으로 사용하여 다음을 실행합니다.
- 컨텍스트 추출: 엔진은 AlloyDB에 저장된 데이터를 분석하여 제품, 카테고리, 고객 행동 등의 관계를 파악합니다(해당하는 경우).
- 임베딩 생성: 사용자의 쿼리와 AlloyDB에 저장된 정보에 대해 임베딩 (텍스트의 수학적 표현)이 생성됩니다.
- 벡터 검색: 엔진이 유사성 검색을 실행하여 쿼리 임베딩을 제품 설명, 리뷰, 기타 관련 데이터의 임베딩과 비교합니다. 이렇게 하면 가장 관련성 높은 '가장 가까운 이웃' 25개가 식별됩니다.
Gemini 권장사항:
이미지 바이트 배열은 Vertex AI API를 통해 Gemini 모델에 전달되며, 여기에는 바닥 의류 추천 제안과 함께 상단 의류에 관한 텍스트 설명을 요청하는 프롬프트도 포함됩니다.
AlloyDB RAG 및 벡터 검색:
상의의 설명은 데이터베이스를 쿼리하는 데 사용됩니다. 쿼리는 검색 텍스트 (바닥 의류 일치에 관한 Gemini 모델의 추천)를 임베딩으로 변환하고 데이터베이스에 저장된 임베딩에 대해 벡터 검색을 실행하여 최근접 이웃 (일치하는 결과)을 찾습니다. AlloyDB 데이터베이스의 벡터 임베딩은 더 나은 검색을 위해 ScaNN 색인을 사용하여 색인이 생성됩니다.
응답 이미지 생성:
유효성 검사된 응답은 JSON 배열로 구성되며 전체 엔진은 에이전트 빌더에서 호출되는 서버리스 Cloud Run 함수로 패키징됩니다.
Imagen 이미지 생성:
사용자의 스타일 지정 프롬프트, 사용자가 선택한 추천, 맞춤설정 요청이 결합되어 기존 이미지가 포함된 Imagen 3이 표시됩니다. 스타일 지정 이미지는 Vertex AI API를 사용하여 이 프롬프트를 기반으로 생성됩니다.
3. 시작하기 전에
프로젝트 만들기
- Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
- Cloud 프로젝트에 결제가 사용 설정되어 있어야 하므로 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요 .
- bq가 미리 로드되어 제공되는 Google Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다. Google Cloud 콘솔 상단에서 Cloud Shell 활성화 (
)를 클릭합니다.
- Cloud Shell에 연결되면 다음 명령어를 사용하여 인증이 완료되었고 프로젝트가 프로젝트 ID로 설정되어 있는지 확인합니다.
gcloud auth list
- 다음 명령어를 실행하여 향후 gcloud 명령어에서 프로젝트를 올바르게 식별하는지 확인합니다.
gcloud config list project
- 프로젝트가 설정되지 않은 경우 다음 명령어를 사용하여 명시적으로 설정합니다.
gcloud config set project <YOUR_PROJECT_ID>
- 필요한 API를 사용 설정합니다.
링크를 따라 API를 사용 설정합니다.
API 사용 설정을 놓친 경우 구현 과정에서 언제든지 사용 설정할 수 있습니다.
gcloud 명령어 및 사용법에 관한 자세한 내용은 문서를 참고하세요.
4. 데이터베이스 설정
이 실습에서는 소매 전자상거래 데이터 세트를 저장할 데이터베이스로 AlloyDB를 사용합니다. 클러스터를 사용하여 데이터베이스 및 로그와 같은 모든 리소스를 저장합니다. 각 클러스터에는 데이터에 대한 액세스 포인트를 제공하는 기본 인스턴스가 있습니다. 테이블은 데이터를 저장하는 실제 리소스입니다.
전자상거래 데이터 세트가 로드될 AlloyDB 클러스터, 인스턴스, 테이블을 만들어 보겠습니다.
클러스터 및 인스턴스 만들기
- Google Cloud 콘솔에서 AlloyDB를 검색합니다. Cloud Console에서 대부분의 페이지를 찾는 가장 쉬운 방법은 콘솔의 검색창을 사용하는 것입니다.
- 클러스터 만들기를 클릭합니다.
- 다음 값을 사용하여 클러스터 및 인스턴스를 만듭니다.
- 클러스터 ID: '
shopping-cluster
' - 비밀번호: "
alloydb
" - PostgreSQL 15 호환
- 지역: '
us-central1
' - 네트워킹: '
default
'
- 네트워크에서 기본 네트워크를 선택하면 다음 옵션이 표시됩니다. 연결 설정을 클릭하여 기본 네트워크를 설정합니다.
- 자동으로 할당된 IP 범위 사용을 선택하고 계속을 클릭합니다. 정보를 검토한 후 연결 만들기를 클릭합니다.
기본 네트워크 생성이 완료될 때까지 기다립니다.
- 기본 인스턴스 구성에서 인스턴스 ID를
shopping-instance"
로 설정합니다.
- 클러스터 만들기를 클릭하여 다음과 같이 클러스터 설정을 완료합니다.
5. 데이터 수집
이제 매장 데이터가 포함된 표를 추가하겠습니다. 인스턴스 생성이 완료될 때까지 기다립니다. 클러스터가 생성되면 클러스터를 만들 때 설정한 사용자 인증 정보를 사용하여 AlloyDB에 로그인할 수 있습니다.
AlloyDB 데이터베이스에 인증
- Google Cloud 콘솔에서 AlloyDB로 이동합니다. 기본 클러스터를 선택한 다음 왼쪽 탐색 메뉴에서 AlloyDB 스튜디오를 클릭합니다.
- AlloyDB 데이터베이스에 인증하려면 다음 세부정보를 입력합니다.
- 사용자 이름 : '
postgres
' - 데이터베이스 : '
postgres
' - 비밀번호 : '
alloydb
'
AlloyDB 스튜디오에 성공적으로 인증하면 편집기 탭에 SQL 명령어가 입력됩니다. 첫 번째 편집기 탭 오른쪽에 있는 더하기 기호를 사용하여 여러 편집기 창을 추가할 수 있습니다.
필요에 따라 실행, 형식 지정, 지우기 옵션을 사용하여 편집기 창에 AlloyDB 명령어를 입력합니다.
확장 프로그램 사용 설정
이 앱을 빌드하려면 'pgvector"
' 및 'google_ml_integration"
' 확장 프로그램을 사용합니다.
- pgvector 확장 프로그램을 사용하면 벡터 임베딩을 저장하고 검색할 수 있습니다.
- google_ml_integration 확장 프로그램은 Vertex AI 예측 엔드포인트에 액세스하여 SQL로 예측을 가져오는 데 사용하는 함수를 제공합니다.
- 다음 DDL을 실행하여 이러한 확장 프로그램을 사용 설정합니다.
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
- 다음 SQL 명령어를 실행하여 확장 프로그램이 설치되어 있는지 확인합니다.
select extname, extversion from pg_extension;
테이블 만들기
- 다음 DDL 문을 사용하여 테이블을 만듭니다.
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
위 명령어를 실행하면 다음과 같이 표가 표시됩니다.
있다면 다음 이미지는 예를 보여줍니다.
데이터 수집
이 실습에서는 이 SQL 파일에 약 200개의 레코드로 구성된 테스트 데이터가 있습니다. id, category, sub_category, uri, image
및 content
를 포함합니다. 나머지 필드는 실습 후반부에서 작성합니다.
- AlloyDB Studio의 새 편집기 탭에서 SQL 파일의 20줄/삽입 문을 복사하고 실행을 클릭합니다.
apparels
라는 테이블이 표시될 때까지 탐색기 섹션을 펼칩니다.- 메뉴 아이콘[⋮] 을 클릭하고 쿼리를 클릭합니다. 새 편집기 탭에 SELECT 문장이 열립니다.
- 실행을 클릭하여 행이 삽입되었는지 확인합니다.
사용자에게 권한 부여
postgres
사용자에게 AlloyDB 내에서 임베딩을 생성할 수 있는 권한을 부여합니다..
AlloyDB 스튜디오에서 다음 문을 실행하여 embedding
함수에 대한 실행 권한을 postgres
사용자에게 부여합니다.
GRANT EXECUTE ON FUNCTION embedding TO postgres;
AlloyDB 서비스 계정에 Vertex AI 사용자 역할을 부여합니다.
Vertex AI의 텍스트 임베딩 모델을 사용하여 AlloyDB 서비스 계정에 Vertex AI 사용자 역할을 부여하는 임베딩을 생성합니다.
Google Cloud 콘솔에서 Cloud Shell 터미널 [ ] 아이콘을 클릭하고 다음 명령어를 실행합니다.
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
6. 빌드 컨텍스트
임베딩을 만들려면 context
, 즉 단일 필드에 포함할 모든 정보가 필요합니다. 이를 위해 apparels
테이블의 pdt_desc
열에 저장할 제품 설명을 만듭니다.
Google에서는 각 제품에 관한 모든 정보를 사용하지만 자체 데이터를 사용하는 경우 비즈니스에 의미 있는 방식으로 데이터를 엔지니어링해도 됩니다.
AlloyDB Studio 편집기 탭에서 pdt_desc
필드를 컨텍스트 데이터로 업데이트하는 다음 명령어를 실행합니다.
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
이 DML은 테이블에 있는 모든 필드의 정보와 기타 종속 항목 (사용 사례에 있는 경우)의 정보를 사용하여 간단한 컨텍스트 요약을 만듭니다. 더 정확한 정보 분류와 맥락 생성을 위해 비즈니스에 의미 있는 방식으로 데이터를 엔지니어링하세요.
7. 컨텍스트의 임베딩 만들기
컴퓨터는 텍스트를 처리하는 것보다 숫자를 처리하는 것이 훨씬 쉽습니다. 임베딩 시스템은 텍스트의 표현 방식, 사용하는 언어 등에 관계없이 텍스트를 텍스트를 나타내는 일련의 부동 소수점 수로 변환합니다.
해변가 위치를 설명해 보세요. "on the water
, beachfront
, walk from your room to the ocean
, sur la mer
, на берегу океана
등으로 불릴 수 있습니다. 이러한 용어는 모두 다르게 보이지만 의미적 의미 또는 머신러닝 용어로 보면 임베딩이 서로 매우 가깝습니다.
이제 데이터와 컨텍스트가 준비되었으므로 SQL을 실행하여 제품 설명(pdt_desc
) 열의 임베딩을 embedding
필드의 테이블에 추가합니다. 사용할 수 있는 다양한 임베딩 모델이 있습니다. Vertex AI의 text-embedding-005
를 사용합니다.
- AlloyDB 스튜디오에서 다음 명령어를 실행하여 임베딩을 생성하고 저장된 데이터의 임베딩으로
pdt_desc
열을 업데이트합니다.
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-005',
pdt_desc)
WHERE
TRUE;
- 다음 명령어를 실행하여 임베딩이 생성되었는지 확인합니다.
SELECT
id,
category,
sub_category,
content,
embedding
FROM
Apparels
LIMIT 5;
다음은 다음과 같이 쿼리의 샘플 텍스트에 대한 임베딩 벡터의 예시입니다(부동 소수점 배열처럼 보임).
8. 벡터 검색 수행
이제 테이블, 데이터, 임베딩이 모두 준비되었으므로 사용자 검색 텍스트에 대한 실시간 벡터 검색을 실행해 보겠습니다.
사용자의 검색 텍스트가 'pink color, casual, pure cotton tops for women
'이라고 가정해 보겠습니다.
이 쿼리의 일치를 찾으려면 다음 SQL 쿼리를 실행합니다.
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;
이 쿼리를 자세히 살펴보겠습니다.
이 쿼리에서
- 사용자의 검색 텍스트는 '
I want womens tops, pink casual only pure cotton.
'입니다. text-embedding-005
모델과 함께embedding()
메서드를 사용하여 이 검색 텍스트를 임베딩으로 변환합니다. 이 단계는 테이블의 모든 항목에 삽입 함수를 적용한 마지막 단계와 유사합니다.- '
<=>
'는 COSINE SIMILARITY 거리 메서드의 사용을 나타냅니다. 사용 가능한 모든 유사성 측정값은 pgvector 문서에서 확인할 수 있습니다. - 데이터베이스에 저장된 벡터와 호환되도록 임베딩 메서드의 결과를 벡터 데이터 유형으로 변환합니다.
- LIMIT 5는 검색 텍스트의 최근접 이웃 5개를 추출하겠다는 의미입니다.
다음은 이 SQL 쿼리의 응답 예시입니다.
검색 결과에서 볼 수 있듯이 검색어와 일치하는 검색어는 검색어와 매우 유사합니다. 색상을 변경하여 결과가 어떻게 달라지는지 확인해 보세요.
쿼리 성능을 위한 AlloyDB ScaNN 색인
이제 ScaNN 색인을 사용하여 이 벡터 검색 결과의 성능 (쿼리 시간), 효율성, 재현률을 높이고 싶다고 가정해 보겠습니다.
ScaNN 색인을 사용하려면 다음 단계를 따르세요.
- 이미 클러스터, 인스턴스, 컨텍스트, 임베딩이 생성되었으므로 다음 문을 사용하여 ScaNN 확장 프로그램을 설치하기만 하면 됩니다.
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- ScaNN 색인을 만듭니다.
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
위 DDL에서
apparel_index
은 색인의 이름입니다.apparels
은 테이블 이름입니다.scann
는 색인 메서드입니다.embedding
는 색인을 생성하려는 테이블의 열입니다.cosine
은 색인에 사용할 거리 메서드입니다.54
는 이 색인에 적용할 파티션 수입니다. 1~1048576 사이의 값으로 설정합니다. 이 값을 결정하는 방법에 관한 자세한 내용은 ScaNN 색인 조정을 참고하세요.
ScaNN 저장소의 권장사항에 따라 데이터 포인트 수의 제곱근을 사용했습니다. 파티션을 만들 때 num_leaves
는 대략 데이터 포인트 수의 제곱근이어야 합니다.
- 다음 쿼리를 사용하여 색인이 생성되었는지 확인합니다.
SELECT * FROM pg_stat_ann_indexes;
- 색인 없이 사용한 것과 동일한 쿼리를 사용하여 벡터 검색을 실행합니다.
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
위 쿼리는 실습의 8단계에서 사용한 쿼리와 동일합니다. 하지만 이제 ScaNN 색인을 사용하여 필드에 색인이 생성되었습니다.
- 색인 유무와 관계없이 간단한 검색 쿼리로 테스트합니다. 색인 없이 테스트하려면 색인을 삭제해야 합니다.
white tops for girls without any print
색인이 생성된 임베딩 데이터의 벡터 검색 쿼리에 위의 검색 텍스트를 사용하면 검색 결과의 품질과 효율성이 향상됩니다. 색인을 사용하면 효율성이 크게 향상됩니다 (실행 시간: ScaNN 사용 안 함 시 10.37ms, ScaNN 사용 시 0.87ms). 이 주제에 관한 자세한 내용은 이 블로그를 참고하세요.
9. LLM을 사용한 일치 유효성 검사
계속해서 애플리케이션에 가장 적합한 검색 결과를 반환하는 서비스를 만들기 전에 생성형 AI 모델을 사용하여 이러한 잠재적 응답이 실제로 관련성이 있고 사용자와 공유하기에 안전한지 검증해 보겠습니다.
인스턴스가 Gemini용으로 설정되어 있는지 확인
- 클러스터 및 인스턴스에
google_ml_integration
가 이미 사용 설정되어 있는지 확인합니다. AlloyDB 스튜디오에서 다음 명령어를 실행합니다.
show google_ml_integration.enable_model_support;
값이 '사용'으로 표시되면 다음 2단계를 건너뛰고 설정으로 바로 이동할 수 있습니다.
AlloyDB 및 Vertex AI 모델 통합
- AlloyDB 클러스터의 기본 인스턴스로 이동하여 기본 인스턴스 수정을 클릭합니다.
- 고급 구성 옵션에서 새 데이터베이스 플래그 섹션을 펼치고
google_ml_integration.enable_model_support flag
가 다음과 같이 'on
'로 설정되어 있는지 확인합니다.
3. '
on
'로 설정되어 있지 않으면 'on
'로 설정한 다음 인스턴스 업데이트를 클릭합니다.
이 단계는 몇 분 정도 걸립니다.
AlloyDB 및 Vertex AI 모델 통합
이제 AlloyDB 스튜디오에 연결하고 다음 DML 문을 실행하여 표시된 위치에서 프로젝트 ID를 사용하여 AlloyDB에서 Gemini 모델 액세스를 설정할 수 있습니다. 명령어를 실행하기 전에 문법 오류에 대한 경고가 표시될 수 있지만 명령어는 정상적으로 실행됩니다.
- Google Cloud 콘솔에서 AlloyDB로 이동합니다. 기본 클러스터를 선택한 다음 왼쪽 탐색 메뉴에서 AlloyDB 스튜디오를 클릭합니다.
google_ml_integration
확장 프로그램과 함께 기본적으로 제공되는gemini-1.5-pro:generateContent
를 사용합니다.- AlloyDB Studio에서 다음 명령어를 통해 액세스에 구성된 모델을 확인할 수 있습니다.
select model_id,model_type from google_ml.model_info_view;
- 다음 명령어를 실행하여 데이터베이스 사용자가 ml_predict_row 함수를 실행하여 Google Vertex AI 모델을 사용하여 예측을 실행할 수 있는 권한을 부여합니다.
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
응답 평가
다음 섹션에서는 애플리케이션을 실제로 Cloud Run으로 가져가는 데 하나의 대규모 쿼리를 사용하게 되지만, 쿼리의 응답이 적절하도록 하기 위해 쿼리를 이해하기 어려울 수 있습니다.
최종적으로 사용할 더 큰 쿼리를 빌드하는 개별 섹션을 살펴봅니다.
- 먼저 데이터베이스에 요청을 보내 사용자 검색어와 가장 일치하는 5개 항목을 가져옵니다. 단순성을 유지하기 위해 쿼리를 하드코딩하고 있지만 나중에 쿼리에 보간할 예정이니 걱정하지 마세요.
apparels
테이블의 제품 설명을 포함하고 설명과 색인을 결합하는 필드와 원래 요청과 결합하는 필드라는 두 가지 새 필드를 추가합니다. 이 데이터는 임시 테이블 이름인 xyz
테이블에 저장됩니다.
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
이 쿼리의 출력은 사용자 쿼리와 관련된 가장 유사한 5개의 행입니다. Google 검색을 사용한 그라운딩의 사용에는
새 테이블 xyz
에는 5개의 행이 포함되며 각 행에는 다음 열이 있습니다.
literature
content
user_text
- 응답의 유효성을 판단하기 위해 응답을 평가하는 방법을 설명하는 복잡한 쿼리를 사용합니다.
xyz
테이블의user_text
및content
를 쿼리의 일부로 사용합니다.
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- 이 쿼리를 사용하여
xyz
테이블에서 응답의 '좋음'을 검토합니다. '좋음'은 생성된 대답이 예상한 대답과 얼마나 일치하는지를 나타냅니다.
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
predict_row
는 결과를 JSON 형식으로 반환합니다. 코드 '-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"
는 해당 JSON에서 실제 텍스트를 추출하는 데 사용됩니다. 반환된 실제 JSON을 보려면 이 코드를 삭제하면 됩니다.- 마지막으로 LLM 필드를 가져오려면 x 표에서 추출하면 됩니다.
SELECT
LLM_RESPONSE
FROM
x;
- 다음과 같이 단일 쿼리로 결합할 수 있습니다.
경고: 위의 쿼리를 실행하여 중간 결과를 확인한 경우
이 쿼리를 실행하기 전에 AlloyDB 데이터베이스에서 xyz
및 x
테이블을 삭제해야 합니다.
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
더 큰 쿼리는 이전 단계에서 실행한 모든 쿼리의 조합입니다. 결과에는 일치 여부, 일치 비율, 등급에 대한 설명이 표시됩니다.
Gemini 모델은 기본적으로 스트리밍이 사용 설정되어 있으므로 실제 응답이 여러 줄에 걸쳐 표시됩니다.
10. 애플리케이션을 웹으로 가져가기
이제 인터넷에서 액세스할 수 있도록 이 애플리케이션을 호스팅합니다.
Cloud Run 함수 만들기
- Google Cloud 콘솔에서 다음 링크를 사용하여 Cloud Run 함수로 이동합니다.
https://console.cloud.google.com/run/create?deploymentType=function
- Configure에서 Function Name을 'retail-engine'으로 설정하고 리전을 'us-central1'로 선택합니다.
- 엔드포인트 URL에서 런타임을 Java 17으로 선택합니다.
- 인증에서 인증되지 않은 호출 허용을 선택합니다.
- 컨테이너, 볼륨, 네트워킹, 보안을 펼치고 네트워킹 탭을 클릭합니다.
- 아웃바운드 트래픽을 위해 VPC에 연결을 선택한 다음 서버리스 VPC 액세스 커넥터 사용을 클릭합니다.
- 네트워크에서 새 VPC 커넥터 추가를 클릭합니다. 서버리스 VPC 액세스 API가 아직 사용 설정되지 않았다면 사용 설정합니다.
- 커넥터 만들기에서 이름을
alloydb-test-conn
로 설정합니다. - 리전을
us-central
로 설정합니다. - 네트워크 값은 default로 두고 서브넷을 커스텀 IP 범위로 설정하고 IP 범위로 10.8.0.0 또는 사용 가능한 유사한 값을 사용합니다.
- 확장 표시 설정을 펼치고 최소 인스턴스 수를 2로, 최대 인스턴스 수를 3으로 설정합니다.
- 인스턴스 유형을 f1-micro로 선택합니다. 다음은 커넥터 만들기 옵션을 보여줍니다.
- '만들기'를 클릭하여 커넥터를 만듭니다.
- 트래픽 라우팅에서 모든 트래픽을 VPC로 라우팅을 선택합니다.
- 만들기를 클릭하여 함수를 만듭니다.
애플리케이션 배포
함수가 생성된 후 소스를 업데이트하고 애플리케이션을 다시 배포합니다.
- Cloud Run에서 서비스 탭을 클릭하고 retail-engine 함수를 클릭합니다.
- 소스 탭을 클릭합니다. 기본 함수 진입점을 '
gcfv2.HelloHttpFunction
'로 설정합니다. - HelloHttpFunction.java 파일의 콘텐츠를 이 Java 파일의 콘텐츠로 바꿉니다.
- AlloyDB 인스턴스 및 클러스터의 세부정보에 따라 파일의 AlloyDbJdbcConnector 세부정보를 업데이트합니다.
$PROJECT_ID
를 AlloyDB 클러스터 및 인스턴스의 프로젝트 ID로 바꿉니다.
- pom.xml 파일의 콘텐츠를 이 XML 파일의 콘텐츠로 바꿉니다.
- 저장 및 재배포를 클릭하여 함수를 배포합니다.
11. 소매 엔진 애플리케이션 테스트
업데이트된 Cloud 함수가 배포되면 다음 형식의 엔드포인트가 표시됩니다.
https://retail-engine-PROJECT_NUMBER.us-central1.run.app
다음 명령어를 실행하여 Cloud Shell 터미널에서 테스트할 수 있습니다.
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
또는 다음과 같이 Cloud Run 함수를 테스트할 수 있습니다.
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
결과는 다음과 같습니다.
이제 AlloyDB 데이터에서 임베딩 모델을 사용하여 유사성 벡터 검색을 실행했으므로 이러한 임베딩을 이미지와 함께 사용하고 스타일 제안을 생성하라는 메시지를 표시하는 애플리케이션을 만들어 보겠습니다.
12. 의상 추천 흐름 이해
의상 추천 앱은 AlloyDB 소매 엔진 애플리케이션에서 Gemini 및 Imagen과 함께 만든 임베딩을 사용하여 시각적 의상 스타일 지정 옵션을 생성하도록 구성된 스프린트 부팅 애플리케이션입니다. 또한 맞춤 프롬프트를 추가하고 추천을 즉흥적으로 변경할 수 있습니다.
예를 들어 옷장에 있는 핫핑크 상의 이미지를 이 앱에 업로드합니다. '표시'를 클릭하면 애플리케이션 코드에 설정된 프롬프트와 AlloyDB 데이터베이스의 임베딩을 기반으로 애플리케이션이 원본 이미지와 일치하는 여러 옵션을 생성합니다. 이제 추천 옵션이 파란색 목걸이와 함께 어떻게 표시되는지 궁금해져 해당 줄에 프롬프트를 추가하고 '스타일'을 클릭합니다. 원본 이미지와 추천을 강력하게 결합하여 어울리는 의상을 만드는 최종 이미지가 생성됩니다.
의상 추천 앱을 만들려면 다음 단계를 따르세요.
- Cloud Run에서 retail-engine 앱을 열고 애플리케이션의 URL을 확인합니다. 이는 유사한 추천을 생성하는 데 사용할 임베딩 저장소입니다.
- IDE에서 https://github.com/AbiramiSukumaran/outfit-recommender/ 저장소를 클론합니다. 이 연습에서는 Visual Studio Code IDE에서 표시된 단계를 실행합니다.
git clone https://github.com/AbiramiSukumaran/outfit-recommender/
다음은 앱 디렉터리의 몇 가지 중요한 파일입니다.
src/main
: 애플리케이션 파일과 HTML이 있는 소스 디렉터리입니다.HelloWorldApplication.java
: Spring Boot 애플리케이션의 기본 진입점입니다.HelloWorldController.java
: 의상 추천 애플리케이션과 관련된 HTTP 요청을 처리하는 Spring Boot REST 컨트롤러입니다. 이 파일은 GET 및 POST 요청을 처리하고, 사용자 메시지를 처리하고, 이미지를 분석하고, AlloyDB 임베딩과 상호작용하며, 최종 응답을 UI에 반환합니다. 이 컨트롤러는 GenerateImageSample 클래스를 호출합니다.GenerateImageSample.java
: Vertex AI에 연결하고, 사용자 프롬프트 형식을 지정하고, Imagen 모델에 API를 호출하고, 예측된 이미지를 컨트롤러 클래스에 반환하는 이미지 생성 클래스를 포함합니다.Resources
: 이 디렉터리에는 애플리케이션 UI를 생성하는 데 필요한 이미지와 HTML 파일이 포함되어 있습니다.Pom.xml
: 프로젝트 종속 항목 및 구성을 정의합니다.
- Visual Studio Code에서
HelloWorldController.java
를 열고 AlloyDB 인스턴스가 생성된 위치에 따라 프로젝트 ID 및 위치 인스턴스를 업데이트합니다.
endpoint
를 이전에 호스팅한 소매 엔진 앱 URL로 업데이트합니다.
GenerateImageSample.java
를 열고 AlloyDB 인스턴스가 생성된 위치에 따라 프로젝트 ID와 위치를 업데이트합니다.
- 모든 파일을 저장합니다.
이제 이 애플리케이션을 Cloud Run 서버리스 런타임에 배포합니다.
13. 애플리케이션을 웹으로 가져가기
이제 의상 추천 서비스 스프링 부트 애플리케이션에 관련 프로젝트, 위치, 소매 엔진 앱 세부정보를 추가했으므로 애플리케이션을 Cloud Run에 배포할 수 있습니다.
Visual Code Studio 터미널에서 gcloud run deploy
명령어를 사용하여 애플리케이션을 배포합니다. Visual Studio Code의 경우 Google Cloud Code 확장 프로그램을 설치하여 gcloud CLI를 사용할 수 있습니다.
애플리케이션을 배포하려면 다음 단계를 따르세요.
- IDE에서 클론된 디렉터리를 열고 터미널을 시작합니다. Visual Code Studio의 경우 터미널 > 새 터미널을 클릭합니다.
- 이 문서의 안내에 따라 gcloud CLI를 설치합니다.
- Visual Code Studio를 사용하는 경우 Extensions를 클릭하고 Google Cloud Code를 검색한 후 확장 프로그램을 설치합니다.
- IDE 터미널에서 다음 명령어를 실행하여 Google 계정을 인증합니다.
gcloud auth application-default login
- 프로젝트 ID를 AlloyDB 인스턴스가 있는 프로젝트와 동일한 프로젝트로 설정합니다.
gcloud config set project PROJECT_ID
- 배포 프로세스를 시작합니다.
gcloud run deploy
Source code location
에서 Enter 키를 눌러 클론된 GitHub 디렉터리를 선택합니다.Service name
에서 서비스 이름(예: outfit-recommender)을 입력하고 Enter 키를 누릅니다.Please specify a region
에서 AlloyDB 인스턴스 및 retail-engine 애플리케이션이 호스팅되는 위치(예: us-central1의 경우 32)를 입력하고 Enter 키를 누릅니다.
Allow unauthenticated invocations to [..]
에서 Y를 입력하고 Enter 키를 누릅니다.
다음 이미지는 애플리케이션의 배포 진행 상황을 보여줍니다.
14. 의상 추천 애플리케이션 테스트
애플리케이션이 Cloud Run에 성공적으로 배포되면 다음과 같이 Google Cloud 콘솔에서 서비스를 볼 수 있습니다.
- Google Cloud 콘솔에서 Cloud Run으로 이동합니다.
- 서비스에서 배포한 outfit recommender 서비스를 클릭합니다. 다음과 같이 retail-engine 및 outfit-recommender 서비스가 모두 표시됩니다.
- 애플리케이션 URL을 클릭하여 추천 앱 UI를 엽니다.
The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
배포된 애플리케이션은 다음과 같이 표시됩니다.
애플리케이션 사용
애플리케이션을 사용하려면 다음 단계를 따르세요.
- 업로드를 클릭하고 의류의 사진을 업로드합니다.
- 이미지가 업로드되면 스타일을 클릭합니다. 애플리케이션은 이미지를 프롬프트로 사용하고 소매 데이터 세트의 임베딩이 포함된 소매 엔진 앱의 프롬프트를 기반으로 하단 옵션을 생성합니다.
앱은 스타일 추천이 포함된 이미지를 기반으로 프롬프트와 함께 이미지 추천을 생성합니다. 예: A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.
- 이 자동 생성된 스타일 추천에 추가 프롬프트를 전달할 수 있습니다. 예:
STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
- 표시를 클릭하여 최종 스타일을 확인합니다.
15. 삭제
이 게시물에서 사용한 리소스의 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 따르세요.
- Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력하고 종료를 클릭하여 프로젝트를 삭제합니다.
16. 축하합니다
축하합니다. AlloyDB, pgvector, 벡터 검색을 사용하여 유사성 검색을 실행하고 강력한 Imagen 모델과 함께 검색 결과를 사용하여 스타일 추천을 생성했습니다.