Automatyczne wdrażanie generatywnej AI w Go z kontroli wersji do Cloud Run

1. Omówienie

Wdrażanie aplikacji internetowej po raz pierwszy może wydawać się niezwykle skomplikowanym zadaniem. Nawet po pierwszym wdrożeniu, jeśli proces wymaga zbyt dużo pracy, możesz nie wdrażać nowych wersji aplikacji. Dzięki ciągłemu wdrażaniu możesz łatwo wdrażać zmiany w aplikacji.

W tym module napiszesz aplikację internetową i skonfigurujesz Cloud Run, aby automatycznie wdrażać aplikację po wprowadzeniu zmiany w kodzie źródłowym. Następnie zmodyfikuj aplikację i ponownie ją wdróż.

Czego się nauczysz

  • Tworzenie aplikacji internetowej za pomocą edytora Cloud Shell
  • Przechowywanie kodu aplikacji w GitHubie
  • Automatyczne wdrażanie aplikacji w Cloud Run
  • Dodawanie generatywnej AI do aplikacji za pomocą Vertex AI

2. Wymagania wstępne

  1. Jeśli nie masz jeszcze konta Google, utwórz je.
    • Używasz konta osobistego, a nie służbowego lub szkolnego. Konta służbowe i szkolne mogą mieć ograniczenia, które uniemożliwiają włączenie interfejsów API potrzebnych w tym laboratorium.
  2. Jeśli nie masz jeszcze konta GitHub, musisz utworzyć je.

3. Konfigurowanie projektu

  1. Zaloguj się w konsoli Google Cloud.
  2. Włącz rozliczenia w Cloud Console.
  3. Utwórz nowy projekt lub użyj istniejącego.

4. Otwórz edytor Cloud Shell

  1. Otwórz Edytor Cloud Shell.
  2. Jeśli terminal nie pojawia się u dołu ekranu, otwórz go:
    • Kliknij menu z 3 kreskami Ikona menu z 3 kreskami
    • Kliknij Terminal.
    • Kliknij Nowy terminalOtwieranie nowego terminala w edytorze Cloud Shell.
  3. W terminalu skonfiguruj projekt za pomocą tego polecenia:
    • Format:
      gcloud config set project [PROJECT_ID]
      
    • Przykład:
      gcloud config set project lab-project-id-example
      
    • Jeśli nie pamiętasz identyfikatora projektu:
      • Aby wyświetlić wszystkie identyfikatory projektów, użyj:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      Ustawianie identyfikatora projektu w terminalu edytora Cloud Shell
  4. Jeśli pojawi się pytanie o autoryzację, kliknij Autoryzuj, aby kontynuować. Kliknij, aby autoryzować Cloud Shell
  5. Powinien wyświetlić się ten komunikat:
    Updated property [core/project].
    
    Jeśli zobaczysz WARNING i usłyszysz pytanie Do you want to continue (Y/N)?, prawdopodobnie nieprawidłowo wpisano identyfikator projektu. Naciśnij N, naciśnij Enter i spróbuj ponownie uruchomić polecenie gcloud config set project.

5. Włącz interfejsy API

Włącz w terminalu te interfejsy API:

gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  aiplatform.googleapis.com

Wykonanie tego polecenia może potrwać kilka minut, ale ostatecznie powinno wyświetlić komunikat podobny do tego:

Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.

6. Skonfiguruj Git

  1. Ustaw adres e-mail globalnego użytkownika git:
    git config --global user.email "you@example.com"
    
  2. Ustaw globalną nazwę użytkownika Git:
    git config --global user.name "Your Name"
    
  3. Ustaw globalną gałąź domyślną git na main:
    git config --global init.defaultBranch main
    

7. Tworzenie kodu

