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=qdrantErsetzen 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=elasticErsetzen 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-nsErsetzen 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=weaviateErsetzen 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 RUNNINGKlonen Sie das Beispielcode-Repository aus GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samplesRufen 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" \ --asyncWeisen Sie dem Compute Engine-Dienstkonto die Berechtigungen
storage.objectAdminundartifactregistry.adminzu, damit Cloud Build zum Erstellen und zur Push-Übertragung von Docker-Images für dieembed-docs- undchatbot-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- undchatbot-Dienste. Das Imageembed-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 --asyncElasticsearch
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 --asyncPGVector
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 --asyncWeaviate
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 --asyncBilder ü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-docsStellen 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 Rolleartifactregistry.serviceAgentzu, damit die Knoten das Image aus der Artifact Registry abrufen können, die fürembed-docsundchatboterstellt 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- undchatbot-Dienste bereitgestellt werden.Stellen Sie ein Kubernetes-Deployment für die
embed-docs- undchatbot-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 initGeben 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-docsPrü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 71sRufen 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_IPDer 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.