1. Einführung
In diesem Lab erstellen Sie einen Webdienst zum Generieren von Quizfragen und binden ihn in eine funktionierende App ein. Dabei verwenden Sie eine andere Programmiersprache als bisher: Englisch.
Aufgaben
- Sie erstellen einen Prompt, mit dem ein Quiz mit Wissensfragen anhand einer Reihe von Kriterien generiert wird.
- Sie erstellen eine einfache Web-App und prüfen, ob sie in Ihrer Entwicklungsumgebung wie erwartet ausgeführt wird.
- Sie fügen Ihrer Web-App nach und nach Logik hinzu, um sie in einen API-Server zu verwandeln, der Quizze anhand einer Reihe von Eingabeparametern generiert.
- Sie sehen, wie einfach es ist, Ihren Dienst zur Quizgenerierung mit Google Cloud Run in der Cloud bereitzustellen.
- Schließlich konfigurieren Sie eine echte App ( quizaic.com), um Ihren bereitgestellten Quizgenerator-Dienst zu verwenden. Sie können dann Live-Quiz basierend auf der Ausgabe spielen.
Lerninhalte
- So erstellen Sie einen Vorlagen-Prompt für ein Large Language Model (LLM).
- So erstellen Sie eine einfache Webserver-App in Python.
- So fügen Sie Ihrer Webanwendung Unterstützung für das LLM von Google hinzu.
- So stellen Sie Ihre App in der Cloud bereit, damit jeder Ihre neue Kreation ausprobieren kann.
- So binden Sie Ihren Quizgenerator in eine größere App ein.
Voraussetzungen
- Chrome-Webbrowser
- Ein Google-Konto
- Ein Cloud-Projekt mit aktivierter Abrechnung
Dieses Lab richtet sich an Entwickler aller Erfahrungsstufen, auch an Anfänger. Sie verwenden zwar Python, müssen aber nicht mit der Python-Programmierung vertraut sein, um zu verstehen, was passiert, da wir den gesamten Code erläutern.
2. Einrichtung

In diesem Abschnitt erfahren Sie alles, was Sie für den Einstieg in dieses Lab benötigen.
Umgebung zum selbstbestimmten Lernen einrichten
- Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.



- Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Es handelt sich um einen String, der nicht von Google APIs verwendet wird. Sie können sie jederzeit aktualisieren.
- Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich (kann nach dem Festlegen nicht mehr geändert werden). In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise ist es nicht wichtig, wie dieser String aussieht. In den meisten Codelabs müssen Sie auf Ihre Projekt-ID verweisen (in der Regel als
PROJECT_IDangegeben). Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige ID generieren. Alternativ können Sie es mit einem eigenen Namen versuchen und sehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen. - Zur Information: Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten
- Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs zu verwenden. Die Durchführung dieses Codelabs kostet wenig oder gar nichts. Wenn Sie Ressourcen herunterfahren möchten, um Kosten zu vermeiden, die über diese Anleitung hinausgehen, können Sie die erstellten Ressourcen oder das Projekt löschen. Neue Google Cloud-Nutzer können am kostenlosen Testzeitraum mit einem Guthaben von 300$ teilnehmen.
Cloud Shell starten
In diesem Lab arbeiten Sie in einer Cloud Shell-Sitzung. Das ist ein Befehlsinterpreter, der auf einer virtuellen Maschine in der Google-Cloud gehostet wird. Sie könnten diesen Abschnitt genauso gut lokal auf Ihrem eigenen Computer ausführen, aber mit Cloud Shell hat jeder Zugriff auf eine reproduzierbare Umgebung. Nach dem Lab können Sie diesen Abschnitt gern auf Ihrem eigenen Computer wiederholen.

Cloud Shell aktivieren
- Klicken Sie in der Cloud Console auf Cloud Shell aktivieren
.

Wenn Sie die Cloud Shell zum ersten Mal starten, wird ein Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter.

Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern.

Auf dieser virtuellen Maschine sind alle erforderlichen Entwicklungstools installiert. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht sogar alle Aufgaben in diesem Codelab können mit einem Browser erledigt werden.
Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie authentifiziert sind und für das Projekt Ihre Projekt-ID eingestellt ist.
- Führen Sie in der Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list
Befehlsausgabe
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Führen Sie den folgenden Befehl in Cloud Shell aus, um zu bestätigen, dass der gcloud-Befehl Ihr Projekt kennt:
gcloud config list project
Befehlsausgabe
[core] project = <PROJECT_ID>
Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:
gcloud config set project <PROJECT_ID>
Befehlsausgabe
Updated property [core/project].
Einige APIs aktivieren
In späteren Schritten sehen Sie, wo diese Dienste benötigt werden und warum. Führen Sie jetzt diesen Befehl aus, um Ihrem Projekt Zugriff auf Cloud Build, Artifact Registry, Vertex AI und Cloud Run zu gewähren:
gcloud services enable cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
aiplatform.googleapis.com \
run.googleapis.com
Wenn die Aktivierung erfolgreich war, erhalten Sie eine Meldung, die ungefähr so aussieht:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
3. Prompting – Programmieren in natürlicher Sprache

Zuerst lernen wir, wie man einen Prompt für ein Large Language Model entwickelt. Rufen Sie die Google Cloud Console > Vertex AI > Vertex AI Studio (Language) auf. Sie sollten eine Seite wie diese sehen:

Klicken Sie unter Generate Text auf die Schaltfläche Text Prompt. Geben Sie im nächsten Dialogfeld einen Prompt ein, der Ihrer Meinung nach effektiv für die Erstellung eines Quiz mit Wissensfragen gemäß den folgenden Anforderungen sein könnte:
- Thema: Weltgeschichte
- Anzahl der Fragen: 5
- Schwierigkeitsgrad: mittel
- Sprache: Englisch
Klicken Sie auf die Schaltfläche „Senden“, um die Ausgabe zu sehen.
Wie im folgenden Screenshot zu sehen ist, können Sie im rechten Bereich auswählen, welches Modell Sie verwenden möchten, und einige Einstellungen anpassen:

Diese Einstellungen sind verfügbar:
- Die Region, in der Ihre Generierungsanfrage ausgeführt werden soll.
- Mit „Modell“ wird das Large Language Model ausgewählt, das Sie verwenden möchten. Verwenden Sie für dieses Codelab „gemini-1.0-pro-001“.
- Die Temperatur bestimmt den Grad der Zufälligkeit bei der Tokenauswahl. Niedrigere Temperaturen eignen sich gut für Prompts, die eine wahre oder richtige Antwort erwarten, während höhere Temperaturen zu unterschiedlichen oder unerwarteten Ergebnissen führen können.
- Das Tokenlimit legt die maximale Textmenge fest, die für einen Prompt ausgegeben wird. Ein Token besteht aus etwa vier Zeichen. Der Standardwert ist 1.024.
- Der Wert „Top-K“ ändert, wie das Modell Tokens für die Ausgabe auswählt. Ein „Top-K“ von 1 bedeutet, dass das ausgewählte Token das wahrscheinlichste unter allen Tokens im Vokabular des Modells ist (auch als „Greedy Decoding“ bezeichnet). Ein „Top-K“ von 3 bedeutet dagegen, dass das nächste Token aus den 3 wahrscheinlichsten Tokens ausgewählt wird (mithilfe der Temperatur). Der Standardwert von „Top-K“ ist 40.
- Der Wert „Top-P“ ändert, wie das Modell Tokens für die Ausgabe auswählt. Tokens werden vom wahrscheinlichsten bis zum am wenigsten wahrscheinlichen Token ausgewählt, bis die Summe ihrer Wahrscheinlichkeiten dem Wert von „Top-P“ entspricht.
- „Max. Antworten“ ist die maximale Anzahl von Modellantworten, die pro Prompt generiert werden.
- Eine Stoppsequenz ist eine Reihe von Zeichen (einschließlich Leerzeichen), die die Antwortgenerierung stoppt, wenn das Modell darauf stößt.
- Mit „Streamingantworten“ wird festgelegt, ob Antworten ausgedruckt werden sollen, sobald sie generiert werden, oder ob sie gespeichert und erst angezeigt werden sollen, wenn sie fertig sind.
- Mit dem Schwellenwert für Sicherheitsfilter können Sie die Wahrscheinlichkeit anpassen, dass für Sie Antworten angezeigt werden, die möglicherweise schädlich sind.
Sobald Sie einen Prompt haben, der ein angemessenes Quiz gemäß den oben genannten Anforderungen zu generieren scheint, könnten wir dieses Quiz mit benutzerdefiniertem Code parsen. Wäre es aber nicht besser, wenn das LLM das Quiz in einem strukturierten Format generiert, das wir direkt in unser Programm laden können? Das Programm, das wir später in diesem Lab verwenden, um Ihren Generator aufzurufen, erwartet, dass Quizze in JSON ausgedrückt werden. JSON ist ein beliebtes sprachübergreifendes Format zur Darstellung strukturierter Daten.
Quizze in diesem Lab werden als Array von Objekten ausgedrückt. Jedes Objekt enthält eine Frage, ein Array mit möglichen Antworten auf diese Frage und eine richtige Antwort. Hier ist die JSON-Codierung für Quizze in diesem Lab:
[
{
"question": "Who was the first person to walk on the moon?",
"responses": [
"Neil Armstrong",
"Buzz Aldrin",
"Michael Collins",
"Yuri Gagarin"
],
"correct": "Neil Armstrong"
},
{
"question": "What was the name of the war that took place between the British and the French in North America from 1754 to 1763??",
"responses": [
"The French and Indian War",
"The Seven Years' War",
"The War of the Austrian Succession",
"The Great War"
],
"correct": "The French and Indian War"
},
...
]
Prüfen Sie, ob Sie Ihren Prompt so anpassen können, dass das Quiz im erforderlichen JSON-Format ausgegeben wird.
- Geben Sie das gewünschte Format genau an (z.B. den kursiv formatierten Satz oben).
- Fügen Sie in Ihren Prompt ein Beispiel für das gewünschte JSON-Format ein.
Wenn Sie einen Prompt haben, mit dem Quizze gemäß Ihren gewünschten Spezifikationen generiert werden, klicken Sie rechts oben auf der Seite auf die Schaltfläche GET CODE, um Python-Code zu sehen, mit dem Sie Ihren Prompt programmatisch an ein Vertex AI-LLM senden können. Wenn Sie eine andere Programmiersprache als Python verwenden möchten, sehen Sie sich https://cloud.google.com/vertex-ai/docs/samples?text=generative an.
4. Einfachen Webserver erstellen

Nachdem Sie einen funktionierenden Prompt haben, möchten wir ihn in eine größere App einbinden. Natürlich könnten wir Ihren Prompt in den Quellcode der größeren App einbetten, aber wir möchten, dass Ihr Generator als Mikrodienst fungiert, der einen Quizgenerierungsdienst für andere Apps bereitstellt. Dazu müssen wir einen einfachen Webserver erstellen und ihn öffentlich zugänglich machen. Das machen wir in den folgenden Schritten.
Klicken Sie zuerst oben im Cloud Shell-Bereich auf die Schaltfläche Open Editor. Sie sieht so aus:

Sie befinden sich dann in einer IDE-Umgebung, die Visual Studio Code ähnelt. Dort können Sie Projekte erstellen, Quellcode bearbeiten und Ihre Programme ausführen.
Wenn Ihr Bildschirm zu klein ist, können Sie die Trennlinie zwischen der Konsole und dem Bearbeitungs-/Terminalfenster vergrößern oder verkleinern, indem Sie die horizontale Leiste zwischen den beiden Bereichen ziehen (siehe Abbildung):

