AlloyDB AI 및 LangChain을 사용하여 LLM 및 RAG 기반 채팅 애플리케이션 빌드

1. 소개

이 Codelab에서는 생성형 AI 데이터베이스 검색 서비스를 배포하고, 배포된 환경을 사용하여 샘플 대화형 애플리케이션을 만드는 방법을 알아봅니다.

98c2676cc78880e.png

생성형 AI 검색 서비스 및 샘플 애플리케이션에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

기본 요건

  • Google Cloud 콘솔에 관한 기본적인 이해
  • 명령줄 인터페이스 및 Google Cloud Shell의 기본 기술

학습 내용

  • AlloyDB 클러스터를 배포하는 방법
  • AlloyDB에 연결하는 방법
  • 생성형 AI 데이터베이스 검색 서비스 구성 및 배포 방법
  • 배포된 서비스를 사용하여 샘플 애플리케이션을 배포하는 방법

필요한 항목

  • Google Cloud 계정 및 Google Cloud 프로젝트
  • 웹브라우저(예: Chrome)

2. 설정 및 요구사항

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로 PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.

55efc1aaa7a4d3ad.png

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

7ffe5cbb04455448.png

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.

3. 시작하기 전에

API 사용 설정

결과:

Cloud Shell 내에 프로젝트 ID가 설정되어 있는지 확인합니다.

일반적으로 프로젝트 ID는 그림과 같이 Cloud Shell의 명령 프롬프트에서 괄호 안에 표시됩니다.

fa6ee779963405d5.png

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 탭을 엽니다.

4ca978f5142bb6ce.png

새 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 동의 화면'을 클릭하고 '내부' 사용자를 선택합니다.

2400e5dcdb93eab8.png

그런 다음 '만들기'를 푸시하고 다음 화면의 안내를 따릅니다.

6c34d235156e571f.png

'앱 이름' 및 '사용자 지원 이메일'과 같은 필수 입력란을 작성해야 합니다. 또한 동의 화면에 표시할 도메인을 추가하고 마지막으로 '개발자 연락처 정보'를 추가할 수 있습니다.

2b7cd51aff915072.png

그런 다음 페이지 하단의 '저장하고 계속' 버튼을 누르면 다음 페이지로 이동합니다.

d90c10c88fd347f9.png

범위를 지정하지 않는 한 여기에서 아무것도 변경할 필요가 없습니다. 마지막으로 '저장 후 계속' 버튼을 다시 눌러 확인합니다. 그러면 애플리케이션 동의 화면이 설정됩니다.

다음 단계는 클라이언트 ID를 만드는 것입니다. 왼쪽 패널에서 '사용자 인증 정보'를 클릭하면 OAuth2의 사용자 인증 정보로 이동합니다.

7ad97432390f224c.png

여기에서 상단의 '사용자 인증 정보 만들기'를 클릭하고 'OAuth 클라이언트 ID'를 선택합니다. 그러면 다른 화면이 열립니다.

325a926431c8f16d.png

애플리케이션 유형의 드롭다운 목록에서 '웹 애플리케이션'을 선택하고 애플리케이션 URI(및 포트(선택사항))를 '승인된 JavaScript 출처'로 지정합니다. 또한 승인 팝업 화면을 사용할 수 있도록 '승인된 리디렉션 URI'에 애플리케이션 호스트를 추가하고 끝에 '/login/google'을 추가해야 합니다. 위 사진에서 http://localhost를 기본 애플리케이션 URI로 사용했음을 확인할 수 있습니다.

'만들기' 버튼을 누르면 클라이언트 사용자 인증 정보가 포함된 팝업 창이 표시됩니다.

e91adf03ec31cd15.png

나중에 애플리케이션에서 사용할 클라이언트 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을 사용하여 애플리케이션에 연결할 수 있습니다. 애플리케이션 화면이 표시됩니다.

c667b9013afac3f9.png

Cloud Shell에서 연결

또는 Cloud Shell을 사용하여 연결할 수도 있습니다. 맨 위에 있는 '+' 기호를 사용하여 다른 Cloud Shell 탭을 엽니다.

4ca978f5142bb6ce.png

새 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 값을 대체하거나 추가합니다.

2c37eeda0a7e2f80.png

새 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에서 미리보기'를 선택합니다.

444fbf54dcd4d160.png

웹브라우저에서 애플리케이션 인터페이스가 표시된 새 탭이 열립니다. 'Cymbal Air Customer Service Assistant' 페이지가 표시됩니다.

389f0ae2945beed5.png

신청서에 로그인

모든 설정이 완료되고 애플리케이션이 열려 있으면 애플리케이션 화면 오른쪽 상단의 '로그인' 버튼을 사용하여 사용자 인증 정보를 제공할 수 있습니다. 이는 선택사항이며 애플리케이션의 예약 기능을 사용해 보려는 경우에만 필요합니다.

a1f571371b957129.png

그러면 사용자 인증 정보를 선택할 수 있는 팝업 창이 열립니다.

로그인하면 애플리케이션이 준비되고 창 하단의 입력란에 요청을 게시할 수 있습니다.

이 데모는 Cymbal Air 고객 서비스 어시스턴트를 보여줍니다. Cymbal Air는 가상의 여객 항공사입니다. 이 어시스턴트는 여행자가 항공편을 관리하고 샌프란시스코 국제공항(SFO)에 있는 Cymbal Air 허브에 관한 정보를 찾아보도록 도와주는 AI 챗봇입니다.

CLIENT_ID 없이 로그인하지 않아도 다음과 같은 사용자 질문에 답할 수 있습니다.

덴버로 가는 다음 항공편은 언제인가요?

C28 게이트 주변에 명품 매장이 있나요?

A6 게이트 근처에서 커피를 살 수 있는 곳은 어디인가요?

선물은 어디에서 구매할 수 있나요?

오전 10시 35분에 출발하는 덴버행 항공편을 예약해 주세요.

애플리케이션에 로그인하면 항공편 예약이나 나에게 할당된 좌석이 창가 좌석인지 복도 좌석인지 확인하는 등의 다른 기능을 사용해 볼 수 있습니다.

6e7758f707c67c3e.png

이 애플리케이션은 최신 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. 설문조사

결과:

본 튜토리얼을 어떻게 사용하실 계획인가요?

읽기만 할 계획입니다. 읽은 다음 연습 활동을 완료할 계획입니다.