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 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.
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 CONTROL_PLANE_LOCATION=us-central1 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 CONTROL_PLANE_LOCATION=us-central1 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 CONTROL_PLANE_LOCATION=us-central1 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 CONTROL_PLANE_LOCATION=us-central1 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} --location=${CONTROL_PLANE_LOCATION}
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 \ --location=${CONTROL_PLANE_LOCATION} \ --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 vektor, 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 dalam 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
.