Tworzenie generatora quizów za pomocą generatywnej AI i Cloud Run

1. Wprowadzenie

W tym module utworzysz usługę internetową do generowania quizów i połączysz ją w ciekawą, działającą aplikację. Będziesz używać innego języka programowania niż używany wcześniej: English!

Co możesz zrobić...

  • Ułóż prompt, który wygeneruje quiz na podstawie zestawu kryteriów.
  • Utworzysz prostą aplikację internetową i sprawdzisz, czy działa ona zgodnie z oczekiwaniami w Twoim środowisku programistycznym.
  • Stopniowo dodajesz do swojej aplikacji internetowej funkcje logiczne, które przekształcają ją w serwer API, który generuje testy na podstawie zestawu 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 testów. Będziesz mieć możliwość przeprowadzania testów na żywo na podstawie wyników.

Czego się nauczysz...

  • Jak utworzyć szablonowy prompt 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ł ją wypróbować.
  • 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ć, o co chodzi, ponieważ objaśnimy cały kod, który widzisz.

2. Konfiguracja

a08aa5878e36b60c.png

W tej sekcji znajdziesz informacje o wszystkim, co jest potrzebne, aby rozpocząć korzystanie z tego modułu.

Samodzielne konfigurowanie środowiska

  1. 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ć.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz podać swój identyfikator projektu (zwykle identyfikowany jako PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania projektu.
  • Jest jeszcze trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nic nie kosztuje. Aby wyłączyć zasoby w celu uniknięcia naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartoś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 równie łatwo uruchomić tę sekcję lokalnie na swoim komputerze, ale użycie Cloud Shell zapewni wszystkim dostęp do powtarzalnego środowiska w spójnym środowisku. Po ukończeniu modułu możesz powtórzyć tę sekcję na swoim komputerze.

4a95152439f0159b.png

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell 853e55310c205094.png.

3c1dabeca90e44e5.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tej usługi. Jeśli wyświetlił się ekran pośredni, kliknij Dalej.

9c92662c6a846a5c.png

Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

9f0e51b578fecce5.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość zadań w ramach tego ćwiczenia z programowania można wykonać w przeglądarce.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe polecenia

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

Włącz niektóre interfejsy API

W późniejszych krokach zobaczysz, gdzie te usługi są potrzebne (i dlaczego). Na razie uruchom to polecenie, aby przyznać 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

92f630373224ead8.png

Zaczniemy od opracowania promptu na potrzeby dużego modelu językowego (LLM). Otwórz konsolę Google Cloud > Vertex AI > Vertex AI Studio (język). Powinna wyświetlić się strona podobna do tej:

bfe5706041ae6454.png

W sekcji Generate Text kliknij przycisk Text Prompt. W kolejnym oknie wpisz prompt, który Twoim zdaniem może być przydatny do wygenerowania quizu, spełniając te wymagania:

  • Temat: Historia świata
  • Liczba pytań: 5
  • Poziom trudności: średni
  • Język: angielski

Kliknij przycisk Prześlij, aby wyświetlić dane wyjściowe.

Jak pokazano na poniższym zrzucie ekranu, prawy panel pozwala wybrać model, którego chcesz użyć, i dostosować niektóre ustawienia:

8aa89a1970ea9335.png

Dostępne są te ustawienia:

  • Region to miejsce, w którym powinno być uruchamiane żądanie wygenerowania.
  • Model wybiera duży model językowy, którego chcesz użyć. W przypadku tego ćwiczenia z programowania stosuj „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 górnego K zmienia sposób, w jaki model wybiera tokeny w celu wygenerowania odpowiedzi. Górne K o wartości 1 oznacza, że wybrany token jest najbardziej prawdopodobny wśród wszystkich tokenów w słowniku modelu (jest to też nazywane dekodowaniem zachłannym), natomiast górne 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 górnego P.
  • Maksymalna liczba odpowiedzi to maksymalna liczba odpowiedzi modelu na jeden prompt.
  • Sekwencja zatrzymania to seria znaków (łącznie ze spacjami), która zatrzymuje generowanie odpowiedzi, jeśli model ją napotka.
  • Strumieniowanie odpowiedzi określa, czy odpowiedzi mają być drukowane podczas generowania czy zapisywania i wyświetlane po ich wygenerowaniu.
  • Próg filtra bezpieczeństwa dostosowuje prawdopodobieństwo napotkania odpowiedzi, które mogą być szkodliwe.

Gdy otrzymasz prompt, który wydaje się generować rozsądny quiz zgodny z wymaganiami wspomnianymi powyż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 dalszej części tego modułu, aby nazwać Twój generator, oczekuje, że quizy będą zapisane w formacie JSON, który jest popularnym formatem używanym do przedstawiania uporządkowanych danych w różnych językach.

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.

  1. Określ dokładny format, którego szukasz (np. zdanie pisane kursywą powyżej).
  2. Umieść w prompcie przykład żądanego formatu JSON.

Gdy prompt będzie generować testy zgodnie z odpowiednią specyfikacją, kliknij przycisk GET CODE w prawym górnym rogu strony, aby wyświetlić kod Pythona, za pomocą którego można automatycznie przesłać prompt do modelu LLM Vertex AI. Jeśli chcesz używać języka programowania innego niż Python, zajrzyj na stronę https://cloud.google.com/vertex-ai/docs/samples?text=generative.

4. Tworzenie prostego serwera WWW

c73008bb8a72b57b.png

Masz już działający prompt, więc 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 generator działał jak mikroserwis, który zapewnia usługę generowania testów w przypadku innych aplikacji. Aby to było możliwe, musimy utworzyć prosty serwer WWW i udostępnić go publicznie. Zrobimy to w następnych krokach.

Zacznij od kliknięcia przycisku Open Editor u góry panelu Cloud Shell. Wygląda on następująco:

e2a06b5304079efc.png

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:

8dea35450851af53.png

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 5f4e64909bc15e30.png, 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. Dzięki temu Python będzie wiedzieć, od których bibliotek jest wykorzystywana Twoja aplikacja. W tej prostej aplikacji internetowej wykorzystasz popularny moduł Pythona do tworzenia serwerów WWW o nazwie Flask, (biblioteka klienta google-cloud-aiplatform) i platformę serwera WWW o nazwie gunicorn. W panelu nawigacji po plikach kliknij prawym przyciskiem folder quiz-generator i wybierz pozycję menu New file, na przykład:

613eb3de4b9b750a.png

Gdy pojawi się prośba o podanie nazwy nowego pliku, wpisz requirements.txt i naciśnij klawisz Enter. Nowy plik powinien trafić do folderu projektu quiz-generator.

Wklej te wiersze w nowym pliku, aby określić, że aplikacja jest zależna od pakietu flask Pythona, serwera WWW gunicorn i biblioteki klienta google-cloud-aiplatform, wraz z powiązanymi wersjami każdego z nich.

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.

W ten sam sposób utwórz kolejny plik o nazwie main.py. Będzie to główny (i jedyny) plik źródłowy w Pythonie aplikacji. 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 przejdź do folderu projektu za pomocą tego polecenia:

cd quiz-generator

Uruchom to polecenie, aby zainstalować zależności w projekcie:

pip3 install -r requirements.txt

Po zainstalowaniu zależności powinny wyświetlić się dane wyjściowe podobne do tych:

Successfully installed flask-3.0.0

Teraz uruchom aplikację, uruchamiają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 przycisk web preview, a następnie element menu Preview on Port 8080 podobny do tego:

7f938c0bc1b4154c.png

Otworzy się karta przeglądarki z uruchomioną aplikacją, która powinna wyglądać mniej więcej tak:

aaaf366f9bf74a28.png

5. Dodaj metodę generowania z analizą parametrów

Teraz chcemy dodać obsługę pola nowej metody o nazwie generate. Aby to zrobić, dodaj instrukcję importu, która będzie manipulować żądaniem HTTP i zmodyfikować główną trasę w celu przeanalizowania tego żądania i parametrów drukowania 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 załaduj ponownie istniejącą kartę przeglądarki, aby zobaczyć wyniki. Tym razem powinien pojawić się moduł „Generator quizów” wraz z parametrem zapytania, który został automatycznie dodany do adresu URL (authuser). Spróbuj dodać dwa dodatkowe parametry, dołączając ciąg „`&param1=val1&param2=val2`" na końcu adresu URL na pasku adresu przeglądarki, załaduj ponownie stronę. Strona powinna wyglądać tak:

6e223ca358e4e009.png

Wiesz już, jak wysyłać i analizować parametry zapytania w adresie URL. Teraz dodamy obsługę konkretnych parametrów, które będziemy wysyłać do naszego generatora testów:

  • topic – wybrany temat testu
  • num_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 pojawić się strona podobna do tej:

15eed60f6a805212.png

Spróbuj zmienić adres URL, aby ustawić wartości dla różnych parametrów. Możesz na przykład użyć sufiksu „?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French” na końcu adresu URL na pasku adresu:

f629dba5fa207cef.png

6. Dodawanie i formatowanie promptu

Następnie dodamy obsługę konkretnych parametrów, które chcemy wysyłać do naszego generatora testów:

  • topic – wybrany temat testu
  • num_q – liczba wybranych pytań.
  • diff – wybrany poziom trudności (łatwy, średni, trudny).
  • lang – wybrany język testu.

Skopiuj prompt utworzony w Vertex Generative AI Studio w poprzednim kroku, ale zmień zakodowane na stałe wartości tematu, liczby pytań i poziomu trudności za pomocą tych ciągó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 załaduj ponownie istniejącą kartę przeglądarki, aby zobaczyć wyniki. Powinna pojawić się strona podobna do tej:

3c2b9dfcfba86b7a.png

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. Spowoduje to automatyzację interaktywnego promptu wykonanego w kroku 3 i udzielenie usłudze generatora dostępu programowego do funkcji LLM od Google. Zaktualizuj plik main.py w ten sposób:

Pamiętaj, aby zastąpić „YOUR_PROJECT” parametr „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 załaduj ponownie istniejącą kartę przeglądarki, aby zobaczyć wyniki. Pamiętaj, że może to potrwać kilka sekund, ponieważ teraz jest to żądanie LLM. Powinna pojawić się strona podobna do tej:

f43d3ba5102857b8.png

Zmień adres URL, aby uwzględnić inny temat testu, zmienić liczbę pytań lub poziom trudności.

I na tym kończymy działanie mikroserwisu – gratulacje! 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!

67c99bf45a7b7805.png

Gdy masz już własny generator quizów, możesz się podzielić tym niesamowitym doświadczeniem z resztą świata, więc nadszedł czas, aby wdrożyć go w chmurze. Chcesz jednak zrobić coś więcej, niż tylko się dzielić. Upewnij się, że:

  • działa niezawodnie – automatyczne odporność na awarie w przypadku awarii komputera, na którym działa aplikacja;
  • skaluje się automatycznie – aplikacja dotrzymuje kroku dużym natężeniem ruchu i automatycznie zmniejsza swój ślad, gdy nie jest używany
  • minimalizuje koszty, nie obciążając Cię za zasoby, z których nie korzystasz; płacisz tylko za zasoby zużyte podczas reagowania na ruch
  • 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, uzyskasz wszystkie powyższe możliwości. Podstawowym elementem składowym służącym do udostępniania aplikacji w Cloud Run jest kontener.

Kontenery dają nam możliwość utworzenia modułu modułowego, w którym uruchamiamy aplikację ze wszystkimi jej zależnościami. Kontenery mogą być używane na niemal każdym serwerze wirtualnym lub rzeczywistym, dzięki czemu możesz wdrożyć aplikację w dowolnym miejscu – od lokalnego serwera do chmury, a nawet przenosić ją między dostawcą usług.

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 jest usługą regionalną, co oznacza, że infrastruktura, w której działają usługi Cloud Run, znajduje się w określonym regionie i jest zarządzana przez Google, aby zapewnić nadmiarowość we wszystkich strefach w tym regionie. Dla uproszczenia w tym module 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

Informuje ona system pakietu kompilacji, jak uruchomić aplikację w automatycznie wygenerowanym kontenerze. 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 języku --source . to skrót dla bieżącego katalogu). Usługa domyślnie zajmuje się obrazem kontenera, więc nie musisz określać obrazu w tym poleceniu gcloud.

Poczekaj chwilę na zakończenie wdrażania. Jeśli operacja się uda, polecenie gcloud wyświetli adres URL nowej usługi:

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)"

Powinno wyświetlić się coś takiego:

https://quiz-generator-co24gukjmq-uc.a.run.app

Ten link to specjalny adres URL z zabezpieczeniami TLS, dla Twojej usługi Cloud Run. Link jest trwały (o ile nie wyłączysz usługi) i można go używać w dowolnym miejscu w internecie. Nie wykorzystuje wspomnianego wcześniej mechanizmu serwera proxy Cloud Shell, który bazował na przejściowej maszynie wirtualnej.

Kliknij podświetlony 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ść

9927db1725bcd5d6.png

W tym ostatnim kroku możemy uruchomić generator quizów w ramach aplikacji quizu. Wejdź na quizaic URL, 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.

328ee05579ea05f9.png

Za chwilę powinien pojawić się nowy test (zobacz „Mój nowy quiz” na grafice poniżej) z obrazem miniatury wygenerowanym przez AI. Możesz go edytować, odtworzyć, sklonować lub usunąć za pomocą odpowiednich przycisków. Ten nowy test został utworzony przy użyciu właśnie wdrożonej przez Ciebie usługi internetowej na podstawie szablonu promptu.