Aby napisać aplikację w języku Go:

  1. Przejdź do katalogu domowego:
    cd ~
    
  2. Utwórz katalog codelab-genai:
    mkdir codelab-genai
    
  3. Przejdź do katalogu codelab-genai:
    cd codelab-genai
    
  4. Aby zadeklarować moduł, zainicjuj plik go.mod:
    go mod init codelab-genai
    
  5. Utwórz plik main.go:
    touch main.go
    
  6. Otwórz plik main.go w edytorze Cloud Shell:
    cloudshell edit main.go
    
    W górnej części ekranu powinien pojawić się pusty plik. Tutaj możesz edytować plik main.go. Pokaż, że kod znajduje się w górnej części ekranu
  7. Zmień plik main.go i wklej do niego ten kod:
    package main
    
    import (
        "fmt"
        "log"
        "net/http"
        "os"
    )
    
    func main() {
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
            fmt.Fprintln(w, "Hello, world!")
        })
    
        port := os.Getenv("PORT")
    
        if port == "" {
            port = "8080"
        }
        if err := http.ListenAndServe(":"+port, nil); err != nil {
            log.Fatal(err)
        }
    }
    
    Po kilku sekundach edytor Cloud Shell automatycznie zapisze kod. Ten kod odpowiada na żądania http pozdrowieniem „Hello world!”.

Początkowy kod aplikacji jest gotowy i możesz go zapisać w systemie kontroli wersji.

8. Tworzenie repozytorium

  1. Wróć do terminala Cloud Shell na dole ekranu.
  2. Upewnij się, że nadal jesteś w właściwym katalogu:
    cd ~/codelab-genai
    
  3. Inicjowanie repozytorium Git
    git init -b main
    
  4. Zaloguj się w GitHub CLI
    gh auth login
    
    Naciśnij Enter, aby zaakceptować domyślne opcje, i postępuj zgodnie z instrukcjami w narzędziu GitHub CLI, w tym:
    1. Na które konto chcesz się zalogować? GitHub.com
    2. Który protokół jest preferowany do operacji Git na tym hoście? HTTPS
    3. Uwierzytelnianie Git za pomocą danych logowania do GitHuba? Y (pomiń, jeśli ta opcja się nie wyświetla).
    4. Jak chcesz uwierzytelnić GitHub CLI? Login with a web browser
    5. Skopiuj kod jednorazowy
    6. Otwórz stronę https://github.com/login/device.
    7. Wklej kod jednorazowy
    8. Kliknij Autoryzuj GitHub.
    9. Zaloguj się
  5. Sprawdź, czy jesteś zalogowany(-a):
    gh api user -q ".login"
    
    jeśli się uda, powinna zostać wyświetlona Twoja nazwa użytkownika w GitHub.
  6. Utwórz zmienną GITHUB_USERNAME
    GITHUB_USERNAME=$(gh api user -q ".login")
    
  7. Sprawdź, czy utworzysz zmienną środowiskową:
    echo ${GITHUB_USERNAME}
    
    Jeśli utworzenie zmiennej się powiedzie, powinna zostać wyświetlona nazwa użytkownika GitHub.
  8. Utwórz puste repozytorium GitHub o nazwie codelab-genai:
    gh repo create codelab-genai --private
    
    Jeśli pojawi się błąd:
    GraphQL: Name already exists on this account (createRepository)
    
    Masz już repozytorium o nazwie codelab-genai. Aby kontynuować ten samouczek, masz 2 opcje:
  9. Dodaj repozytorium codelab-genai jako repozytorium zdalne origin:
    git remote add origin https://github.com/${GITHUB_USERNAME}/codelab-genai
    

9. Udostępnianie kodu

  1. Sprawdź, czy jesteś w właściwym katalogu:
    cd ~/codelab-genai
    
  2. Dodaj wszystkie pliki w bieżącym katalogu do tego zatwierdzenia:
    git add .
    
  3. Utwórz pierwszy commit:
    git commit -m "add http server"
    
  4. Wypchnij zatwierdzanie do gałęzi main repozytorium origin:
    git push -u origin main
    

Aby wyświetlić kod aplikacji na GitHubie, uruchom to polecenie i otwórz otrzymany adres URL:

echo -e "\n\nTo see your code, visit this URL:\n \
    https://github.com/${GITHUB_USERNAME}/codelab-genai/blob/main/main.go \n\n"

