1. 소개
이 Codelab에서는 생성형 AI 데이터베이스 검색 서비스를 배포하고, 배포된 환경을 사용하여 샘플 대화형 애플리케이션을 만드는 방법을 알아봅니다.
생성형 AI 검색 서비스 및 샘플 애플리케이션에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
기본 요건
- Google Cloud 콘솔에 관한 기본적인 이해
- 명령줄 인터페이스 및 Google Cloud Shell의 기본 기술
학습 내용
- AlloyDB 클러스터를 배포하는 방법
- AlloyDB에 연결하는 방법
- 생성형 AI 데이터베이스 검색 서비스 구성 및 배포 방법
- 배포된 서비스를 사용하여 샘플 애플리케이션을 배포하는 방법
필요한 항목
- Google Cloud 계정 및 Google Cloud 프로젝트
- 웹브라우저(예: Chrome)
2. 설정 및 요구사항
자습형 환경 설정
- Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.
- 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로
PROJECT_ID
로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다. - 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.
Cloud Shell 시작
Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.
환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.
가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.
3. 시작하기 전에
API 사용 설정
결과:
Cloud Shell 내에 프로젝트 ID가 설정되어 있는지 확인합니다.
일반적으로 프로젝트 ID는 그림과 같이 Cloud Shell의 명령 프롬프트에서 괄호 안에 표시됩니다.
gcloud config set project [YOUR-PROJECT-ID]
그런 다음 PROJECT_ID 환경 변수를 Google Cloud 프로젝트 ID로 설정합니다.
PROJECT_ID=$(gcloud config get-value project)
필요한 모든 서비스를 사용 설정합니다.
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
vpcaccess.googleapis.com \
aiplatform.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
run.googleapis.com \
iam.googleapis.com
예상 출력
student@cloudshell:~ (gleb-test-short-004)$ gcloud services enable alloydb.googleapis.com \ compute.googleapis.com \ cloudresourcemanager.googleapis.com \ servicenetworking.googleapis.com \ vpcaccess.googleapis.com \ aiplatform.googleapis.com \ cloudbuild.googleapis.com \ artifactregistry.googleapis.com \ run.googleapis.com \ iam.googleapis.com Operation "operations/acf.p2-404051529011-664c71ad-cb2b-4ab4-86c1-1f3157d70ba1" finished successfully.
4. AlloyDB 클러스터 배포
AlloyDB 클러스터를 만들기 전에 향후 AlloyDB 인스턴스에서 사용할 VPC에 사용 가능한 비공개 IP 범위가 필요합니다. 계정이 없는 경우 계정을 만들고 내부 Google 서비스에서 사용할 수 있도록 할당해야 합니다. 그런 다음 클러스터와 인스턴스를 만들 수 있습니다.
비공개 IP 범위 만들기
VPC에서 AlloyDB용 비공개 서비스 액세스 구성을 설정해야 합니다. 여기서는 프로젝트에 '기본' VPC 네트워크가 있고 이 네트워크가 모든 작업에 사용된다고 가정합니다.
비공개 IP 범위를 만듭니다.
gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
할당된 IP 범위를 사용하여 비공개 연결을 만듭니다.
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
예상되는 콘솔 출력:
student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \ --global \ --purpose=VPC_PEERING \ --prefix-length=24 \ --description="VPC private service access" \ --network=default Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range]. student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=psa-range \ --network=default Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully. student@cloudshell:~ (test-project-402417)$
AlloyDB 클러스터 만들기
us-central1 리전에 AlloyDB 클러스터를 만듭니다.
postgres 사용자의 비밀번호를 정의합니다. 자체 비밀번호를 정의하거나 랜덤 함수를 사용하여 비밀번호를 생성할 수 있습니다.
export PGPASSWORD=`openssl rand -hex 12`
예상되는 콘솔 출력:
student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`
나중에 사용할 수 있도록 PostgreSQL 비밀번호를 기록해 둡니다.
echo $PGPASSWORD
예상되는 콘솔 출력:
student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD bbefbfde7601985b0dee5723
리전 및 AlloyDB 클러스터 이름을 정의합니다. us-central1 리전과 alloydb-aip-01을 클러스터 이름으로 사용합니다.
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
다음 명령어를 실행하여 클러스터를 만듭니다.
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION
예상되는 콘솔 출력:
export REGION=us-central1 export ADBCLUSTER=alloydb-aip-01 gcloud alloydb clusters create $ADBCLUSTER \ --password=$PGPASSWORD \ --network=default \ --region=$REGION Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4 Creating cluster...done.
AlloyDB 기본 인스턴스 만들기
동일한 Cloud Shell 세션에서 클러스터의 AlloyDB 기본 인스턴스를 만듭니다. 연결이 끊어지면 지역 및 클러스터 이름 환경 변수를 다시 정의해야 합니다.
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--cluster=$ADBCLUSTER
예상되는 콘솔 출력:
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \ --instance-type=PRIMARY \ --cpu-count=2 \ --region=$REGION \ --availability-type ZONAL \ --cluster=$ADBCLUSTER Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721 Creating instance...done.
5. GCE 가상 머신 준비
서비스 계정 만들기
우리는 VM을 사용하여 생성형 AI 데이터베이스 검색 서비스를 배포하고 샘플 애플리케이션을 호스팅할 것이므로 첫 번째 단계는 Google 서비스 계정(GSA)을 만드는 것입니다. GSA는 GCE VM에서 사용되며 다른 서비스와 함께 작동하는 데 필요한 권한을 부여해야 합니다.
Cloud Shell에서 다음을 실행합니다.
PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create compute-aip --project $PROJECT_ID
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/cloudbuild.builds.editor"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/artifactregistry.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/storage.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/run.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/alloydb.viewer"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:compute-aip@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/serviceusage.serviceUsageConsumer"
GCE VM 배포
AlloyDB 클러스터와 동일한 리전 및 VPC에 GCE VM을 만듭니다.
Cloud Shell에서 다음을 실행합니다.
export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--service-account=compute-aip@$PROJECT_ID.iam.gserviceaccount.com
예상되는 콘솔 출력:
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a gcloud compute instances create instance-1 \ --zone=$ZONE \ --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \ --scopes=https://www.googleapis.com/auth/cloud-platform Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1]. NAME: instance-1 ZONE: us-central1-a MACHINE_TYPE: n1-standard-1 PREEMPTIBLE: INTERNAL_IP: 10.128.0.2 EXTERNAL_IP: 34.71.192.233 STATUS: RUNNING
Postgres 클라이언트 설치
배포된 VM에 PostgreSQL 클라이언트 소프트웨어 설치
VM에 연결합니다.
gcloud compute ssh instance-1 --zone=us-central1-a
예상되는 콘솔 출력:
student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417]. Updating project ssh metadata...done. Waiting for SSH key to propagate. Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts. Linux instance-1 5.10.0-26-cloud-amd64 #1 SMP Debian 5.10.197-1 (2023-09-29) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. student@instance-1:~$
VM 내에 명령어를 실행할 소프트웨어를 설치합니다.
sudo apt-get update
sudo apt-get install --yes postgresql-client
예상되는 콘솔 출력:
student@instance-1:~$ sudo apt-get update sudo apt-get install --yes postgresql-client Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:4 file:/etc/apt/mirrors/debian-security.list Mirrorlist [39 B] Hit:7 https://packages.cloud.google.com/apt google-compute-engine-bookworm-stable InRelease Get:8 https://packages.cloud.google.com/apt cloud-sdk-bookworm InRelease [1652 B] Get:2 https://deb.debian.org/debian bookworm InRelease [151 kB] Get:3 https://deb.debian.org/debian bookworm-updates InRelease [55.4 kB] ...redacted... update-alternatives: using /usr/share/postgresql/15/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode Setting up postgresql-client (15+248) ... Processing triggers for man-db (2.11.2-2) ... Processing triggers for libc-bin (2.36-9+deb12u7) ...
인스턴스에 연결
psql을 사용하여 VM에서 기본 인스턴스에 연결합니다.
VM에 대해 열린 SSH 세션으로 계속 진행합니다. 연결이 끊어졌다면 위와 동일한 명령어를 사용하여 다시 연결합니다.
앞서 언급한 $PGASSWORD 및 클러스터 이름을 사용하여 GCE VM에서 AlloyDB에 연결합니다.
export PGPASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"
예상되는 콘솔 출력:
student@instance-1:~$ export PGPASSWORD=P9... student@instance-1:~$ export REGION=us-central1 student@instance-1:~$ export ADBCLUSTER=alloydb-aip-01 student@instance-1:~$ export INSTANCE_IP=export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)") student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require" psql (13.11 (Debian 13.11-0+deb11u1), server 14.7) WARNING: psql major version 13, server major version 14. Some psql features might not work. SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. postgres=>
SSH 연결을 유지한 상태로 psql 세션을 종료합니다.
exit
예상되는 콘솔 출력:
postgres=> exit student@instance-1:~$
6. 데이터베이스 초기화
데이터베이스에 데이터를 채우고 애플리케이션을 호스팅하는 플랫폼으로 클라이언트 VM을 사용할 것입니다. 첫 번째 단계는 데이터베이스를 만들어서 데이터로 채우는 것입니다.
데이터베이스 만들기
이름이 'assistantdemo'인 데이터베이스를 만듭니다.
GCE VM 세션에서 다음을 실행합니다.
psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE assistantdemo"
예상되는 콘솔 출력:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE assistantdemo" CREATE DATABASE student@instance-1:~$
pgVector 확장 프로그램을 사용 설정합니다.
psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector"
예상되는 콘솔 출력:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=assistantdemo" -c "CREATE EXTENSION vector" CREATE EXTENSION student@instance-1:~$
Python 환경 준비
계속 진행하기 위해 GitHub 저장소에서 준비된 Python 스크립트를 사용합니다. 그러나 그 전에 필수 소프트웨어를 설치해야 합니다.
GCE VM에서 다음을 실행합니다.
sudo apt install -y python3.11-venv git
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
예상되는 콘솔 출력:
student@instance-1:~$ sudo apt install -y python3.11-venv git python3 -m venv .venv source .venv/bin/activate pip install --upgrade pip Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: git-man liberror-perl patch python3-distutils python3-lib2to3 python3-pip-whl python3-setuptools-whl Suggested packages: git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn ed diffutils-doc The following NEW packages will be installed: git git-man liberror-perl patch python3-distutils python3-lib2to3 python3-pip-whl python3-setuptools-whl python3.11-venv 0 upgraded, 9 newly installed, 0 to remove and 2 not upgraded. Need to get 12.4 MB of archives. After this operation, 52.2 MB of additional disk space will be used. Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] ...redacted... Installing collected packages: pip Attempting uninstall: pip Found existing installation: pip 23.0.1 Uninstalling pip-23.0.1: Successfully uninstalled pip-23.0.1 Successfully installed pip-24.0 (.venv) student@instance-1:~$
Python 버전을 확인합니다.
GCE VM에서 다음을 실행합니다.
python -V
예상되는 콘솔 출력:
(.venv) student@instance-1:~$ python -V Python 3.11.2 (.venv) student@instance-1:~$
데이터베이스 채우기
검색 서비스 및 샘플 애플리케이션용 코드와 함께 GitHub 저장소를 클론합니다.
GCE VM에서 다음을 실행합니다.
git clone https://github.com/GoogleCloudPlatform/genai-databases-retrieval-app.git
예상되는 콘솔 출력:
student@instance-1:~$ git clone https://github.com/GoogleCloudPlatform/genai-databases-retrieval-app.git Cloning into 'genai-databases-retrieval-app'... remote: Enumerating objects: 525, done. remote: Counting objects: 100% (336/336), done. remote: Compressing objects: 100% (201/201), done. remote: Total 525 (delta 224), reused 179 (delta 135), pack-reused 189 Receiving objects: 100% (525/525), 46.58 MiB | 16.16 MiB/s, done. Resolving deltas: 100% (289/289), done.
구성 파일 준비
GCE VM에서 다음을 실행합니다.
cd genai-databases-retrieval-app/retrieval_service
cp example-config.yml config.yml
sed -i s/127.0.0.1/$INSTANCE_IP/g config.yml
sed -i s/my-password/$PGPASSWORD/g config.yml
sed -i s/my_database/assistantdemo/g config.yml
sed -i s/my-user/postgres/g config.yml
cat config.yml
예상되는 콘솔 출력:
student@instance-1:~$ cd genai-databases-retrieval-app/retrieval_service cp example-config.yml config.yml sed -i s/127.0.0.1/$INSTANCE_IP/g config.yml sed -i s/my-password/$PGPASSWORD/g config.yml sed -i s/my_database/assistantdemo/g config.yml sed -i s/my-user/postgres/g config.yml cat config.yml host: 0.0.0.0 # port: 8080 datastore: # Example for AlloyDB kind: "postgres" host: 10.65.0.2 # port: 5432 database: "assistantdemo" user: "postgres" password: "P9..."
데이터베이스에 샘플 데이터 세트를 채웁니다. 첫 번째 명령어는 Python 가상 환경에 필요한 모든 패키지를 추가하고 두 번째 명령어는 데이터베이스에 데이터를 채웁니다.
GCE VM에서 다음을 실행합니다.
pip install -r requirements.txt
python run_database_init.py
예상되는 콘솔 출력(수정됨):
student@instance-1:~/genai-databases-retrieval-app/retrieval_service$ pip install -r requirements.txt python run_database_init.py Collecting asyncpg==0.28.0 (from -r requirements.txt (line 1)) Obtaining dependency information for asyncpg==0.28.0 from https://files.pythonhosted.org/packages/77/a4/88069f7935b14c58534442a57be3299179eb46aace2d3c8716be199ff6a6/asyncpg-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata Downloading asyncpg-0.28.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.3 kB) Collecting fastapi==0.101.1 (from -r requirements.txt (line 2)) ... database init done. student@instance-1:~/genai-databases-retrieval-app/retrieval_service$
7. Cloud Run에 검색 서비스 배포
이제 검색 서비스를 Cloud Run에 배포할 수 있습니다. 이 서비스는 AI 애플리케이션의 요청을 기반으로 데이터베이스 작업을 수행하고 데이터베이스에서 필요한 정보를 추출하는 역할을 합니다.
서비스 계정 만들기
검색 서비스의 서비스 계정을 만들고 필요한 권한을 부여합니다.
맨 위에 있는 '+' 기호를 사용하여 다른 Cloud Shell 탭을 엽니다.
새 Cloud Shell 탭에서 다음을 실행합니다.
export PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts create retrieval-identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
예상되는 콘솔 출력:
student@cloudshell:~ (gleb-test-short-003)$ gcloud iam service-accounts create retrieval-identity Created service account [retrieval-identity].
탭에서 실행 명령어 'exit' 중 하나를 사용하여 탭을 닫습니다.
exit
검색 서비스 배포
서비스를 배포하여 SSH를 통해 VM에 연결된 첫 번째 탭에서 계속 진행합니다.
VM SSH 세션에서 다음을 실행합니다.
cd ~/genai-databases-retrieval-app
gcloud alpha run deploy retrieval-service \
--source=./retrieval_service/\
--no-allow-unauthenticated \
--service-account retrieval-identity \
--region us-central1 \
--network=default \
--quiet
예상되는 콘솔 출력:
student@instance-1:~/genai-databases-retrieval-app$ gcloud alpha run deploy retrieval-service \ --source=./retrieval_service/\ --no-allow-unauthenticated \ --service-account retrieval-identity \ --region us-central1 \ --network=default This command is equivalent to running `gcloud builds submit --tag [IMAGE] ./retrieval_service/` and `gcloud run deploy retrieval-service --image [IMAGE]` Building using Dockerfile and deploying container to Cloud Run service [retrieval-service] in project [gleb-test-short-003] region [us-central1] X Building and deploying... Done. ✓ Uploading sources... ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/6ebe74bf-3039-4221-b2e9-7ca8fa8dad8e?project=1012713954588]. ✓ Creating Revision... ✓ Routing traffic... Setting IAM Policy... Completed with warnings: Setting IAM policy failed, try "gcloud beta run services remove-iam-policy-binding --region=us-central1 --member=allUsers --role=roles/run.invoker retrieval-service" Service [retrieval-service] revision [retrieval-service-00002-4pl] has been deployed and is serving 100 percent of traffic. Service URL: https://retrieval-service-onme64eorq-uc.a.run.app student@instance-1:~/genai-databases-retrieval-app$
서비스 확인
이제 서비스가 올바르게 실행되고 VM이 엔드포인트에 액세스할 수 있는지 확인할 수 있습니다. gcloud 유틸리티를 사용하여 검색 서비스 엔드포인트를 가져옵니다. 또는 Cloud 콘솔에서 확인하고 curl 명령어에서 "$(gcloud run services list –filter="(retrieval-service)"를 거기에서 가져온 값으로 바꿀 수 있습니다.
VM SSH 세션에서 다음을 실행합니다.
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $(gcloud run services list --filter="(retrieval-service)" --format="value(URL)")
예상되는 콘솔 출력:
student@instance-1:~/genai-databases-retrieval-app$ curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $(gcloud run services list --filter="(retrieval-service)" --format="value(URL)") {"message":"Hello World"}student@instance-1:~/genai-databases-retrieval-app$
'Hello World' 메시지가 표시되면 서비스가 작동되어 요청이 처리되고 있다는 의미입니다.
8. 샘플 애플리케이션 배포
이제 검색 서비스를 준비하고 실행했으므로 서비스를 사용할 샘플 애플리케이션을 배포할 수 있습니다. 애플리케이션은 VM이나 Cloud Run, Kubernetes와 같은 다른 서비스에 배포하거나 노트북에 로컬로 배포할 수도 있습니다. 여기에서는 VM에 배포하는 방법을 보여드리겠습니다.
환경 준비하기
동일한 SSH 세션을 사용하여 VM에서 계속 작업합니다. 애플리케이션을 실행하려면 Python 모듈을 추가해야 합니다. 명령어는 동일한 Python 가상 환경의 애플리케이션 디렉터리에서 실행됩니다.
VM SSH 세션에서 다음을 실행합니다.
cd ~/genai-databases-retrieval-app/llm_demo
pip install -r requirements.txt
예상 출력(수정됨):
student@instance-1:~$ cd ~/genai-databases-retrieval-app/llm_demo pip install -r requirements.txt Collecting fastapi==0.104.0 (from -r requirements.txt (line 1)) Obtaining dependency information for fastapi==0.104.0 from https://files.pythonhosted.org/packages/db/30/b8d323119c37e15b7fa639e65e0eb7d81eb675ba166ac83e695aad3bd321/fastapi-0.104.0-py3-none-any.whl.metadata Downloading fastapi-0.104.0-py3-none-any.whl.metadata (24 kB) ...
클라이언트 ID 준비하기
애플리케이션의 예약 기능을 사용하려면 Cloud 콘솔을 사용하여 OAuth 2.0 클라이언트 ID를 준비해야 합니다. 예약은 클라이언트 사용자 인증 정보를 사용하여 데이터베이스에 예약 데이터를 기록하므로 애플리케이션에 로그인할 때 생성됩니다.
Cloud 콘솔에서 API 및 서비스로 이동하여 'OAuth 동의 화면'을 클릭하고 '내부' 사용자를 선택합니다.
그런 다음 '만들기'를 푸시하고 다음 화면의 안내를 따릅니다.
'앱 이름' 및 '사용자 지원 이메일'과 같은 필수 입력란을 작성해야 합니다. 또한 동의 화면에 표시할 도메인을 추가하고 마지막으로 '개발자 연락처 정보'를 추가할 수 있습니다.
그런 다음 페이지 하단의 '저장하고 계속' 버튼을 누르면 다음 페이지로 이동합니다.
범위를 지정하지 않는 한 여기에서 아무것도 변경할 필요가 없습니다. 마지막으로 '저장 후 계속' 버튼을 다시 눌러 확인합니다. 그러면 애플리케이션 동의 화면이 설정됩니다.
다음 단계는 클라이언트 ID를 만드는 것입니다. 왼쪽 패널에서 '사용자 인증 정보'를 클릭하면 OAuth2의 사용자 인증 정보로 이동합니다.
여기에서 상단의 '사용자 인증 정보 만들기'를 클릭하고 'OAuth 클라이언트 ID'를 선택합니다. 그러면 다른 화면이 열립니다.
애플리케이션 유형의 드롭다운 목록에서 '웹 애플리케이션'을 선택하고 애플리케이션 URI(및 포트(선택사항))를 '승인된 JavaScript 출처'로 지정합니다. 또한 승인 팝업 화면을 사용할 수 있도록 '승인된 리디렉션 URI'에 애플리케이션 호스트를 추가하고 끝에 '/login/google'을 추가해야 합니다. 위 사진에서 http://localhost를 기본 애플리케이션 URI로 사용했음을 확인할 수 있습니다.
'만들기' 버튼을 누르면 클라이언트 사용자 인증 정보가 포함된 팝업 창이 표시됩니다.
나중에 애플리케이션에서 사용할 클라이언트 ID (및 선택적으로 클라이언트 보안 비밀번호)가 필요합니다.
어시스턴트 애플리케이션 실행
애플리케이션을 시작하기 전에 몇 가지 환경 변수를 설정해야 합니다. 항공편 쿼리 및 공항 편의시설과 같은 애플리케이션의 기본 기능에는 애플리케이션을 검색 서비스로 가리키는 BASE_URL만 있으면 됩니다. gcloud 명령어를 사용하여 가져올 수 있습니다 .
VM SSH 세션에서 다음을 실행합니다.
export BASE_URL=$(gcloud run services list --filter="(retrieval-service)" --format="value(URL)")
예상 출력(수정됨):
student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export BASE_URL=$(gcloud run services list --filter="(retrieval-service)" --format="value(URL)")
항공편 예약 및 변경과 같은 애플리케이션의 고급 기능을 사용하려면 Google 계정을 사용하여 애플리케이션에 로그인해야 합니다. 이를 위해 클라이언트 ID 준비 챕터의 OAuth 클라이언트 ID를 사용하여 CLIENT_ID 환경 변수를 제공해야 합니다.
export CLIENT_ID=215....apps.googleusercontent.com
예상 출력(수정됨):
student@instance-1:~/genai-databases-retrieval-app/llm_demo$ export CLIENT_ID=215....apps.googleusercontent.com
이제 애플리케이션을 실행할 수 있습니다.
python run_app.py
예상 출력:
student@instance-1:~/genai-databases-retrieval-app/llm_demo$ python main.py INFO: Started server process [28565] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8081 (Press CTRL+C to quit)
애플리케이션에 연결
여러 가지 방법으로 VM에서 실행 중인 애플리케이션에 연결할 수 있습니다. 예를 들어 VPC의 방화벽 규칙을 사용하여 VM에서 포트 8081을 열거나 공개 IP로 부하 분산기를 만들 수 있습니다. 여기서는 SSH 터널을 VM에 사용하여 로컬 포트 8080을 VM 포트 8081로 변환합니다.
로컬 머신에서 연결
로컬 머신에서 연결하려면 SSH 터널을 실행해야 합니다. gcloud compute ssh를 사용하여 다음과 같이 할 수 있습니다.
gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8081:localhost:8081
예상 출력:
student-macbookpro:~ student$ gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081 Warning: Permanently added 'compute.7064281075337367021' (ED25519) to the list of known hosts. Linux instance-1.us-central1-c.c.gleb-test-001.internal 6.1.0-21-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. student@instance-1:~$
이제 브라우저를 열고 http://localhost:8081을 사용하여 애플리케이션에 연결할 수 있습니다. 애플리케이션 화면이 표시됩니다.
Cloud Shell에서 연결
또는 Cloud Shell을 사용하여 연결할 수도 있습니다. 맨 위에 있는 '+' 기호를 사용하여 다른 Cloud Shell 탭을 엽니다.
새 Cloud Shell에서 gcloud 명령어를 실행하여 웹 클라이언트의 출처 및 리디렉션 URI를 가져옵니다.
echo "origin:"; echo "https://8080-$WEB_HOST"; echo "redirect:"; echo "https://8080-$WEB_HOST/login/google"
예상되는 출력은 다음과 같습니다.
student@cloudshell:~ echo "origin:"; echo "https://8080-$WEB_HOST"; echo "redirect:"; echo "https://8080-$WEB_HOST/login/google" origin: https://8080-cs-35704030349-default.cs-us-east1-rtep.cloudshell.dev redirect: https://8080-cs-35704030349-default.cs-us-east1-rtep.cloudshell.dev/login/google
URI의 출처와 리디렉션을 '클라이언트 ID 준비' 장에서 만든 사용자 인증 정보의 '승인된 JavaScript 출처' 및 '승인된 리디렉션 URI'로 사용하고 원래 제공된 http://localhost:8080 값을 대체하거나 추가합니다.
새 Cloud Shell 탭에서 gcloud 명령어를 실행하여 VM에 대한 터널을 시작합니다.
gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081
'요청한 주소를 할당할 수 없습니다'라는 오류가 표시됩니다. 이 오류는 무시하시기 바랍니다.
예상되는 출력은 다음과 같습니다.
student@cloudshell:~ gcloud compute ssh instance-1 --zone=us-central1-a -- -L 8080:localhost:8081 bind [::1]:8081: Cannot assign requested address inux instance-1.us-central1-a.c.gleb-codelive-01.internal 6.1.0-21-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sat May 25 19:15:46 2024 from 35.243.235.73 student@instance-1:~$
'웹 미리보기'에 사용할 수 있는 포트 8080이 Cloud Shell에서 열립니다.
Cloud Shell 오른쪽 상단에 있는 '웹 미리보기' 버튼을 클릭하고 드롭다운 메뉴에서 '포트 8080에서 미리보기'를 선택합니다.
웹브라우저에서 애플리케이션 인터페이스가 표시된 새 탭이 열립니다. 'Cymbal Air Customer Service Assistant' 페이지가 표시됩니다.
신청서에 로그인
모든 설정이 완료되고 애플리케이션이 열려 있으면 애플리케이션 화면 오른쪽 상단의 '로그인' 버튼을 사용하여 사용자 인증 정보를 제공할 수 있습니다. 이는 선택사항이며 애플리케이션의 예약 기능을 사용해 보려는 경우에만 필요합니다.
그러면 사용자 인증 정보를 선택할 수 있는 팝업 창이 열립니다.
로그인하면 애플리케이션이 준비되고 창 하단의 입력란에 요청을 게시할 수 있습니다.
이 데모는 Cymbal Air 고객 서비스 어시스턴트를 보여줍니다. Cymbal Air는 가상의 여객 항공사입니다. 이 어시스턴트는 여행자가 항공편을 관리하고 샌프란시스코 국제공항(SFO)에 있는 Cymbal Air 허브에 관한 정보를 찾아보도록 도와주는 AI 챗봇입니다.
CLIENT_ID 없이 로그인하지 않아도 다음과 같은 사용자 질문에 답할 수 있습니다.
덴버로 가는 다음 항공편은 언제인가요?
C28 게이트 주변에 명품 매장이 있나요?
A6 게이트 근처에서 커피를 살 수 있는 곳은 어디인가요?
선물은 어디에서 구매할 수 있나요?
오전 10시 35분에 출발하는 덴버행 항공편을 예약해 주세요.
애플리케이션에 로그인하면 항공편 예약이나 나에게 할당된 좌석이 창가 좌석인지 복도 좌석인지 확인하는 등의 다른 기능을 사용해 볼 수 있습니다.
이 애플리케이션은 최신 Google 기반 모델을 사용하여 응답을 생성하고 운영 중인 AlloyDB 데이터베이스의 항공편 및 편의시설 관련 정보로 응답을 보강합니다. 프로젝트의 GitHub 페이지에서 이 데모 애플리케이션에 관한 자세한 내용을 확인할 수 있습니다.
9. 환경 정리
모든 작업이 완료되면 이제 환경을 정리할 수 있습니다.
Cloud Run 서비스 삭제
Cloud Shell에서 다음을 실행합니다.
gcloud run services delete retrieval-service --region us-central1
예상되는 콘솔 출력:
student@cloudshell:~ (gleb-test-short-004)$ gcloud run services delete retrieval-service --region us-central1 Service [retrieval-service] will be deleted. Do you want to continue (Y/n)? Y Deleting [retrieval-service]...done. Deleted service [retrieval-service].
Cloud Run 서비스의 서비스 계정 삭제
Cloud Shell에서 다음을 실행합니다.
PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com --quiet
예상되는 콘솔 출력:
student@cloudshell:~ (gleb-test-short-004)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-222] student@cloudshell:~ (gleb-test-short-004)$ gcloud iam service-accounts delete retrieval-identity@$PROJECT_ID.iam.gserviceaccount.com --quiet deleted service account [retrieval-identity@gleb-test-short-004.iam.gserviceaccount.com] student@cloudshell:~ (gleb-test-short-004)$
실습을 마치면 AlloyDB 인스턴스와 클러스터를 폐기합니다.
AlloyDB 클러스터 및 모든 인스턴스 삭제
클러스터는 옵션 강제로 폐기되며, 클러스터에 속한 모든 인스턴스도 삭제됩니다.
연결이 끊어지고 이전 설정이 모두 손실된 경우 Cloud Shell에서 프로젝트와 환경 변수를 정의합니다.
gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)
다음과 같이 클러스터를 삭제합니다.
gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
예상되는 콘솔 출력:
student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force All of the cluster data will be lost when the cluster is deleted. Do you want to continue (Y/n)? Y Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f Deleting cluster...done.
AlloyDB 백업 삭제
클러스터의 모든 AlloyDB 백업을 삭제합니다.
for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
예상되는 콘솔 출력:
student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f Deleting backup...done.
이제 VM을 폐기할 수 있습니다.
GCE VM 삭제
Cloud Shell에서 다음을 실행합니다.
export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
예상되는 콘솔 출력:
student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1 export ZONE=us-central1-a gcloud compute instances delete $GCEVM \ --zone=$ZONE \ --quiet Deleted
GCE VM 및 검색 서비스의 서비스 계정 삭제
Cloud Shell에서 다음을 실행합니다.
PROJECT_ID=$(gcloud config get-value project)
gcloud iam service-accounts delete compute-aip@$PROJECT_ID.iam.gserviceaccount.com --quiet
예상되는 콘솔 출력:
student@cloudshell:~ (gleb-test-short-004)$ PROJECT_ID=$(gcloud config get-value project) gcloud iam service-accounts delete compute-aip@$PROJECT_ID.iam.gserviceaccount.com --quiet Your active configuration is: [cloudshell-222] deleted service account [compute-aip@gleb-test-short-004.iam.gserviceaccount.com] student@cloudshell:~ (gleb-test-short-004)$
10. 마무리
축하합니다. Codelab을 완료했습니다.
학습한 내용
- AlloyDB 클러스터를 배포하는 방법
- AlloyDB에 연결하는 방법
- 생성형 AI 데이터베이스 검색 서비스 구성 및 배포 방법
- 배포된 서비스를 사용하여 샘플 애플리케이션을 배포하는 방법
11. 설문조사
결과: