Tutorial ini menunjukkan cara mengintegrasikan aplikasi model bahasa besar (LLM) berdasarkan retrieval-augmented generation (RAG) dengan file PDF yang Anda upload ke bucket Cloud Storage.
Panduan ini menggunakan database sebagai penyimpanan dan mesin telusur semantik yang menyimpan representasi (embedding) dokumen yang diupload. Anda menggunakan framework Langchain untuk berinteraksi dengan sematan dan menggunakan model Gemini yang tersedia melalui Vertex AI.
Langchain adalah framework Python open source populer yang menyederhanakan banyak tugas machine learning dan memiliki antarmuka untuk berintegrasi dengan berbagai database vektor dan layanan AI.
Tutorial ini ditujukan untuk administrator dan arsitek platform cloud, engineer ML, dan profesional MLOps (DevOps) yang tertarik untuk men-deploy aplikasi RAG LLM ke GKE dan Cloud Storage.
Tujuan
Dalam tutorial ini, Anda akan mempelajari cara:
- Build dan deploy aplikasi untuk membuat dan menyimpan penyematan dokumen di database vektor.
- Otomatiskan aplikasi untuk memicu upload dokumen baru ke bucket Cloud Storage.
- Men-deploy aplikasi chatbot yang menggunakan penelusuran semantik untuk menjawab pertanyaan berdasarkan konten dokumen.
Arsitektur deployment
Dalam tutorial ini, Anda akan membuat bucket Cloud Storage, pemicu Eventarc, dan Layanan berikut:
embed-docs
: Eventarc memicu Layanan ini setiap kali pengguna mengupload dokumen baru ke bucket Cloud Storage. Layanan ini memulai Tugas Kubernetes yang membuat penyematan untuk dokumen yang diupload dan menyisipkan penyematan tersebut ke dalam database vektor.chatbot
: Layanan ini menjawab pertanyaan dalam bahasa alami tentang dokumen yang diupload menggunakan penelusuran semantik dan Gemini API.
Diagram berikut menunjukkan proses mengupload dan memaketkan vektor dokumen:
Dalam diagram, pengguna mengupload file ke bucket Cloud Storage.
Eventarc berlangganan peristiwa metadataUpdated
objek untuk bucket dan menggunakan penerusan peristiwa Eventarc, yang merupakan beban kerja Kubernetes, untuk memanggil Layanan embed-docs
saat Anda mengupload dokumen baru. Layanan
kemudian membuat penyematan untuk dokumen yang diupload. Layanan embed-docs
menyimpan penyematan dalam database vektor menggunakan model penyematan
Vertex AI.
Diagram berikut menunjukkan proses mengajukan pertanyaan tentang konten dokumen yang diupload menggunakan Layanan chatbot
:
Pengguna dapat mengajukan pertanyaan menggunakan bahasa alami, dan chatbot akan membuat jawaban hanya berdasarkan konten file yang diupload. Chatbot mengambil konteks dari database vektor menggunakan penelusuran semantik, lalu mengirim pertanyaan dan konteks ke Gemini.
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
Dalam tutorial ini, Anda akan menggunakan Cloud Shell untuk menjalankan perintah. Cloud Shell adalah lingkungan shell untuk mengelola resource yang dihosting di Google Cloud. Cloud Shell telah diinstal lebih dulu dengan alat command line Google Cloud CLI, kubectl, dan Terraform. Jika Anda tidak menggunakan Cloud Shell, instal Google Cloud CLI.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Buat atau pilih project Google Cloud.
-
Membuat project Google Cloud:
gcloud projects create PROJECT_ID
Ganti
PROJECT_ID
dengan nama untuk project Google Cloud yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_ID
dengan nama project Google Cloud Anda.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Aktifkan API Vertex AI, Cloud Build, Eventarc, Artifact Registry:
gcloud services enable aiplatform.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com artifactregistry.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Buat atau pilih project Google Cloud.
-
Membuat project Google Cloud:
gcloud projects create PROJECT_ID
Ganti
PROJECT_ID
dengan nama untuk project Google Cloud yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_ID
dengan nama project Google Cloud Anda.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Aktifkan API Vertex AI, Cloud Build, Eventarc, Artifact Registry:
gcloud services enable aiplatform.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com artifactregistry.googleapis.com -
Grant roles to your user account. Run the following command once for each of the following IAM roles:
eventarc.admin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
Membuat cluster
Buat cluster Qdrant, Elasticsearch, atau Postgres:
Qdrant
Ikuti petunjuk dalam artikel Men-deploy database vektor Qdrant di GKE untuk membuat cluster Qdrant yang berjalan di cluster GKE mode Autopilot atau mode Standard.
Elasticsearch
Ikuti petunjuk dalam artikel Men-deploy database vektor Elasticsearch di GKE untuk membuat cluster Elasticsearch yang berjalan di cluster GKE mode Autopilot atau mode Standard.
PGVector
Ikuti petunjuk dalam artikel Men-deploy database vektor PostgreSQL di GKE untuk membuat cluster Postgres dengan PGVector yang berjalan di cluster GKE mode Autopilot atau mode Standard.
Weaviate
Ikuti petunjuk untuk Men-deploy database vektor Weaviate di GKE untuk membuat cluster Weaviate yang berjalan di cluster GKE mode Autopilot atau Standard.
Menyiapkan lingkungan Anda
Siapkan lingkungan Anda dengan Cloud Shell:
Tetapkan variabel lingkungan untuk project Anda:
Qdrant
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=qdrant export REGION=us-central1 export DB_NAMESPACE=qdrant
Ganti
PROJECT_ID
dengan project ID Google Cloud Anda.Elasticsearch
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=elasticsearch export REGION=us-central1 export DB_NAMESPACE=elastic
Ganti
PROJECT_ID
dengan project ID Google Cloud Anda.PGVector
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=postgres export REGION=us-central1 export DB_NAMESPACE=pg-ns
Ganti
PROJECT_ID
dengan project ID Google Cloud Anda.Weaviate
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=weaviate export REGION=us-central1 export DB_NAMESPACE=weaviate
Ganti
PROJECT_ID
dengan project ID Google Cloud Anda.Pastikan cluster GKE Anda berjalan:
gcloud container clusters list --project=${PROJECT_ID} --region=${REGION}
Outputnya mirip dengan hal berikut ini:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS [KUBERNETES_CLUSTER_PREFIX]-cluster us-central1 1.30.1-gke.1329003 <EXTERNAL IP> e2-standard-2 1.30.1-gke.1329003 6 RUNNING
Clone repositori kode contoh dari GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Buka direktori
databases
:cd kubernetes-engine-samples/databases
Menyiapkan infrastruktur
Buat repositori Artifact Registry, build image Docker, dan kirim image Docker ke Artifact Registry:
Buat repositori Artifact Registry:
gcloud artifacts repositories create ${KUBERNETES_CLUSTER_PREFIX}-images \ --repository-format=docker \ --location=${REGION} \ --description="Vector database images repository" \ --async
Tetapkan izin
storage.objectAdmin
danartifactregistry.admin
di akun layanan Compute Engine untuk menggunakan Cloud Build untuk mem-build dan mengirim image Docker untuk Layananembed-docs
danchatbot
.export PROJECT_NUMBER=PROJECT_NUMBER gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \ --role="roles/storage.objectAdmin" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \ --role="roles/artifactregistry.admin"
Ganti
PROJECT_NUMBER
dengan nomor project Google Cloud Anda.Build image Docker untuk Layanan
embed-docs
danchatbot
. Imageembed-docs
berisi kode Python untuk aplikasi yang menerima permintaan forwarder Eventarc dan tugas penyematan.Qdrant
export DOCKER_REPO="${REGION}-docker.pkg.dev/${PROJECT_ID}/${KUBERNETES_CLUSTER_PREFIX}-images" gcloud builds submit qdrant/docker/chatbot --region=${REGION} \ --tag ${DOCKER_REPO}/chatbot:1.0 --async gcloud builds submit qdrant/docker/embed-docs --region=${REGION} \ --tag ${DOCKER_REPO}/embed-docs:1.0 --async
Elasticsearch
export DOCKER_REPO="${REGION}-docker.pkg.dev/${PROJECT_ID}/${KUBERNETES_CLUSTER_PREFIX}-images" gcloud builds submit elasticsearch/docker/chatbot --region=${REGION} \ --tag ${DOCKER_REPO}/chatbot:1.0 --async gcloud builds submit elasticsearch/docker/embed-docs --region=${REGION} \ --tag ${DOCKER_REPO}/embed-docs:1.0 --async
PGVector
export DOCKER_REPO="${REGION}-docker.pkg.dev/${PROJECT_ID}/${KUBERNETES_CLUSTER_PREFIX}-images" gcloud builds submit postgres-pgvector/docker/chatbot --region=${REGION} \ --tag ${DOCKER_REPO}/chatbot:1.0 --async gcloud builds submit postgres-pgvector/docker/embed-docs --region=${REGION} \ --tag ${DOCKER_REPO}/embed-docs:1.0 --async
Weaviate
export DOCKER_REPO="${REGION}-docker.pkg.dev/${PROJECT_ID}/${KUBERNETES_CLUSTER_PREFIX}-images" gcloud builds submit weaviate/docker/chatbot --region=${REGION} \ --tag ${DOCKER_REPO}/chatbot:1.0 --async gcloud builds submit weaviate/docker/embed-docs --region=${REGION} \ --tag ${DOCKER_REPO}/embed-docs:1.0 --async
Verifikasi gambar:
gcloud artifacts docker images list $DOCKER_REPO \ --project=$PROJECT_ID \ --format="value(IMAGE)"
Outputnya mirip dengan hal berikut ini:
$REGION-docker.pkg.dev/$PROJECT_ID/${KUBERNETES_CLUSTER_PREFIX}-images/chatbot $REGION-docker.pkg.dev/$PROJECT_ID/${KUBERNETES_CLUSTER_PREFIX}-images/embed-docs
Deploy Akun Layanan Kubernetes dengan izin untuk menjalankan Tugas Kubernetes:
Qdrant
sed "s/<PROJECT_ID>/$PROJECT_ID/;s/<CLUSTER_PREFIX>/$KUBERNETES_CLUSTER_PREFIX/" qdrant/manifests/05-rag/service-account.yaml | kubectl -n qdrant apply -f -
Elasticsearch
sed "s/<PROJECT_ID>/$PROJECT_ID/;s/<CLUSTER_PREFIX>/$KUBERNETES_CLUSTER_PREFIX/" elasticsearch/manifests/05-rag/service-account.yaml | kubectl -n elastic apply -f -
PGVector
sed "s/<PROJECT_ID>/$PROJECT_ID/;s/<CLUSTER_PREFIX>/$KUBERNETES_CLUSTER_PREFIX/" postgres-pgvector/manifests/03-rag/service-account.yaml | kubectl -n pg-ns apply -f -
Weaviate
sed "s/<PROJECT_ID>/$PROJECT_ID/;s/<CLUSTER_PREFIX>/$KUBERNETES_CLUSTER_PREFIX/" weaviate/manifests/04-rag/service-account.yaml | kubectl -n weaviate apply -f -
Saat menggunakan Terraform untuk membuat cluster GKE dan menetapkan
create_service_account
sebagai benar, akun layanan terpisah akan dibuat dan digunakan oleh cluster dan node. Berikan peranartifactregistry.serviceAgent
ke akun layanan Compute Engine ini untuk mengizinkan node mengambil image dari Artifact Registry yang dibuat untukembed-docs
danchatbot
.export CLUSTER_SERVICE_ACCOUNT=$(gcloud container clusters describe ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --region=${REGION} \ --format="value(nodeConfig.serviceAccount)") gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${CLUSTER_SERVICE_ACCOUNT}" \ --role="roles/artifactregistry.serviceAgent"
Tanpa memberikan akses ke akun layanan, node Anda mungkin mengalami masalah izin saat mencoba mengambil image dari Artifact Registry saat men-deploy Layanan
embed-docs
danchatbot
.Deploy Deployment Kubernetes untuk Layanan
embed-docs
danchatbot
:Qdrant
sed "s|<DOCKER_REPO>|$DOCKER_REPO|" qdrant/manifests/05-rag/chatbot.yaml | kubectl -n qdrant apply -f - sed "s|<DOCKER_REPO>|$DOCKER_REPO|" qdrant/manifests/05-rag/docs-embedder.yaml | kubectl -n qdrant apply -f -
Elasticsearch
sed "s|<DOCKER_REPO>|$DOCKER_REPO|" elasticsearch/manifests/05-rag/chatbot.yaml | kubectl -n elastic apply -f - sed "s|<DOCKER_REPO>|$DOCKER_REPO|" elasticsearch/manifests/05-rag/docs-embedder.yaml | kubectl -n elastic apply -f -
PGVector
sed "s|<DOCKER_REPO>|$DOCKER_REPO|" postgres-pgvector/manifests/03-rag/chatbot.yaml | kubectl -n pg-ns apply -f - sed "s|<DOCKER_REPO>|$DOCKER_REPO|" postgres-pgvector/manifests/03-rag/docs-embedder.yaml | kubectl -n pg-ns apply -f -
Weaviate
sed "s|<DOCKER_REPO>|$DOCKER_REPO|" weaviate/manifests/04-rag/chatbot.yaml | kubectl -n weaviate apply -f - sed "s|<DOCKER_REPO>|$DOCKER_REPO|" weaviate/manifests/04-rag/docs-embedder.yaml | kubectl -n weaviate apply -f -
Aktifkan pemicu Eventarc untuk GKE:
gcloud eventarc gke-destinations init
Saat diminta, masukkan
y
.Deploy bucket Cloud Storage dan buat pemicu Eventarc menggunakan Terraform:
export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token) terraform -chdir=vector-database/terraform/cloud-storage init terraform -chdir=vector-database/terraform/cloud-storage apply \ -var project_id=${PROJECT_ID} \ -var region=${REGION} \ -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX} \ -var db_namespace=${DB_NAMESPACE}
Saat diminta, ketik
yes
. Mungkin perlu waktu beberapa menit hingga perintah selesai.Terraform membuat resource berikut:
- Bucket Cloud Storage untuk mengupload dokumen
- Pemicu Eventarc
- Akun Layanan Google Cloud bernama
service_account_eventarc_name
dengan izin untuk menggunakan Eventarc. - Akun Layanan Google Cloud bernama
service_account_bucket_name
dengan izin untuk membaca bucket dan mengakses model Vertex AI.
Outputnya mirip dengan hal berikut ini:
... # Several lines of output omitted Apply complete! Resources: 15 added, 0 changed, 0 destroyed. ... # Several lines of output omitted
Memuat dokumen dan menjalankan kueri chatbot
Upload dokumen demo dan jalankan kueri untuk menelusuri dokumen demo menggunakan chatbot:
Upload contoh dokumen
carbon-free-energy.pdf
ke bucket Anda:gsutil cp vector-database/documents/carbon-free-energy.pdf gs://${PROJECT_ID}-${KUBERNETES_CLUSTER_PREFIX}-training-docs
Verifikasi bahwa tugas penyematan dokumen berhasil diselesaikan:
kubectl get job -n ${DB_NAMESPACE}
Outputnya mirip dengan hal berikut ini:
NAME COMPLETIONS DURATION AGE docs-embedder1716570453361446 1/1 32s 71s
Dapatkan alamat IP eksternal load balancer:
export EXTERNAL_IP=$(kubectl -n ${DB_NAMESPACE} get svc chatbot --output jsonpath='{.status.loadBalancer.ingress[0].ip}') echo http://${EXTERNAL_IP}:80
Buka alamat IP eksternal di browser web Anda:
http://EXTERNAL_IP
Chatbot akan merespons dengan pesan yang mirip dengan berikut ini:
How can I help you?
Ajukan pertanyaan tentang konten dokumen yang diupload. Jika chatbot tidak dapat menemukan apa pun, chatbot akan menjawab
I don't know
. Misalnya, Anda dapat bertanya hal berikut:You: Hi, what are Google plans for the future?
Contoh output dari chatbot mirip dengan yang berikut ini:
Bot: Google intends to run on carbon-free energy everywhere, at all times by 2030. To achieve this, it will rely on a combination of renewable energy sources, such as wind and solar, and carbon-free technologies, such as battery storage.
Ajukan pertanyaan kepada chatbot yang tidak sesuai dengan konteks dokumen yang diupload. Misalnya, Anda dapat menanyakan hal berikut:
You: What are Google plans to colonize Mars?
Contoh output dari chatbot mirip dengan yang berikut ini:
Bot: I don't know. The provided context does not mention anything about Google's plans to colonize Mars.
Tentang kode aplikasi
Bagian ini menjelaskan cara kerja kode aplikasi. Ada tiga skrip di dalam image Docker:
endpoint.py
: menerima peristiwa Eventarc pada setiap upload dokumen dan memulai Tugas Kubernetes untuk memprosesnya.embedding-job.py
: mendownload dokumen dari bucket, membuat penyematan, dan menyisipkan penyematan ke dalam database vektor.chat.py
: menjalankan kueri pada konten dokumen yang disimpan.
Diagram menunjukkan proses pembuatan jawaban menggunakan data dokumen:
Dalam diagram, aplikasi memuat file PDF, membagi file menjadi beberapa bagian, lalu memvektorkan, lalu mengirim vektor ke database vektor. Kemudian, pengguna mengajukan pertanyaan kepada chatbot. Rantai RAG menggunakan penelusuran semantik untuk menelusuri database vektor, lalu menampilkan konteks beserta pertanyaan ke LLM. LLM menjawab pertanyaan, dan menyimpan pertanyaan ke histori chat.
Tentang endpoint.py
File ini memproses pesan dari Eventarc, membuat Tugas Kubernetes untuk menyematkan dokumen, dan menerima permintaan dari mana saja di port 5001
Qdrant
Elasticsearch
PGVector
Weaviate
Tentang embedding-job.py
File ini memproses dokumen dan mengirimkannya ke database vektor.
Qdrant
Elasticsearch
PGVector
Weaviate
Tentang chat.py
File ini mengonfigurasi model untuk menjawab pertanyaan hanya menggunakan konteks
yang diberikan dan jawaban sebelumnya. Jika konteks atau histori percakapan tidak cocok dengan data apa pun, model akan menampilkan I don't know
.
Qdrant
Elasticsearch
PGVector
Weaviate
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
Menghapus project
Cara termudah untuk menghindari penagihan adalah dengan menghapus project yang Anda buat untuk tutorial ini.
Menghapus project Google Cloud:
gcloud projects delete PROJECT_ID
Jika Anda menghapus project ini, berarti pembersihan telah selesai. Jika Anda tidak menghapus project, lanjutkan untuk menghapus resource individual.
Menghapus resource satu per satu
Hapus repositori Artifact Registry:
gcloud artifacts repositories delete ${KUBERNETES_CLUSTER_PREFIX}-images \ --location=${REGION} \ --async
Saat diminta, ketik
y
.Hapus bucket Cloud Storage dan pemicu Eventarc:
export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token) terraform -chdir=vector-database/terraform/cloud-storage destroy \ -var project_id=${PROJECT_ID} \ -var region=${REGION} \ -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX} \ -var db_namespace=${DB_NAMESPACE}
Saat diminta, ketik
yes
.Eventarc mengharuskan Anda memiliki target endpoint yang valid baik selama pembuatan maupun selama penghapusan.
Langkah selanjutnya
- Pelajari praktik terbaik untuk men-deploy database di GKE.
- Temukan solusi untuk menjalankan workload yang intensif data dengan GKE.