10. Konfigurowanie automatycznych wdrożeń

  1. Pozostaw otwartą kartę Edytor Cloud Shell. Wrócimy do tej karty później.
  2. W nowej karcie otwórz stronę Cloud Run.
  3. Wybierz odpowiedni projekt Google Cloud w konsoli Menu projektu w konsoli Google Cloud
  4. Kliknij POŁĄCZ REPOSITORYUM.
  5. Kliknij SKONFIGURETUJ Z CLOUD BUILD
      .
    1. Jako Dostawca repozytorium
        wybierz GitHub.
      • Jeśli nie jesteś zalogowany(-a) na konto GitHub w przeglądarce, zaloguj się, podając swoje dane logowania.
    2. Kliknij kolejno Uwierzytelnij i Dalej.
    3. Po zalogowaniu się na stronie Cloud Run zobaczysz komunikat Aplikacja na GitHubie nie jest zainstalowana w żadnym Twoim repozytorium.
    4. Kliknij przycisk ZAINSTALUJ GOOGLE CLOUD BUILD.
      • Na stronie Konfiguracja instalacji wybierz Tylko wybrane repozytoria i wybierz repozytorium codelab-genai utworzone za pomocą CLI.
      • Kliknij Zainstaluj.
      • Uwaga: jeśli masz dużo repozytoriów GitHub, wczytywanie może potrwać kilka minut.
    5. Jako repozytorium
        wybierz your-user-name/codelab-genai.
      • Jeśli repozytorium jest nieobecne, kliknij link Zarządzaj połączonymi repozytoriami.
    6. W polu Gałąź pozostaw wartość ^main$.
    7. Kliknij Go, Node.js, Python, Java, .NET Core, Ruby lub PHP za pomocą pakietów kompilacji Google Cloud
      • Pozostaw pozostałe pola (Build context directory, EntrypointFunction target) bez zmian.
    8. Kliknij Zapisz.
  6. Przewiń w dół do sekcji Uwierzytelnianie.
  7. Kliknij Zezwalaj na nieuwierzytelnione wywołania.
  8. Kliknij UTWÓRZ.

Gdy kompilacja zostanie ukończona (co może potrwać kilka minut), uruchom to polecenie i otwórz adres URL, który zostanie wyświetlony, aby wyświetlić uruchomioną aplikację:

echo -e "\n\nOnce the build finishes, visit your live application:\n \
    "$( \
        gcloud run services list | \
        grep codelab-genai | \
        awk '/URL/{print $2}' | \
        head -1 \
    )" \n\n"

11. Zmień kod

  1. Wróć do terminala Cloud Shell na dole ekranu.
  2. Upewnij się, że nadal jesteś w właściwym katalogu:
    cd ~/codelab-genai
    
  3. Ponownie otwórz plik main.go w edytorze Cloud Shell
    cloudshell edit main.go
    
  4. Zainstaluj pakiet Vertex AI SDK dla Go:
    go get cloud.google.com/go/vertexai/genai
    
  5. Zainstaluj bibliotekę metadanych dla Go, aby uzyskać identyfikator bieżącego projektu:
    go get cloud.google.com/go/compute/metadata
    
  6. Zastąp kod w pliku main.go tym kodem:
    package main
    
    import (
        "context"
        "fmt"
        "log"
        "net/http"
        "os"
    
        "cloud.google.com/go/compute/metadata"
        "cloud.google.com/go/vertexai/genai"
    )
    
    func main() {
        ctx := context.Background()
        var projectId string
        var err error
        projectId = os.Getenv("GOOGLE_CLOUD_PROJECT")
        if projectId == "" {
            projectId, err = metadata.ProjectIDWithContext(ctx)
            if err != nil {
                return
            }
        }
        var client *genai.Client
        client, err = genai.NewClient(ctx, projectId, "us-central1")
        if err != nil {
            return
        }
        defer client.Close()
    
        model := client.GenerativeModel("gemini-1.5-flash-001")
    
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
            animal := r.URL.Query().Get("animal")
            if animal == "" {
                animal = "dog"
            }
    
            resp, err := model.GenerateContent(
                ctx,
                genai.Text(
                    fmt.Sprintf("Give me 10 fun facts about %s. Return the results as HTML without markdown backticks.", animal)),
            )
    
            if err != nil {
                w.WriteHeader(http.StatusServiceUnavailable)
                return
            }
    
            if len(resp.Candidates) > 0 && len(resp.Candidates[0].Content.Parts) > 0 {
                htmlContent := resp.Candidates[0].Content.Parts[0]
                w.Header().Set("Content-Type", "text/html; charset=utf-8")
                fmt.Fprint(w, htmlContent)
            }
        })
    
        port := os.Getenv("PORT")
    
        if port == "" {
            port = "8080"
        }
        if err := http.ListenAndServe(":"+port, nil); err != nil {
            log.Fatal(err)
        }
    }
    