1719169140978b63.png

10. Czyszczenie

c1592d590c563428.png

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 wszystkie zasoby wykorzystywane w ramach tego projektu, albo po prostu usunąć obraz kontenera za pomocą 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ę!

910162be58c0f6d6.png

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 dzieło całemu światu.

Mam dla Ciebie jedno ważne pytanie:

Ile wierszy kodu trzeba było zmodyfikować, aby wdrożyć aplikację w chmurze po wdrożeniu aplikacji w środowisku programistycznym, z uwzględnieniem wszystkich atrybutów klasy produkcyjnej oferowanej przez Cloud Run?

Odpowiedź brzmi oczywiście 0.

Inne ćwiczenia z programowania, które warto wypróbować...

Dokumentacja...

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ś.

498cab7d87ec12d3.png

Pakiet Google Cloud Innovators jest dostępny bezpłatnie i obejmuje:

  • Sesje dyskusji na żywo, kontrowersje i plany rozwoju na żywo, aby wyciągać wnioski bezpośrednio od pracowników Google
  • najnowsze wiadomości dotyczące Google Cloud bezpośrednio w skrzynce odbiorczej
  • Cyfrowa plakietka i tło rozmowy wideo
  • 500 punktów w modułach i nauce na platformie Skills Boost

Kliknij tutaj, aby się zarejestrować.