In dieser Anleitung erfahren Sie, wie Sie eine LLM-Anwendung (Large Language Model) auf der Grundlage von Retrieval Augmented Generation (RAG) in PDF-Dateien einbinden, die Sie in einen Cloud Storage-Bucket hochladen.
In diesem Leitfaden wird eine Datenbank als Speicher- und semantische Suchmaschine verwendet, die die Darstellungen (Einbettungen) der hochgeladenen Dokumente enthält. 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 Aufgaben des maschinellen Lernens vereinfacht und Schnittstellen zur Einbindung in verschiedene Vektordatenbanken und KI-Dienste 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 interessiert sind. 101}zu GKE und Cloud Storage.
Ziele
In dieser Anleitung erfahren Sie mehr über die folgenden Themen:
- Anwendung erstellen und bereitstellen, um Dokumenteinbettungen in einer Vektordatenbank zu erstellen und zu speichern.
- Automatisieren Sie die Anwendung, um neue Dokumentuploads in einen Cloud Storage-Bucket auszulösen.
- Stellen Sie eine Chatbot-Anwendung bereit, die mithilfe der semantischen Suche Fragen anhand des Dokumenteninhalts beantwortet.
Bereitstellungsarchitektur
In dieser Anleitung erstellen Sie einen Cloud Storage-Bucket, einen Eventarc-Trigger und die folgenden Dienste:
embed-docs
: Eventarc löst diesen Dienst jedes Mal aus, wenn ein Nutzer ein neues Dokument in den Cloud Storage-Bucket hochlädt. Der Dienst startet einen Kubernetes-Job, der Einbettungen für das hochgeladene Dokument erstellt und die Einbettungen in eine Vektordatenbank einfügt.chatbot
: Dieser Dienst beantwortet Fragen in natürlicher Sprache zu den hochgeladenen Dokumenten mithilfe der semantischen Suche und der Gemini API.
Das folgende Diagramm zeigt den Vorgang zum Hochladen und Vektorisieren von Dokumenten:
Im Diagramm lädt der Nutzer Dateien in den Cloud Storage-Bucket hoch.
Eventarc abonniert metadataUpdated
-Objekt-Ereignisse für den Bucket und verwendet den Ereignis-Forwarder von Eventarc, eine Kubernetes-Arbeitslast, um den embed-docs
-Dienst aufzurufen, wenn Sie ein neues Dokument hochladen. Der Dienst erstellt dann Einbettungen für das hochgeladene Dokument. Der embed-docs
-Dienst speichert die Einbettungen mit dem Vertex AI-Einbettungsmodell in einer Vektordatenbank.
Das folgende Diagramm zeigt, wie Fragen zum hochgeladenen Dokumentinhalt mit dem Dienst chatbot
gestellt werden:
Nutzer können Fragen mit natürlicher Sprache stellen. Der Chatbot generiert Antworten ausschließlich auf Grundlage des Inhalts der hochgeladenen Dateien. Der Chatbot ruft den Kontext mithilfe der semantischen Suche aus der Vektordatenbank ab und sendet dann die Frage und den Kontext an Gemini.
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Hinweise
In dieser Anleitung verwenden Sie Cloud Shell zum Ausführen von Befehlen. Cloud Shell ist eine Shell-Umgebung für die Verwaltung von Ressourcen, die in Google Cloud gehostet werden. Cloud Shell wird mit den Befehlszeilentools Google Cloud CLI, kubectl und istioctl vorinstalliert. Wenn Sie Cloud Shell nicht verwenden, installieren Sie die 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
-
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.
-
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
Cluster erstellen
Erstellen Sie einen Qdrant-, Elasticsearch- oder Postgres-Cluster:
Qdrant
Folgen Sie der Anleitung unter Qdrant-Vektordatenbank in GKE bereitstellen, um einen Qdrant-Cluster zu erstellen, der auf 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 auf 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 in einem GKE-Cluster im Autopilot- oder Standardmodus zu erstellen.
Weaviate
Folgen Sie der Anleitung unter Weaviate-Vektordatenbank in GKE bereitstellen, um einen Weaviate-Cluster zu erstellen, der auf 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 REGION=us-central1 export DB_NAMESPACE=qdrant
Ersetzen Sie
PROJECT_ID
durch Ihre Google Cloud-Projekt-ID.Elasticsearch
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=elasticsearch export REGION=us-central1 export DB_NAMESPACE=elastic
Ersetzen Sie
PROJECT_ID
durch Ihre Google Cloud-Projekt-ID.PGVector
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=postgres export REGION=us-central1 export DB_NAMESPACE=pg-ns
Ersetzen Sie
PROJECT_ID
durch Ihre Google Cloud-Projekt-ID.Weaviate
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=weaviate export REGION=us-central1 export DB_NAMESPACE=weaviate
Ersetzen Sie
PROJECT_ID
durch Ihre Google Cloud-Projekt-ID.Prüfen Sie, ob Ihr GKE-Cluster ausgeführt wird
gcloud container clusters list --project=${PROJECT_ID} --region=${REGION}
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
databases
auf:cd kubernetes-engine-samples/databases
Infrastruktur vorbereiten
Erstellen Sie ein Artifact Registry-Repository, erstellen Sie Docker-Images und übertragen Sie sie 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.objectAdmin
undartifactregistry.admin
zu, 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_NUMBER
durch Ihre Google Cloud-Projektnummer.Erstellen Sie Docker-Images für die
embed-docs
- undchatbot
-Dienste. Das Imageembed-docs
enthä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
Überprüfen Sie die Images:
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_account
auf „true“ festgelegt haben, wird ein separates Dienstkonto erstellt und vom Cluster und den Knoten verwendet. Weisen Sie diesem Compute Engine-Dienstkonto die Rolleartifactregistry.serviceAgent
zu, damit die Knoten das Image aus der Artifact Registry abrufen können, die fürembed-docs
undchatbot
erstellt wurde.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"
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: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
y
ein.Stellen Sie den Cloud Storage-Bucket bereit und erstellen Sie mit Terraform einen Eventarc-Trigger:
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
yes
ein. Es kann einige Minuten dauern, bis der Befehl ausgeführt wurde.Terraform erstellt die folgenden Ressourcen:
- Ein Cloud Storage-Bucket zum Hochladen der Dokumente
- Eventarc-Trigger
- Ein Google Cloud-Dienstkonto mit dem Namen
service_account_eventarc_name
und der Berechtigung zur Verwendung von Eventarc. - Ein Google Cloud-Dienstkonto mit dem Namen
service_account_bucket_name
mit Berechtigung zum Lesen des Buckets und zum Zugreifen auf Vertex AI-Modelle.
Die Ausgabe sieht in 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-Abfragen ausführen
Laden Sie die Demodokumente hoch und führen Sie Suchanfragen mit dem Chatbot aus:
Laden Sie das Beispieldokument
carbon-free-energy.pdf
in den Bucket hoch:gsutil 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 dieser:
How can I help you?
Stellen Sie Fragen zum Inhalt der hochgeladenen Dokumente. Wenn der Chatbot nichts findet, antwortet er mit
I don't know
. Sie können zum Beispiel Folgendes fragen: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.
Sie stellen dem Chatbot eine Frage, die nicht zum Kontext des hochgeladenen Dokuments gehört. 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.
Über den Anwendungscode
In diesem Abschnitt wird gezeigt, wie der Anwendungscode funktioniert. Die Docker-Images enthalten drei Scripts:
endpoint.py
: empfängt Eventarc-Ereignisse bei jedem Dokumentupload und startet die Kubernetes-Jobs zur Verarbeitung.embedding-job.py
: Lädt Dokumente aus dem Bucket herunter, erstellt Einbettungen und fügt Einbettungen in die Vektordatenbank ein.chat.py
: Führt Abfragen für den Inhalt gespeicherter Dokumente aus.
Das Diagramm zeigt, wie Antworten mithilfe der Dokumentdaten generiert werden:
Im Diagramm lädt die Anwendung eine PDF-Datei, teilt die Datei in Blöcke auf, Vektoren und sendet die Vektoren dann an eine Vektordatenbank. 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 die Frage im Chatverlauf.
Über endpoint.py
In dieser Datei werden Nachrichten von Eventarc verarbeitet, ein Kubernetes-Job zum Einbetten des Dokuments erstellt und Anfragen von überall über Port 5001 akzeptiert.
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 mit dem bereitgestellten Kontext und den vorherigen Antworten beantwortet. Wenn der Kontext- oder Unterhaltungsverlauf nicht mit Daten übereinstimmt, gibt das Modell I don't know
zurück.
Qdrant
Elasticsearch
PGVector
Weaviate
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.
Projekt löschen
Sie vermeiden weitere Kosten am einfachsten, wenn Sie das für die Anleitung erstellte Projekt löschen.
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Wenn Sie das Projekt gelöscht haben, ist die Bereinigung abgeschlossen. Wenn Sie das Projekt nicht gelöscht haben, fahren Sie mit dem Löschen der einzelnen Ressourcen fort.
Einzelne Ressourcen löschen
Löschen Sie das Artifact Registry-Repository:
gcloud artifacts repositories delete ${KUBERNETES_CLUSTER_PREFIX}-images \ --location=${REGION} \ --async
Geben Sie bei Aufforderung
y
ein.Löschen Sie den Cloud Storage-Bucket und den Eventarc-Trigger:
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}
Geben Sie bei Aufforderung
yes
ein.Für Eventarc ist sowohl beim Erstellen als auch beim Löschen ein gültiges Endpunktziel erforderlich.
Nächste Schritte
- Best Practices für die Bereitstellung von Datenbanken in GKE.
- Lösungen zum Ausführen datenintensiver Arbeitslasten mit GKE