12. Wdróż ponownie

  1. Upewnij się, że nadal jesteś w odpowiednim katalogu w Cloud Shell:
    cd ~/codelab-genai
    
  2. Aby zacommitować nową wersję aplikacji do lokalnego repozytorium Git, uruchom te polecenia:
    git add .
    git commit -m "add latest changes"
    
  3. Prześlij zmiany do GitHuba:
    git push
    
  4. Po zakończeniu kompilacji uruchom to polecenie i otwórz wdrożoną aplikację:
    echo -e "\n\nOnce the build finishes, visit your live application:\n \
        "$( \
            gcloud run services list | \
            grep codelab-genai | \
            awk '/URL/{print $2}' | \
            head -1 \
        )" \n\n"
    

Utworzenie wersji może potrwać kilka minut.

Historię wszystkich wersji znajdziesz tutaj: https://console.cloud.google.com/run/detail/us-central1/codelab-genai/revisions

13. (Opcjonalnie) Sprawdzanie korzystania z Vertex AI

Podobnie jak w przypadku innych usług Google Cloud, możesz przeprowadzić audyt operacji Vertex AI. Logi kontrolne pomagają odpowiedzieć na pytania „kto, co, gdzie i kiedy?”. Logi kontrolne administracyjne Vertex AI są domyślnie włączone. Aby weryfikować prośby o generowanie treści, musisz włączyć logi kontrolne dostępu do danych:

  1. W konsoli Google Cloud otwórz stronę Logi audytu:

    Jeśli do znalezienia tej strony użyjesz paska wyszukiwania, wybierz wynik z podtytułem Administracja.
  2. Upewnij się, że tworzysz aplikację Cloud Run w istniejącym projekcie Google Cloud.
  3. W tabeli Konfiguracja logów kontrolnych dostępu do danych znajdź kolumnę Usługa i kliknij Vertex AI API.
  4. Na karcie Typy logów wybierz typy logów kontrolnych Dostęp do danych: Admin read i Data read.
  5. Kliknij Zapisz.

Po włączeniu tej opcji będziesz mieć dostęp do dzienników kontrolnych dotyczących każdego wywołania aplikacji. Aby wyświetlić dzienniki kontrolne z informacjami o wywołaniu, wykonaj te czynności:

  1. Wróć do wdrożonej aplikacji i odśwież stronę, aby wywołać dziennik.
  2. W konsoli Google Cloud otwórz stronę Eksplorator logów:

  3. W oknie zapytania wpisz:
    LOG_ID("cloudaudit.googleapis.com%2Fdata_access")
    protoPayload.serviceName="aiplatform.googleapis.com"
    
  4. Kliknij Uruchom zapytanie.

W logach audytu rejestrowane jest korzystanie z interfejsu Vertex AI API, ale nie zawierają one danych związanych z obciążeniem, takich jak prompty ani szczegóły odpowiedzi.

14. (Opcjonalnie) Zwiększanie możliwości obserwacji zadań związanych z AI

