1. Wprowadzenie
W tym module utworzysz usługę internetową do generowania quizów i zintegrujesz ją z ciekawą, działającą aplikacją. Użyjesz innego języka programowania niż do tej pory: angielskiego.
Co możesz zrobić...
- Ułóż prompt, który wygeneruje quiz na podstawie zestawu kryteriów.
- Utworzysz prostą aplikację internetową i sprawdź, czy działa ona zgodnie z oczekiwaniami w Twoim środowisku programistycznym.
- Stopniowo dodawaj do aplikacji internetowej logikę, aby przekształcić ją w serwer interfejsu API, który generuje quizy zgodnie z zestawem parametrów wejściowych.
- Przekonasz się, jak łatwo można wdrożyć usługę generowania testów w chmurze za pomocą Google Cloud Run.
- Na koniec skonfigurujesz prawdziwą aplikację ( quizaic.com), aby korzystać z wdrożonej usługi generatora quizów. Dzięki temu będziesz mieć możliwość odtwarzania quizów na żywo na podstawie danych wyjściowych.
Czego się nauczysz…
- Jak utworzyć szablon promptu dla dużego modelu językowego (LLM).
- Jak utworzyć prostą aplikację serwera WWW w Pythonie.
- Dodawanie do aplikacji internetowej obsługi modelu LLM od Google.
- Jak wdrożyć aplikację w chmurze, aby każdy mógł wypróbować Twoje nowe dzieło.
- Jak zintegrować generator quizów z większą aplikacją.
Co będzie Ci potrzebne…
- przeglądarka Chrome;
- konto Google,
- Projekt Cloud z włączonymi płatnościami
Ten moduł jest przeznaczony dla programistów na wszystkich poziomach zaawansowania, w tym początkujących. Chociaż będziesz używać języka Python, nie musisz znać się na programowaniu w tym języku, aby zrozumieć, co się dzieje, ponieważ wyjaśnimy cały kod.
2. Konfiguracja
W tej sekcji znajdziesz wszystko, co musisz zrobić, aby rozpocząć pracę z tym laboratorium.
Konfiguracja środowiska w samodzielnym tempie
- Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.
- Nazwa projektu to wyświetlana nazwa uczestników projektu. Jest to ciąg znaków, którego nie używają interfejsy API Google. Zawsze możesz ją zaktualizować.
- Identyfikator projektu jest niepowtarzalny w ramach wszystkich projektów Google Cloud i nie można go zmienić (po ustawieniu). Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie ma znaczenia, jaki to ciąg. W większości laboratoriów z kodem trzeba podać identyfikator projektu (zwykle oznaczony jako
PROJECT_ID
). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować inny losowy. Możesz też spróbować użyć własnego adresu e-mail, aby sprawdzić, czy jest on dostępny. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania projektu. - Informacyjnie: istnieje jeszcze 3 wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
- Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Przejście przez ten samouczek nie będzie wiązać się z wielkimi kosztami, jeśli w ogóle będą jakieś. Aby wyłączyć zasoby i uniknąć obciążenia opłatami po zakończeniu samouczka, możesz usunąć utworzone zasoby lub usunąć projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.
Uruchom Cloud Shell
W tym module będziesz pracować w sesji Cloud Shell, która jest tłumaczem poleceń hostowanym przez maszynę wirtualną działającą w chmurze Google. Możesz też uruchomić tę sekcję lokalnie na swoim komputerze, ale korzystanie z Cloud Shell daje wszystkim dostęp do powtarzalnego środowiska w spójnym środowisku. Po zakończeniu ćwiczeń możesz ponownie wykonać tę sekcję na swoim komputerze.
Aktywowanie Cloud Shell
- W konsoli Cloud kliknij Aktywuj Cloud Shell
.
Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z wyjaśnieniem, co to jest. Jeśli został wyświetlony ekran pośredni, kliknij Dalej.
Uproszczenie i połączenie z Cloud Shell powinno zająć tylko kilka chwil.
Ta maszyna wirtualna zawiera wszystkie niezbędne narzędzia programistyczne. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie poprawia wydajność sieci i uwierzytelnianie. Większość, jeśli nie wszystkie, zadań w tym ćwiczeniu można wykonać w przeglądarce.
Po połączeniu z Cloud Shell powinieneś zobaczyć, że jesteś uwierzytelniony i że projekt jest ustawiony na identyfikator Twojego projektu.
- Aby potwierdzić uwierzytelnianie, uruchom w Cloud Shell to polecenie:
gcloud auth list
Wynik polecenia
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Aby sprawdzić, czy polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project
Wynik polecenia
[core] project = <PROJECT_ID>
Jeśli nie, możesz ustawić je za pomocą tego polecenia:
gcloud config set project <PROJECT_ID>
Wynik polecenia
Updated property [core/project].
Włączanie niektórych interfejsów API
W kolejnych krokach zobaczysz, gdzie są potrzebne te usługi (i dlaczego), ale na razie uruchom to polecenie, aby przyznać swojemu projektowi dostęp do Cloud Build, Artifact Registry, Vertex AI i Cloud Run:
gcloud services enable cloudbuild.googleapis.com \ artifactregistry.googleapis.com \ aiplatform.googleapis.com \ run.googleapis.com
Powinien wyświetlić się komunikat o powodzeniu, podobny do tego:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
3. Prompty – programowanie w języku naturalnym
Na początek dowiesz się, jak przygotować prompt dla dużego modelu językowego. Kliknij kolejno: Google Cloud Console > Vertex AI > Vertex AI Studio (język). Powinna się wyświetlić strona podobna do tej:
W sekcji Generate Text
kliknij przycisk Text Prompt
. W następnym oknie wpisz prompt, który Twoim zdaniem może być skuteczny w generowaniu quizu z trivią zgodnie z tymi wymaganiami:
- Temat: Historia świata
- Liczba pytań: 5
- Poziom trudności: średni
- Język: angielski
Aby zobaczyć wynik, kliknij przycisk Prześlij.
Jak widać na poniższym zrzucie ekranu, w panelu po prawej stronie możesz wybrać model, którego chcesz użyć, i dostosować niektóre ustawienia:
Dostępne są te ustawienia:
- Region to miejsce, w którym powinno zostać wykonane żądanie generowania.
- Model wybiera duży model językowy, którego chcesz użyć. W tym przypadku użyj wersji „gemini-1.0-pro-001”.
- Temperatura decyduje o stopniu losowości wyboru tokenów. Niższe temperatury są przydatne w przypadku promptów, na które oczekuje się prawdziwej lub poprawnej odpowiedzi, a wyższe mogą prowadzić do bardziej różnorodnych lub nieoczekiwanych wyników.
- Limit tokenów określa maksymalną ilość tekstu generowanego w odpowiedzi na jeden prompt. Token ma około 4 znaków. Wartością domyślną jest 1024.
- Parametr Top-K zmienia sposób, w jaki model wybiera tokeny w celu wygenerowania odpowiedzi. Top-K o wartości 1 oznacza, że wybierany jest najbardziej prawdopodobny token spośród wszystkich tokenów w słowniku modelu (jest to też nazywane dekodowaniem zachłannym), natomiast Top-K o wartości 3 oznacza, że następny token jest wybierany spośród 3 najbardziej prawdopodobnych (z użyciem temperatury). Wartość domyślna parametru górnego K to 40.
- Parametr Top-P zmienia sposób, w jaki model wybiera tokeny w celu wygenerowania odpowiedzi. Tokeny są wybierane od najbardziej do najmniej prawdopodobnego do momentu, aż suma ich prawdopodobieństw będzie równa wartości Top-P.
- Maks. odpowiedzi to maksymalna liczba odpowiedzi modelu na 1 prompt.
- Sekwencja zatrzymania to seria znaków (łącznie ze spacjami), która zatrzymuje generowanie odpowiedzi, jeśli model ją napotka.
- Przesyłanie odpowiedzi na bieżąco określa, czy odpowiedzi mają być drukowane w miarę ich generowania, czy też mają być zapisywane i wyświetlane po zakończeniu.
- Próg filtra zabezpieczeń dostosowuje prawdopodobieństwo wyświetlania odpowiedzi, które mogą być szkodliwe.
Gdy otrzymasz prompt, który wydaje się generować rozsądny quiz zgodny z wymaganiami wspomnianymi wyżej, możemy przeanalizować go za pomocą niestandardowego kodu. Czy nie byłoby lepiej, gdy LLM wygeneruje test w uporządkowanym formacie, który będzie można wczytać bezpośrednio do naszego programu. Program, którego użyjemy w tym laboratorium do wywołania generatora, wymaga, aby quizy były wyrażone w formacie JSON, który jest popularnym formatem wielojęzycznym do przedstawiania uporządkowanych danych.
Testy w tym module są wyrażone jako tablica obiektów, z których każdy zawiera pytanie, tablicę możliwych odpowiedzi na to pytanie i właściwą odpowiedź. Oto kodowanie JSON dla testów w tym module:
[ { "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" }, ... ]
Sprawdź, czy możesz zmodyfikować prompt, aby wyświetlać quiz w wymaganym formacie JSON.
- Określ dokładny format, którego szukasz (np. pogrubione zdanie powyżej).
- Dodaj do promptu przykładowy format JSON.
Gdy prompt wygeneruje quizy zgodnie z określonymi wymaganiami, w prawym górnym rogu strony kliknij przycisk GET CODE
, aby wyświetlić kod Pythona, który można użyć do przesłania prompta do modelu Vertex AI LLM za pomocą kodu. Jeśli chcesz używać języka programowania innego niż Python, wejdź na https://cloud.google.com/vertex-ai/docs/samples?text=generative.
4. Tworzenie prostego serwera WWW
Teraz, gdy masz działający prompt, chcemy zintegrować go z większą aplikacją. Oczywiście możemy umieścić Twój prompt w kodzie źródłowym większej aplikacji, ale chcemy, aby Twój generator działał jako mikrousługa, która zapewnia usługę generowania quizów dla innych aplikacji. Aby to zrobić, musimy utworzyć prosty serwer WWW i udostępnić go publicznie. Wykonamy to w kolejnych krokach.
Zacznij od kliknięcia przycisku Open Editor
u góry panelu Cloud Shell. Wygląda on następująco:
Znajdziesz się w środowisku IDE podobnym do Visual Studio Code, w którym możesz tworzyć projekty, edytować kod źródłowy, uruchamiać programy itp.
Jeśli obraz na ekranie jest zbyt wąski, możesz rozszerzyć lub zmniejszyć linię oddzielającą konsolę od okna edycji/terminalu, przeciągając poziomy pasek między tymi dwoma obszarami, wyróżniony tutaj:
Możesz przełączać się między edytorem a terminalem, klikając odpowiednio przyciski Open Editor
i Open Terminal
. Spróbuj teraz przełączać się między tymi dwoma środowiskami.
Następnie utwórz folder, w którym będą zapisywane Twoje zadania z tego modułu. W tym celu kliknij przycisk dodawania folderu , wpisz
quiz-generator
i naciśnij Enter. W tym folderze będą przechowywane wszystkie pliki, które utworzysz w tym module, oraz wszystkie czynności, które wykonujesz w Cloud Shell.
Teraz utwórz plik requirements.txt
. To mówi Pythonowi, od których bibliotek zależy Twoja aplikacja. W przypadku tej prostej aplikacji internetowej użyjesz popularnego modułu Pythona do tworzenia serwerów WWW o nazwie Flask,
, biblioteki klienta google-cloud-aiplatform
oraz platformy serwera WWW o nazwie gunicorn
. W panelu nawigacji plików kliknij prawym przyciskiem folder quiz-generator
i wybierz element menu New file
:
Gdy pojawi się prośba o podanie nazwy nowego pliku, wpisz requirements.txt
i naciśnij klawisz Enter. Upewnij się, że nowy plik znajduje się w folderze projektu quiz-generator
.
Wklej te wiersze w nowym pliku, aby określić, że Twoja aplikacja zależy od pakietu Pythona flask, serwera WWW gunicorn i biblioteki klienta google-cloud-aiplatform wraz z odpowiednimi wersjami.
flask==3.0.0 gunicorn==21.2.0 google-cloud-aiplatform==1.47.0
Nie musisz zapisywać tego pliku bezpośrednio, ponieważ edytor Google Cloud zapisze zmiany automatycznie.
Za pomocą tej samej metody utwórz nowy plik o nazwie main.py
. To będzie główny (i jedyny) plik źródłowy aplikacji w Pythonie. Pamiętaj, że nowy plik musi trafiać do folderu quiz-generator
.
Wstaw do tego pliku ten kod:
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)
Wróć do terminala i za pomocą tego polecenia przejdź do folderu projektu:
cd quiz-generator
Aby zainstalować zależności projektu, uruchom to polecenie:
pip3 install -r requirements.txt
Po zainstalowaniu zależności powinny pojawić się dane wyjściowe, które kończą się w ten sposób:
Successfully installed flask-3.0.0
Uruchom aplikację, wpisując w terminalu to polecenie:
flask --app main.py --debug run --port 8080
W tym momencie aplikacja działa na maszynie wirtualnej dedykowanej dla sesji Cloud Shell. Cloud Shell zawiera mechanizm serwera proxy, który umożliwia korzystanie z serwerów WWW (takich jak właśnie uruchomione) w Twojej maszynie wirtualnej z dowolnego miejsca w globalnym internecie.
Kliknij kolejno przycisk web preview
i element menu Preview on Port 8080
:
Otworzy się karta przeglądarki z uruchomioną aplikacją, która powinna wyglądać mniej więcej tak:
5. Dodaj metodę generowania z analizą parametrów
Chcemy teraz dodać obsługę nowej metody o nazwie generate
. Aby to zrobić, dodaj instrukcję importu, która umożliwi manipulowanie żądaniem HTTP, i zmodyfikuj główną trasę, aby przeanalizować to żądanie i wydrukować parametry w ten sposób:
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)
Teraz odśwież kartę przeglądarki, aby zobaczyć wyniki. Tym razem powinien wyświetlić się „Generator quizów” wraz z parametrem zapytania automatycznie dodanym do adresu URL (authuser
). Spróbuj dodać 2 dodatkowe parametry, dołączając ciąg „¶m1=val1¶m2=val2” na końcu adresu URL w pasku adresu przeglądarki. Po ponownym załadowaniu strony powinieneś zobaczyć coś takiego:
Teraz, gdy już wiesz, jak wysyłać i analizować parametry zapytania w adresie URL, dodamy obsługę określonych parametrów, które chcemy wysyłać do generatora quizów. Są to:
topic
– wybrany temat testunum_q
– liczba wybranych pytań.diff
– wybrany poziom trudności (łatwy, średni, trudny).lang
– wybrany język testu,
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)
Teraz załaduj ponownie istniejącą kartę przeglądarki, aby zobaczyć wyniki. Powinna się wyświetlić strona podobna do tej:
Spróbuj zmienić adres URL, aby ustawić wartości różnych parametrów. Na przykład spróbuj użyć sufiksu „?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French
” na końcu adresu URL w pasku adresu:
6. Dodawanie i formatowanie promptu
Następnie dodamy obsługę konkretnych parametrów, które chcemy wysłać do naszego generatora testów:
topic
– temat quizunum_q
– liczba wybranych pytań.diff
– wybrany poziom trudności (łatwy, średni, trudny).lang
– wybrany język testu.
Skopiuj prompt utworzony za pomocą Vertex Generative AI Studio w poprzednim kroku, ale zmień zapisane na stałe wartości tematu, liczby pytań i poziomu trudności na te ciągi znaków:
- {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)
Teraz odśwież kartę przeglądarki, aby zobaczyć wyniki. Powinna się wyświetlić strona podobna do tej:
Spróbuj zmodyfikować URL, aby zmodyfikować te 4 parametry.
7. Dodawanie biblioteki klienta Vertex AI
Teraz możesz skorzystać z biblioteki klienta Vertex AI w języku Python do wygenerowania testu. Dzięki temu automatyzujesz interaktywne prompty z kroku 3 i pozwolisz usłudze generatora na dostęp do funkcji LLM Google. Zaktualizuj plik main.py
w ten sposób:
Pamiętaj, aby zastąpić ciąg „YOUR_PROJECT” rzeczywistym identyfikatorem projektu.
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)
Teraz odśwież kartę przeglądarki, aby zobaczyć wyniki. Pamiętaj, że może to potrwać kilka sekund, ponieważ teraz wysyłasz żądanie LLM. Powinna się wyświetlić strona podobna do tej:
Spróbuj zmienić adres URL, aby wybrać inny temat, liczbę pytań i poziom trudności.
Gratulacje! Twoja mikrousługa jest gotowa. W następnym kroku dowiesz się, jak wdrożyć usługę w chmurze, aby każdy mógł uzyskać do niej dostęp z dowolnego miejsca.
8. Do chmury!
Teraz, gdy masz już swój generator quizów, możesz podzielić się nim z resztą świata. Właśnie nadszedł czas na wdrożenie go w chmurze. Ale chcesz zrobić coś więcej niż tylko udostępnić. Upewnij się, że:
- działa niezawodnie – automatyczne odporność na awarie w przypadku awarii komputera, na którym działa aplikacja;
- skaluje się automatycznie – aplikacja będzie nadążać za dużym ruchem i automatycznie zmniejszać swój ślad węglowy, gdy nie będzie używana;
- minimalizuje koszty, ponieważ nie pobiera opłat za zasoby, których nie używasz – płacisz tylko za zasoby wykorzystane podczas obsługi ruchu.
- jest dostępna za pomocą niestandardowej nazwy domeny – masz dostęp do rozwiązania, które pozwala jednym kliknięciem przypisać do Twojej usługi niestandardową nazwę domeny
- zapewnia doskonały czas reakcji – uruchomienia „na zimno” reagują na działania użytkownika, ale można go dostosować, określając minimalną konfigurację instancji.
- obsługuje pełne szyfrowanie z wykorzystaniem standardowych zabezpieczeń internetowych SSL/TLS – po wdrożeniu usługi uzyskujesz standardowe szyfrowanie sieciowe i odpowiadające im certyfikaty – bezpłatnie i automatycznie.
Wdrażając aplikację w Google Cloud Run, zyskujesz wszystkie te możliwości i wiele więcej. Podstawowym elementem umożliwiającym udostępnianie aplikacji w Cloud Run jest kontener.
Kontenery umożliwiają tworzenie modułowych pudełek, w których można uruchamiać aplikację wraz ze wszystkimi zależnościami. Ponieważ kontenery mogą być używane na prawie każdym serwerze wirtualnym lub rzeczywistym, możemy w ten sposób wdrożyć Twoją aplikację w dowolnym miejscu, od środowiska lokalnego do chmury, a nawet przenieść ją z jednego dostawcy usług na innego.
Aby dowiedzieć się więcej o kontenerach i sposobie ich działania w Google Cloud Run, zapoznaj się z ćwiczeniem z programowania i produkcją w 3 prostych krokach w Cloud Run (w języku angielskim).
Wdrażanie aplikacji w Cloud Run
Cloud Run to usługa regionalna, co oznacza, że infrastruktura, na której działają Twoje usługi Cloud Run, znajduje się w określonym regionie i jest zarządzana przez Google, aby była dostępna w wielu strefach w tym regionie. W tym laboratorium dla uproszczenia użyjemy zakodowanego na stałe regionu us-central1
.
Użyjemy elementu o nazwie „Buildpack”, aby automatycznie wygenerować kontener. Utwórz w edytorze Cloud nowy plik o nazwie Procfile
i wstaw ten jeden wiersz tekstu:
web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
To informuje system pakietu kompilacyjnego, jak uruchomić aplikację w kontenerze wygenerowanym automatycznie. Następnie uruchom w terminalu Cloud Shell to polecenie (z tego samego katalogu quiz-generator
) :
gcloud run deploy quiz-generator \ --source . \ --region us-central1 \ --allow-unauthenticated
Informuje to polecenie gcloud
, że ma ono używać pakietów kompilacji do utworzenia obrazu kontenera na podstawie plików źródłowych, które znajdzie w bieżącym katalogu (dot
w pliku --source .
to skrócony skrót dla bieżącego katalogu). Usługa zajmuje się obrazem kontenera w sposób domyślny, więc nie musisz podawać obrazu w poleceniu gcloud
.
Poczekaj chwilę na zakończenie wdrażania. Gdy operacja zostanie wykonana, w wierszu poleceń wyświetli się URL nowej usługi:gcloud
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
Adres URL usługi możesz też pobrać za pomocą tego polecenia:
gcloud run services describe quiz-generator \ --region us-central1 \ --format "value(status.url)"
Powinien pojawić się ekran podobny do tego:
https://quiz-generator-co24gukjmq-uc.a.run.app
Ten link to dedykowany adres URL z zabezpieczeniami TLS dla Twojej usługi Cloud Run. Ten link jest stały (dopóki nie wyłączysz usługi) i można go używać w dowolnym miejscu w internecie. Nie używa wspomnianego wcześniej mechanizmu proxy Cloud Shell, który polegał na tymczasowej maszynie wirtualnej.
Kliknij wyróżnione Service URL
, aby otworzyć kartę przeglądarki z uruchomioną aplikacją. Sprawdź, czy wynik jest taki sam jak w środowisku programistycznym. Sprawdź też, czy możesz dostosować wygenerowany test, podając parametry na końcu adresu URL.
Gratulacje! Twoja aplikacja działa teraz w Google Cloud. Twoja aplikacja jest dostępna publicznie, z szyfrowaniem TLS (HTTPS) i automatycznym skalowaniem do poziomu natężenia ruchu, o którym nawet nie musisz pamiętać.
9. Składanie elementów w całość
W tym ostatnim kroku uruchom generatora quizów w aplikacji quizaic. Otwórz URL quizaic, zaloguj się na swoje konto Google i otwórz kartę Create Quiz
. Wybierz typ generatora Custom
, wklej adres URL Cloud Run w polu adresu URL, wypełnij pozostałe wymagane pola i prześlij formularz.
Po kilku chwilach powinien pojawić się nowy quiz (na obrazku poniżej zaznaczony jako „Mój nowy quiz”) z miniaturą wygenerowaną przez AI. Możesz ją edytować, odtwarzać, klonować lub usuwać za pomocą odpowiednich przycisków. Ten nowy test został utworzony za pomocą właśnie wdrożonej usługi internetowej na podstawie Twojego prompta w ramach szablonu.
10. Czyszczenie
Cloud Run nie nalicza opłat, gdy usługa nie jest używana, ale może zostać pobrana należność za przechowywanie utworzonego obrazu kontenera.
Możesz usunąć projekt GCP, co spowoduje zaprzestanie naliczania opłat za wszelkie zasoby wykorzystywane w ramach tego projektu, albo usunąć tylko obraz kontenera przy użyciu tego polecenia:
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>
Aby usunąć usługę Cloud Run, użyj tego polecenia:
gcloud run services delete quiz-generator --region us-central1 --quiet
11. Udało się!
Gratulujemy – udało Ci się utworzyć prompt LLM i wdrożyć przy jego użyciu mikroserwis Cloud Run. Teraz możesz programować w języku naturalnym i udostępniać swoje projekty innym.
Na koniec mam do Ciebie ważne pytanie:
Po uruchomieniu aplikacji w środowisku deweloperskim ile linii kodu musiałeś zmodyfikować, aby móc ją wdrożyć w chmurze z wszystkimi atrybutami oferowanymi przez Cloud Run?
Odpowiedź brzmi oczywiście 0. :)
Inne ćwiczenia z programowania, które warto wypróbować...
- Przejście z fazy rozwoju do produkcji w 3 prostych krokach za pomocą Cloud Run
- Aplikacja do streszczania tekstu z Vertex AI i Svelte Kit
- Aplikacja do czatu z PaLM API w Cloud Run
- funkcja w Cloud Functions, która otacza modele PaLM Text Bison
- Dane do generatywnej AI za pomocą interfejsów Spanner i Vertex AI Imagen API
Dokumenty referencyjne…
12. Wezwanie do działania
Jeśli podoba Ci się to szkolenie z programowania, ale zapewne chcesz poświęcić więcej czasu na praktyczne doświadczenie w Google Cloud, dołącz do Google Cloud Innovators już dziś.
Google Cloud Innovators jest bezpłatny i obejmuje:
- Dyskusje na żywo, sesje AMA i sesje dotyczące harmonogramu, dzięki którym dowiesz się najnowszych informacji bezpośrednio od pracowników Google.
- najnowsze informacje o Google Cloud prosto w Twojej skrzynce odbiorczej.
- Cyfrowe logo i tło do rozmów wideo
- 500 punktów na moduły i naukę na platformie Skills Boost
Kliknij tutaj, aby się zarejestrować.