In dieser Anleitung erfahren Sie, wie Sie eine LLM-Anwendung (Large Language Model, großes Sprachmodell), die auf Retrieval Augmented Generation (RAG) basiert, in PDF-Dateien einbinden, die Sie in einen Cloud Storage-Bucket hochladen.
In dieser Anleitung wird eine Datenbank als Speicher- und semantische Suchmaschine verwendet, in der die Darstellungen (Einbettungen) der hochgeladenen Dokumente gespeichert werden. Sie verwenden das Langchain-Framework, um mit den Einbettungen zu interagieren, und Gemini-Modelle, die über Vertex AI verfügbar sind.
LangChain ist ein beliebtes Open-Source-Python-Framework, das viele Machine-Learning-Aufgaben vereinfacht und Schnittstellen für die Integration mit verschiedenen Vektordatenbanken und KI-Diensten bietet.
Diese Anleitung richtet sich an Cloud Platform-Administratoren und -Architekten, ML-Entwickler und MLOps-Experten (DevOps), die an der Bereitstellung von RAG-LLM-Anwendungen in GKE und Cloud Storage interessiert sind.
Cluster erstellen
Qdrant-, Elasticsearch- oder Postgres-Cluster erstellen:
Qdrant
Folgen Sie der Anleitung unter Qdrant-Vektordatenbank in GKE bereitstellen, um einen Qdrant-Cluster zu erstellen, der in einem GKE-Cluster im Autopilot- oder Standardmodus ausgeführt wird.
Elasticsearch
Folgen Sie der Anleitung unter Elasticsearch-Vektordatenbank in GKE bereitstellen, um einen Elasticsearch-Cluster zu erstellen, der in einem GKE-Cluster im Autopilot- oder Standardmodus ausgeführt wird.
PGVector
Folgen Sie der Anleitung unter PostgreSQL-Vektordatenbank in GKE bereitstellen, um einen Postgres-Cluster mit PGVector zu erstellen, der in einem GKE-Cluster im Autopilot- oder Standardmodus ausgeführt wird.
Weaviate
Folgen Sie der Anleitung zum Bereitstellen einer Weaviate-Vektordatenbank in GKE, um einen Weaviate-Cluster zu erstellen, der in einem GKE-Cluster im Autopilot- oder Standardmodus ausgeführt wird.
Umgebung einrichten
So richten Sie Ihre Umgebung mit Cloud Shell ein:
- Legen Sie Umgebungsvariablen für Ihr Projekt fest: - 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- Ersetzen Sie - PROJECT_IDdurch IhreGoogle Cloud Projekt-ID.- 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- Ersetzen Sie - PROJECT_IDdurch IhreGoogle Cloud Projekt-ID.- 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- Ersetzen Sie - PROJECT_IDdurch IhreGoogle Cloud Projekt-ID.- 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- Ersetzen Sie - PROJECT_IDdurch IhreGoogle Cloud Projekt-ID.
- Prüfen Sie, ob Ihr GKE-Cluster ausgeführt wird - gcloud container clusters list --project=${PROJECT_ID} --location=${CONTROL_PLANE_LOCATION}- Die Ausgabe sieht in etwa so aus: - 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
- Klonen Sie das Beispielcode-Repository aus GitHub: - git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
- Rufen Sie das Verzeichnis - databasesauf:- cd kubernetes-engine-samples/databases
Infrastruktur vorbereiten
Erstellen Sie ein Artifact Registry-Repository, erstellen Sie Docker-Images und übertragen Sie Docker-Images per Push an Artifact Registry:
- Erstellen Sie ein Artifact Registry-Repository: - gcloud artifacts repositories create ${KUBERNETES_CLUSTER_PREFIX}-images \ --repository-format=docker \ --location=${REGION} \ --description="Vector database images repository" \ --async
- Weisen Sie dem Compute Engine-Dienstkonto die Berechtigungen - storage.objectAdminund- artifactregistry.adminzu, damit Cloud Build zum Erstellen und zur Push-Übertragung von Docker-Images für die- embed-docs- und- chatbot-Dienste verwendet werden kann.- 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"- Ersetzen Sie - PROJECT_NUMBERdurch dieGoogle Cloud Projektnummer.
- Erstellen Sie Docker-Images für die - embed-docs- und- chatbot-Dienste. Das Image- embed-docsenthält Python-Code sowohl für die Anwendung, die Eventarc-Weiterleitungsanfragen empfängt, als auch für den Einbettungsjob.- 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
- Bilder überprüfen: - gcloud artifacts docker images list $DOCKER_REPO \ --project=$PROJECT_ID \ --format="value(IMAGE)"- Die Ausgabe sieht in etwa so aus: - $REGION-docker.pkg.dev/$PROJECT_ID/${KUBERNETES_CLUSTER_PREFIX}-images/chatbot $REGION-docker.pkg.dev/$PROJECT_ID/${KUBERNETES_CLUSTER_PREFIX}-images/embed-docs
- Stellen Sie ein Kubernetes-Dienstkonto mit Berechtigungen zum Ausführen von Kubernetes-Jobs bereit: - 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 -
- Wenn Sie den GKE-Cluster mit Terraform erstellen und - create_service_accountauf „true“ festgelegt haben, wird ein separates Dienstkonto erstellt und vom Cluster und den Knoten verwendet. Weisen Sie diesem Compute Engine-Dienstkonto die Rolle- artifactregistry.serviceAgentzu, damit die Knoten das Image aus der Artifact Registry abrufen können, die für- embed-docsund- chatboterstellt wurde.- 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"- Falls Sie dem Dienstkonto keinen Zugriff gewähren, kann es bei Ihren Knoten zu Berechtigungsproblemen beim Abrufen des Images aus der Artifact Registry kommen, wenn die - embed-docs- und- chatbot-Dienste bereitgestellt werden.
- Stellen Sie ein Kubernetes-Deployment für die - embed-docs- und- chatbot-Dienste bereit. Ein Deployment ist ein Kubernetes-API-Objekt, mit dem Sie mehrere Replikate von Pods ausführen können, die auf die Knoten in einem Cluster verteilt sind:- 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 -
- Eventarc-Trigger für GKE aktivieren: - gcloud eventarc gke-destinations init- Geben Sie bei Aufforderung - yein.
- Cloud Storage-Bucket bereitstellen und Eventarc-Trigger mit Terraform erstellen: - 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}- Geben Sie bei Aufforderung - yesein. Es kann einige Minuten dauern, bis der Befehl ausgeführt wurde.- Terraform erstellt die folgenden Ressourcen: - Ein Cloud Storage-Bucket zum Hochladen der Dokumente
- Ein Eventarc-Trigger
- Ein Google Cloud -Dienstkonto mit dem Namen service_account_eventarc_namemit der Berechtigung zur Verwendung von Eventarc.
- Ein Google Cloud -Dienstkonto mit dem Namen service_account_bucket_namemit der Berechtigung, den Bucket zu lesen und auf Vertex AI-Modelle zuzugreifen.
 - Die Ausgabe sieht etwa so aus: - ... # Several lines of output omitted Apply complete! Resources: 15 added, 0 changed, 0 destroyed. ... # Several lines of output omitted
Dokumente laden und Chatbot-Anfragen ausführen
Laden Sie die Demodokumente hoch und führen Sie Abfragen aus, um die Demodokumente mit dem Chatbot zu durchsuchen:
- Laden Sie das Beispieldokument - carbon-free-energy.pdfin den Bucket hoch:- gcloud storage cp vector-database/documents/carbon-free-energy.pdf gs://${PROJECT_ID}-${KUBERNETES_CLUSTER_PREFIX}-training-docs
- Prüfen Sie, ob der Job zum Einbetten von Dokumenten erfolgreich abgeschlossen wurde: - kubectl get job -n ${DB_NAMESPACE}- Die Ausgabe sieht in etwa so aus: - NAME COMPLETIONS DURATION AGE docs-embedder1716570453361446 1/1 32s 71s
- Rufen Sie die externe IP-Adresse des Load-Balancers ab: - export EXTERNAL_IP=$(kubectl -n ${DB_NAMESPACE} get svc chatbot --output jsonpath='{.status.loadBalancer.ingress[0].ip}') echo http://${EXTERNAL_IP}:80
- Öffnen Sie die externe IP-Adresse in Ihrem Webbrowser: - http://EXTERNAL_IP- Der Chatbot antwortet mit einer Nachricht wie der folgenden: - How can I help you?
- Fragen zum Inhalt der hochgeladenen Dokumente stellen Wenn der Chatbot nichts findet, antwortet er mit - I don't know. Beispiele:- You: Hi, what are Google plans for the future?- Eine Beispielausgabe des Chatbots sieht in etwa so aus: - 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.
- Stellen Sie dem Chatbot eine Frage, die sich nicht auf das hochgeladene Dokument bezieht. Sie könnten beispielsweise Folgendes fragen: - You: What are Google plans to colonize Mars?- Eine Beispielausgabe des Chatbots sieht in etwa so aus: - Bot: I don't know. The provided context does not mention anything about Google's plans to colonize Mars.
Anwendungscode
In diesem Abschnitt wird gezeigt, wie der Anwendungscode funktioniert. Es gibt drei Skripts in den Docker-Images:
- endpoint.py: Empfängt Eventarc-Ereignisse bei jedem Dokument-Upload und startet die Kubernetes-Jobs zur Verarbeitung.
- embedding-job.py: Lädt Dokumente aus dem Bucket herunter, erstellt Einbettungen und fügt sie in die Vektordatenbank ein.
- chat.py: Führt Abfragen für den Inhalt gespeicherter Dokumente aus.
Das Diagramm zeigt den Prozess zum Generieren von Antworten mithilfe der Dokumentendaten:
Im Diagramm wird eine PDF-Datei geladen, in Blöcke und dann in Vektoren aufgeteilt und an eine Vektordatenbank gesendet. Später stellt ein Nutzer dem Chatbot eine Frage. Die RAG-Kette verwendet die semantische Suche, um die Vektordatenbank zu durchsuchen, und gibt dann den Kontext zusammen mit der Frage an das LLM zurück. Das LLM beantwortet die Frage und speichert sie im Chatverlauf.
Über endpoint.py
Diese Datei verarbeitet Nachrichten von Eventarc, erstellt einen Kubernetes-Job zum Einbetten des Dokuments und akzeptiert Anfragen von überall über Port 5001.
Qdrant
Elasticsearch
PGVector
Weaviate
Über embedding-job.py
Diese Datei verarbeitet Dokumente und sendet sie an die Vektordatenbank.
Qdrant
Elasticsearch
PGVector
Weaviate
Über chat.py
In dieser Datei wird das Modell so konfiguriert, dass es Fragen nur anhand des bereitgestellten Kontexts und der vorherigen Antworten beantwortet. Wenn der Kontext oder der Unterhaltungsverlauf mit keinen Daten übereinstimmt, gibt das Modell I don't know zurück.