Sie können zwischen dem Editor und dem Terminal wechseln, indem Sie auf die Schaltflächen Open Editor bzw. Open Terminal klicken. Wechseln Sie jetzt zwischen diesen beiden Umgebungen hin und her.
Erstellen Sie als Nächstes einen Ordner, in dem Sie Ihre Arbeit für dieses Lab speichern. Klicken Sie dazu auf die Schaltfläche „Ordner hinzufügen“
, geben Sie quiz-generator ein und drücken Sie die Eingabetaste. Alle Dateien, die Sie in diesem Lab erstellen, und alle Aufgaben, die Sie in Cloud Shell ausführen, werden in diesem Ordner gespeichert.
Erstellen Sie nun eine requirements.txt-Datei. Dadurch wird Python mitgeteilt, von welchen Bibliotheken Ihre App abhängig ist. Für diese einfache Web-App verwenden Sie ein beliebtes Python-Modul zum Erstellen von Webservern namens Flask,, die google-cloud-aiplatform-Clientbibliothek und ein Webserver-Framework namens gunicorn. Klicken Sie im Dateinavigationsbereich mit der rechten Maustaste auf den Ordner quiz-generator und wählen Sie das Menüelement New file aus:

Wenn Sie aufgefordert werden, den Namen der neuen Datei einzugeben, geben Sie requirements.txt ein und drücken Sie die Eingabetaste. Achten Sie darauf, dass die neue Datei im Projektordner quiz-generator landet.
Fügen Sie die folgenden Zeilen in die neue Datei ein, um anzugeben, dass Ihre App von dem Python-Paket flask, dem Webserver gunicorn und der Clientbibliothek google-cloud-aiplatform sowie den zugehörigen Versionen der einzelnen Komponenten abhängt.
flask==3.0.0 gunicorn==21.2.0 google-cloud-aiplatform==1.47.0
Sie müssen diese Datei nicht explizit speichern, da Änderungen im Cloud Editor automatisch gespeichert werden.
Erstellen Sie auf dieselbe Weise eine weitere neue Datei mit dem Namen main.py. Dies ist die Haupt- (und einzige) Python-Quelldatei Ihrer App. Achten Sie noch einmal darauf, dass die neue Datei im Ordner quiz-generator landet.
Fügen Sie den folgenden Code in diese Datei ein:
from flask import Flask
import os
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
if not PORT:
PORT = 8080
# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
html = "<h1>Hello world!</h1>"
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
Wechseln Sie zurück zum Terminal und mit diesem Befehl in den Projektordner:
cd quiz-generator
Führen Sie den folgenden Befehl aus, um die Projektabhängigkeiten zu installieren:
pip3 install -r requirements.txt
Nachdem Sie die Abhängigkeiten installiert haben, sollte die Ausgabe so enden:
Successfully installed flask-3.0.0
Starten Sie die App nun mit dem folgenden Befehl im Terminal:
flask --app main.py --debug run --port 8080
Ihre Anwendung wird jetzt auf der VM ausgeführt, die Ihrer Cloud Shell-Sitzung zugewiesen ist. Cloud Shell enthält einen Proxymechanismus, mit dem Sie von überall im Internet auf Webserver zugreifen können, die auf Ihrer VM ausgeführt werden (z. B. auf den Server, den Sie gerade gestartet haben).
Klicken Sie auf die Schaltfläche web preview und dann auf den Menüpunkt Preview on Port 8080:

Dadurch wird ein Webbrowser-Tab für Ihre laufende App geöffnet, der in etwa so aussehen sollte:

5. „generate“-Methode mit Parameterparsing hinzufügen
Wir möchten nun Unterstützung für die Implementierung einer neuen Methode namens generate hinzufügen. Fügen Sie dazu eine Importanweisung hinzu, um die HTTP-Anfrage zu bearbeiten, und ändern Sie die Hauptroute, um diese Anfrage zu parsen und Parameter auszugeben:
from flask import Flask
from flask import request #<-CHANGED
import os
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
if not PORT:
PORT = 8080
# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"]) #<-CHANGED
def generate(): #<-CHANGED
params = request.args.to_dict() #<-CHANGED
html = f"<h1>Quiz Generator</h1>" #<-CHANGED
for param in params: #<-CHANGED
html += f"<br>{param}={params[param]}" #<-CHANGED
return html #<-CHANGED
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
Aktualisieren Sie nun den vorhandenen Browsertab, um die Ergebnisse zu sehen. Dieses Mal sollte der „Quiz Generator“ angezeigt werden. Außerdem wird Ihrer URL automatisch ein Abfrageparameter hinzugefügt (authuser). Fügen Sie zwei weitere Parameter hinzu, indem Sie den String „`¶m1=val1¶m2=val2`“ an das Ende der URL in der Adressleiste Ihres Browsers anhängen. Laden Sie die Seite neu. Sie sollten dann Folgendes sehen:

Nachdem wir uns angesehen haben, wie Abfrageparameter in einer URL gesendet und geparst werden, fügen wir Unterstützung für die spezifischen Parameter hinzu, die wir an unseren Quizgenerator senden möchten. Das sind die folgenden:
topic– das gewünschte Quizthemanum_q– die Anzahl der gewünschten Fragendiff– der gewünschte Schwierigkeitsgrad (einfach, mittel, schwer)lang: die gewünschte Quizsprache
from flask import Flask
from flask import request
import os
# Default quiz settings #<-CHANGED
TOPIC = "History" #<-CHANGED
NUM_Q = "5" #<-CHANGED
DIFF = "intermediate" #<-CHANGED
LANG = "English" #<-CHANGED
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
if not PORT:
PORT = 8080
# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default): #<-CHANGED
if name in args: #<-CHANGED
return args[name] #<-CHANGED
return default #<-CHANGED
# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
args = request.args.to_dict() #<-CHANGED
topic = check(args, "topic", TOPIC) #<-CHANGED
num_q = check(args, "num_q", NUM_Q) #<-CHANGED
diff = check(args, "diff", DIFF) #<-CHANGED
lang = check(args, "lang", LANG) #<-CHANGED
html = f"""
<h1>Quiz Generator</h1><br>
{topic=}<br>
{num_q=}<br>
{diff=}<br>
{lang=}""" #<-CHANGED
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
Aktualisieren Sie nun den vorhandenen Browsertab, um die Ergebnisse zu sehen. Sie sollten eine Webseite sehen, die in etwa so aussieht:

Ändern Sie die URL, um Werte für verschiedene Parameter festzulegen. Fügen Sie beispielsweise das Suffix „?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French“ am Ende der URL in der Adressleiste ein:

6. Prompt hinzufügen und formatieren
Als Nächstes fügen wir Unterstützung für die spezifischen Parameter hinzu, die wir an den Quizgenerator senden möchten. Das sind die folgenden:
topic– das gewünschte Quizthemanum_q– die Anzahl der gewünschten Fragendiff– der gewünschte Schwierigkeitsgrad (einfach, mittel, schwer)lang: die gewünschte Quizsprache
Kopieren Sie den Prompt, den Sie in einem vorherigen Schritt mit Vertex Generative AI Studio entwickelt haben, ändern Sie aber die fest codierten Werte für Thema, Anzahl der Fragen und Schwierigkeitsgrad mit diesen Strings:
- {topic}
- {num_q}
- {diff}
- {lang}
from flask import Flask
from flask import request
import os
# Default quiz settings
TOPIC = "History"
NUM_Q = 5
DIFF = "intermediate"
LANG = "English"
PROMPT = """
Generate a quiz according to the following specifications:
- topic: {topic}
- num_q: {num_q}
- diff: {diff}
- lang: {lang}
Output should be (only) an unquoted json array of objects with keys:
"Question", "responses", and "correct".
""" #<-CHANGED
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
if not PORT:
PORT = 8080
# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):
if name in args:
return args[name]
return default
# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
args = request.args.to_dict()
topic = check(args, "topic", TOPIC)
num_q = check(args, "num_q", NUM_Q)
diff = check(args, "diff", DIFF)
lang = check(args, "lang", LANG)
prompt = PROMPT.format(topic=topic, num_q=num_q, diff=diff, lang=lang) #<-CHANGED
html = f"<h1>Prompt:</h1><br><pre>{prompt}</pre>" #<-CHANGED
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
Aktualisieren Sie nun den vorhandenen Browsertab, um die Ergebnisse zu sehen. Sie sollten eine Webseite sehen, die in etwa so aussieht:

Sie können die URL ändern, um diese vier Parameter anzupassen.
7. Vertex AI-Clientbibliothek hinzufügen
Jetzt können wir die Vertex AI-Python-Clientbibliothek verwenden, um das Quiz zu generieren. Dadurch wird die interaktive Aufforderung, die Sie in Schritt 3 ausgeführt haben, automatisiert und Ihr Generator-Dienst erhält programmatischen Zugriff auf die LLM-Funktionen von Google. Aktualisieren Sie die Datei main.py so:
Ersetzen Sie „YOUR_PROJECT“ durch Ihre tatsächliche Projekt-ID.
from flask import Flask
from flask import request
from flask import Response #<-CHANGED
import os
import vertexai
from vertexai.generative_models import GenerativeModel #<-CHANGED
# Default quiz settings
TOPIC = "History"
NUM_Q = 5
DIFF = "intermediate"
LANG = "English"
MODEL = "gemini-1.0-pro" #<-CHANGED
PROMPT = """
Generate a quiz according to the following specifications:
- topic: {topic}
- num_q: {num_q}
- diff: {diff}
- lang: {lang}
Output should be (only) an unquoted json array of objects with keys "question", "responses", and "correct".
"""
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
if not PORT:
PORT = 8080
# Initialize Vertex AI access.
vertexai.init(project="YOUR_PROJECT", location="us-central1") #<-CHANGED
parameters = { #<-CHANGED
"candidate_count": 1, #<-CHANGED
"max_output_tokens": 1024, #<-CHANGED
"temperature": 0.5, #<-CHANGED
"top_p": 0.8, #<-CHANGED
"top_k": 40, #<-CHANGED
} #<-CHANGED
model = GenerativeModel(MODEL) #<-CHANGED
# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):
if name in args:
return args[name]
return default
# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
args = request.args.to_dict()
topic = check(args, "topic", TOPIC)
num_q = check(args, "num_q", NUM_Q)
diff = check(args, "diff", DIFF)
lang = check(args, "lang", LANG)
prompt = PROMPT.format(topic=topic, num_q=num_q, diff=diff, lang=lang)
response = model.generate_content(prompt, generation_config=parameters) #<-CHANGED
print(f"Response from Model: {response.text}") #<-CHANGED
html = f"{response.text}" #<-CHANGED
return Response(html, mimetype="application/json") #<-CHANGED
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
Aktualisieren Sie nun den vorhandenen Browsertab, um die Ergebnisse zu sehen. Das kann einige Sekunden dauern, da Sie jetzt tatsächlich eine LLM-Anfrage stellen. Sie sollten eine Webseite sehen, die in etwa so aussieht:

Ändern Sie die URL, um ein anderes Quizthema, eine andere Anzahl von Fragen und einen anderen Schwierigkeitsgrad anzufordern.
Damit ist Ihr Mikrodienst fertig – herzlichen Glückwunsch! Im nächsten Schritt erfahren Sie, wie Sie Ihren Dienst in der Cloud bereitstellen, damit jeder von überall darauf zugreifen kann.
8. Auf in die Cloud!

Nachdem Sie Ihren eigenen Quizgenerator erstellt haben, möchten Sie ihn sicher mit der Welt teilen. Es ist also an der Zeit, ihn in der Cloud bereitzustellen. Aber du möchtest mehr tun, als es nur zu teilen. Sie möchten sichergehen, dass:
- zuverlässig ausgeführt wird – Sie erhalten automatische Fehlertoleranz, falls ein Computer, auf dem Ihre App ausgeführt wird, abstürzt
- Automatische Skalierung: Ihre App kann auch bei sehr hohem Traffic mithalten und reduziert automatisch ihren Ressourcenverbrauch, wenn sie nicht verwendet wird.
- Sie zahlen nur für Ressourcen, die während der Reaktion auf Traffic verbraucht werden.
- ist über einen benutzerdefinierten Domainnamen zugänglich – Sie haben Zugriff auf eine Ein-Klick-Lösung, um Ihrem Dienst einen benutzerdefinierten Domainnamen zuzuweisen.
- bietet eine hervorragende Reaktionszeit. Kaltstarts sind relativ reaktionsschnell, aber Sie können das durch Angabe einer Mindestanzahl von Instanzen optimieren.
- Unterstützt End-to-End-Verschlüsselung mit standardmäßiger SSL/TLS-Websicherheit: Wenn Sie einen Dienst bereitstellen, erhalten Sie kostenlos und automatisch eine standardmäßige Webverschlüsselung und die entsprechenden erforderlichen Zertifikate.
Wenn Sie Ihre App in Google Cloud Run bereitstellen, erhalten Sie all das und noch mehr. Der grundlegende Baustein zum Bereitstellen Ihrer Anwendung in Cloud Run ist ein Container.
Mit Containern können wir einen modularen Rahmen erstellen, in dem eine Anwendung mit allen ihren Abhängigkeiten gebündelt ausgeführt werden kann. Da Container auf fast jedem virtuellen oder physischen Server verwendet werden können, können wir Ihre Anwendung überall bereitstellen, von lokal bis in der Cloud, und sogar von einem Dienstanbieter zu einem anderen verschieben.
Weitere Informationen zu Containern und ihrer Funktionsweise in Google Cloud Run finden Sie im Codelab Dev to Prod in Three Easy Steps with Cloud Run.
Anwendung in Cloud Run bereitstellen
Cloud Run ist ein regionaler Dienst. Die Infrastruktur, in der die Cloud Run-Dienste ausgeführt werden, befindet sich demnach in einer bestimmten Region. Aufgrund der Verwaltung durch Google sind die Anwendungen in allen Zonen innerhalb dieser Region redundant verfügbar. Der Einfachheit halber verwenden wir in diesem Lab die hartcodierte Region us-central1.
Wir verwenden einen sogenannten Buildpack, um Ihren Container automatisch zu generieren. Erstellen Sie im Cloud Editor eine neue Datei mit dem Namen Procfile und fügen Sie diese eine Textzeile ein:
web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
Dadurch wird dem Buildpack-System mitgeteilt, wie Ihre App im automatisch generierten Container ausgeführt werden soll. Führen Sie als Nächstes den folgenden Befehl im Cloud Shell-Terminal (im selben quiz-generator-Verzeichnis) aus:
gcloud run deploy quiz-generator \
--source . \
--region us-central1 \
--allow-unauthenticated
Damit wird dem Befehl gcloud mitgeteilt, dass Sie Buildpacks verwenden möchten, um Ihr Container-Image auf Grundlage der Quelldateien im aktuellen Verzeichnis zu erstellen. Das dot in --source . ist eine Kurzform für das aktuelle Verzeichnis. Da der Dienst sich implizit um das Container-Image kümmert, müssen Sie in diesem gcloud-Befehl kein Image angeben.
Warten Sie dann einige Sekunden, bis die Bereitstellung abgeschlossen ist. Bei Erfolg wird in der Ausgabe des gcloud-Befehls die URL des neuen Dienstes angezeigt:
Building using Buildpacks and deploying container to Cloud Run service [quiz-generator] in project [YOUR_PROJECT] region [YOUR_REGION] OK Building and deploying new service... Done. OK Creating Container Repository... OK Uploading sources... OK Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/0cf1383f-35db-412d -a973-557d5e2cd4a4?project=780573810218]. OK Creating Revision... OK Routing traffic... OK Setting IAM Policy... Done. Service [quiz-generator] revision [quiz-generator-00001-xnr] has been deployed and is serving 100 percent of traffic. Service URL: https://quiz-generator-co24gukjmq-uc.a.run.app
Sie können die Dienst-URL auch mit diesem Befehl abrufen:
gcloud run services describe quiz-generator \ --region us-central1 \ --format "value(status.url)"
Es sollte etwa Folgendes angezeigt werden:
https://quiz-generator-co24gukjmq-uc.a.run.app
Dieser Link ist eine dedizierte URL mit TLS-Sicherheit für Ihren Cloud Run-Dienst. Dieser Link ist dauerhaft (solange Sie Ihren Dienst nicht deaktivieren) und überall im Internet nutzbar. Dabei wird nicht der zuvor erwähnte Cloud Shell-Proxymechanismus verwendet, der von einer temporären virtuellen Maschine abhängig war.
Klicken Sie auf das hervorgehobene Service URL, um einen Browsertab mit Ihrer ausgeführten App zu öffnen. Prüfen Sie, ob das Ergebnis mit dem in Ihrer Entwicklungsumgebung übereinstimmt. Prüfen Sie auch, ob Sie das generierte Quiz anpassen können, indem Sie Parameter am Ende der URL angeben.
Glückwunsch! Ihre App wird jetzt in der Google Cloud ausgeführt. Ihre App ist öffentlich verfügbar, mit TLS-Verschlüsselung (HTTPS) und automatischer Skalierung für unglaubliche Traffic-Mengen.
9. Alle Teile zusammenfügen
In diesem letzten Schritt können Sie den Quizgenerator als Teil der Quizaic-App ausführen. Rufen Sie die Quizaic-URL auf, melden Sie sich in Ihrem Google-Konto an und rufen Sie den Tab Create Quiz auf. Wählen Sie den Generatortyp Custom aus, fügen Sie Ihre Cloud Run-URL in das URL-Feld ein, füllen Sie die anderen Pflichtfelder aus und senden Sie das Formular ab.

Nach einigen Augenblicken sollte ein neues Quiz mit einer KI-generierten Miniaturansicht angezeigt werden (siehe „Mein neues Quiz“ im Bild unten). Über die entsprechenden Schaltflächen können Sie das Quiz bearbeiten, spielen, klonen oder löschen. Dieses neue Quiz wurde mit dem Webdienst erstellt, den Sie gerade auf Grundlage Ihres Prompt-Templates bereitgestellt haben.

10. Bereinigen

Während für Cloud Run keine Kosten anfallen, wenn der Dienst nicht verwendet wird, wird Ihnen dennoch das Speichern des erstellten Container-Images möglicherweise in Rechnung gestellt.
Um Gebühren zu vermeiden, können Sie entweder Ihr GCP-Projekt löschen und so die Abrechnung für alle in diesem Projekt verwendeten Ressourcen beenden oder einfach mit dem folgenden Befehl Ihr Container-Image löschen:
gcloud config set artifacts/repository cloud-run-source-deploy gcloud config set artifacts/location us-central1 gcloud artifacts docker images list # Note image tag for resulting list gcloud artifacts docker images delete <IMAGE-TAG>
Verwenden Sie den folgenden Befehl, um Ihren Cloud Run-Dienst zu löschen:
gcloud run services delete quiz-generator --region us-central1 --quiet
11. Du hast es geschafft!

Herzlichen Glückwunsch! Sie haben erfolgreich einen LLM-Prompt erstellt und einen Cloud Run-Mikroservice mit diesem Prompt bereitgestellt. Jetzt können Sie in natürlicher Sprache programmieren und Ihre Kreationen mit der Welt teilen.
Zum Schluss möchte ich Ihnen noch eine wichtige Frage stellen:
Nachdem Ihre App in Ihrer Entwicklungsumgebung funktioniert hat, wie viele Codezeilen mussten Sie ändern, um sie in der Cloud bereitzustellen, mit allen Produktionsattributen, die von Cloud Run angeboten werden?
Die Antwort lautet natürlich null. :)
Weitere Codelabs
- Mit Cloud Run in drei einfachen Schritten von der Entwicklung zur Produktion
- App zur Textzusammenfassung mit Vertex AI und SvelteKit
- Chat-App mit der PaLM API in Cloud Run
- Cloud-Funktion, die die PaLM Text Bison-Modelle umschließt
- Daten für generative KI mit Spanner und der Vertex AI Imagen API
Referenzdokumente
12. Call-to-Action
Wenn Ihnen dieses Codelab gefallen hat und Sie wahrscheinlich mehr Zeit mit Google Cloud verbringen werden, sollten Sie noch heute Google Cloud Innovators beitreten.

Google Cloud Innovators ist kostenlos und umfasst:
- Live-Diskussionen, Fragerunden und Roadmap-Sessions mit den neuesten Informationen von Google-Mitarbeitern
- die neuesten Google Cloud-Nachrichten direkt in Ihrem Posteingang
- Digitales Kennzeichen und Videokonferenzhintergrund
- 500 Guthabenpunkte für Labs und Skills Boost
Hier können Sie sich registrieren.
