Tutorial ini menunjukkan cara mengintegrasikan aplikasi model bahasa besar (LLM) berdasarkan pembuatan yang didukung pengambilan (RAG) dengan file PDF yang Anda upload ke bucket Cloud Storage.
Panduan ini menggunakan database sebagai mesin penelusuran semantik dan penyimpanan yang menyimpan representasi (embedding) dokumen yang diupload. Anda menggunakan framework Langchain untuk berinteraksi dengan embedding dan Anda 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 layanan AI dan database vektor.
Tutorial ini ditujukan untuk administrator dan arsitek platform cloud, engineer ML, serta profesional MLOps (DevOps) yang tertarik untuk men-deploy aplikasi LLM RAG ke GKE dan Cloud Storage.
Tujuan
Dalam tutorial ini, Anda akan mempelajari cara:
- Bangun dan deploy aplikasi untuk membuat dan menyimpan embedding dokumen dalam database vektor.
- Mengotomatiskan 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 memulai Kubernetes Job yang membuat embedding untuk dokumen yang diupload dan menyisipkan embedding 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 memvektorisasi dokumen:
Dalam diagram, pengguna mengupload file ke bucket Cloud Storage.
Eventarc berlangganan peristiwa metadataUpdated
objek untuk bucket dan menggunakan penerus peristiwa Eventarc, yang merupakan workload Kubernetes, untuk memanggil Layanan embed-docs
saat Anda mengupload dokumen baru. Layanan
kemudian membuat embedding untuk dokumen yang diupload. embed-docs
Service menyimpan embedding dalam database vektor menggunakan model embedding 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 mengirimkan pertanyaan dan konteks ke Gemini.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang 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 sebelumnya 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.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Vertex AI, Cloud Build, Eventarc, Artifact Registry APIs:
gcloud services enable aiplatform.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com artifactregistry.googleapis.com -
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Vertex AI, Cloud Build, Eventarc, Artifact Registry APIs:
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 di Men-deploy database vektor Qdrant di GKE untuk membuat cluster Qdrant yang berjalan di cluster GKE mode Autopilot atau mode Standard.
Elasticsearch
Ikuti petunjuk di Men-deploy database vektor Elasticsearch di GKE untuk membuat cluster Elasticsearch yang berjalan di cluster GKE mode Autopilot atau mode Standard.
PGVector
Ikuti petunjuk di 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 Google Cloud project ID Anda.Elasticsearch
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=elasticsearch export REGION=us-central1 export DB_NAMESPACE=elastic
Ganti
PROJECT_ID
dengan Google Cloud project ID 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 Google Cloud project ID Anda.Weaviate
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=weaviate export REGION=us-central1 export DB_NAMESPACE=weaviate
Ganti
PROJECT_ID
dengan Google Cloud project ID 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 Anda
Buat repositori Artifact Registry, bangun 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 guna membangun 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 Google Cloud nomor project Anda.Buat image Docker untuk Layanan
embed-docs
danchatbot
. Imageembed-docs
berisi kode Python untuk aplikasi yang menerima permintaan penerusan 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
create_service_account
ditetapkan sebagai benar (true), akun layanan terpisah akan dibuat dan digunakan oleh cluster dan node. Berikan peranartifactregistry.serviceAgent
ke akun layanan Compute Engine ini agar node dapat menarik 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 menarik image dari Artifact Registry saat men-deploy Layanan
embed-docs
danchatbot
.Deploy Deployment Kubernetes untuk Layanan
embed-docs
danchatbot
. Deployment adalah objek Kubernetes API yang memungkinkan Anda menjalankan beberapa replika Pod yang didistribusikan di antara node dalam cluster: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 untuk menyelesaikan perintah.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 dokumen
carbon-free-energy.pdf
contoh ke bucket Anda:gcloud storage 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 diunggah. Jika chatbot tidak dapat menemukan apa pun, chatbot akan menjawab
I don't know
. Misalnya, Anda dapat mengajukan pertanyaan berikut:You: Hi, what are Google plans for the future?
Contoh output dari chatbot mirip dengan 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.
Mengajukan pertanyaan kepada chatbot yang tidak sesuai dengan konteks dokumen yang diupload. Misalnya, Anda dapat mengajukan pertanyaan berikut:
You: What are Google plans to colonize Mars?
Contoh output dari chatbot mirip dengan 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 Job Kubernetes untuk memprosesnya.embedding-job.py
: mendownload dokumen dari bucket, membuat embedding, dan memasukkan embedding ke dalam database vektor.chat.py
: menjalankan kueri atas konten dokumen yang disimpan.
Diagram menunjukkan proses pembuatan jawaban menggunakan data dokumen:
Dalam diagram, aplikasi memuat file PDF, membagi file menjadi beberapa bagian, lalu memvektor, lalu mengirimkan 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 Job 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.
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Jika Anda menghapus project ini, berarti pembersihan telah selesai. Jika Anda tidak menghapus project, lanjutkan dengan menghapus resource satu per satu.
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 berikutnya
- Pelajari praktik terbaik untuk men-deploy database di GKE.
- Temukan solusi untuk menjalankan workload yang membutuhkan banyak data dengan GKE.