Logi audytu nie zawierają informacji związanych z obciążeniem pracą. Aby zwiększyć możliwości obserwacji obciążeń, musisz wyraźnie odnotować te informacje. W tym celu możesz użyć ulubionego frameworku rejestrowania. Poniżej przedstawiamy jeden ze sposobów wykonania tej operacji za pomocą biblioteki logowania uporządkowanego w Go.

  1. Ponownie otwórz plik main.go w edytorze Cloud Shell
    cloudshell edit ~/codelab-genai/main.go
    
  2. Zmień blok importu, aby uwzględniał biblioteki Go do rejestrowania uporządkowanych danych i biblioteki JSON:
    import (
        "context"
        "encoding/json"
        "fmt"
        "log"
        "log/slog"
        "net/http"
        "os"
    
        "cloud.google.com/go/compute/metadata"
        "cloud.google.com/go/vertexai/genai"
    )
    
  3. Po zainicjowaniu klienta Vertex (wiersz 33) dodaj te wiersze, aby zainicjować rejestrator strukturyzowany, który używa odpowiednich pól do Google Cloud Logging:
    opts := &slog.HandlerOptions{
    	Level: slog.LevelDebug,
    	ReplaceAttr: func(group []string, a slog.Attr) slog.Attr {
            if a.Key == slog.LevelKey {
                return slog.Attr{Key: "severity", Value: a.Value}
            }
            if a.Key == slog.MessageKey {
                return slog.Attr{Key: "message", Value: a.Value}
            }
            return slog.Attr{Key: a.Key, Value: a.Value}
    	},
    }
    
    jsonHandler := slog.NewJSONHandler(os.Stdout, opts)
    slog.SetDefault(slog.New(jsonHandler))
    
  4. Po sprawdzeniu odpowiedzi na GenerateContent (wiersz 69) dodaj te wiersze w bloku if:
    jsonBytes, err := json.Marshal(resp)
    if err != nil {
        slog.Error("Failed to marshal response to JSON", "error", err)
    } else {
        jsonString := string(jsonBytes)
        slog.Debug("Complete response content", "json_response", jsonString)
    }
    
    Ten kod zapisuje w stdout informacje o wygenerowanych treściach w formacie z użyciem uporządkowanego rejestrowania. Agent rejestrowania w Cloud Run rejestruje dane wyjściowe wydrukowane w formacie stdout i zapisuje je w Cloud Logging.
  5. Ponownie otwórz Cloud Shell i wpisz to polecenie, aby sprawdzić, czy jesteś we właściwym katalogu:
    cd ~/codelab-genai
    
  6. Zatwierdź zmiany:
    git commit -am "Observe generated content"
    
  7. Prześlij zmiany do GitHuba, aby wywołać ponowne wdrożenie zmodyfikowanej wersji:
    git push
    

Po wdrożeniu nowej wersji możesz obserwować informacje debugowania dotyczące wywołań do Vertex AI.

Aby wyświetlić dzienniki aplikacji:

  1. W konsoli Google Cloud otwórz stronę Eksplorator logów:

  2. W oknie zapytania wpisz:
    LOG_ID("run.googleapis.com%2Fstdout")
    severity=DEBUG
    
  3. Kliknij Uruchom zapytanie.

Wynik zapytania zawiera logi z promptem i odpowiedzią Vertex AI, w tym „oceny bezpieczeństwa”, które można wykorzystać do monitorowania praktyk bezpieczeństwa.

15. (Opcjonalnie) Czyszczenie

Cloud Run nie nalicza opłat, gdy usługa nie jest używana, ale może zostać pobrana należność za przechowywanie obrazu kontenera w Artifact Registry. Aby uniknąć opłat, możesz usunąć projekt Cloud. Usunięcie projektu Cloud powoduje zaprzestanie naliczania opłat za wszystkie zasoby używane w tym projekcie.

Jeśli chcesz, możesz usunąć projekt:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Możesz też usunąć niepotrzebne zasoby z dysku CloudShell. Możesz:

  1. Usuń katalog projektu ćwiczeń z programowania:
    rm -rf ~/codelab-genai
    
  2. Usuń pakiety go, których już nie potrzebujesz:
    cd ~
    go clean -modcache
    
  3. Ostrzeżenie! Tej czynności nie można cofnąć. Jeśli chcesz usunąć wszystko z Cloud Shell, aby zwolnić miejsce, możesz usunąć cały katalog domowy. Upewnij się, że wszystko, co chcesz zachować, jest zapisane gdzie indziej.
    sudo rm -rf $HOME
    

16. Gratulacje

W tym module napiszesz aplikację internetową i skonfigurujesz Cloud Run, aby automatycznie wdrażać aplikację po wprowadzeniu zmiany w kodzie źródłowym. Następnie zmodyfikowałeś aplikację i ponownie ją wdrożyłeś.

Jeśli podobał Ci się ten warsztat, możesz go powtórzyć w innym języku programowania lub środowisku programistycznym:

Jeśli chcesz wziąć udział w badaniu wrażeń użytkowników (UX), aby ulepszyć produkty, z których korzystasz, zarejestruj się tutaj.

Oto kilka opcji dalszej nauki: