Analityka półek na książki: użyj Gemini do utworzenia aplikacji w Javie Cloud Run, która przenosi dane BigQuery do internetu

1. Wprowadzenie

Lubisz sięgać po książki, ale liczba dostępnych tytułów jest przytłaczająca? Wyobraź sobie aplikację z wykorzystaniem AI, która nie tylko poleca idealną książkę, ale też zawiera jej zwięzłe streszczenie na podstawie wybranego przez Ciebie gatunku, dzięki czemu możesz poznać esencję książki. W tym laboratorium programistycznym pokażę Ci, jak tworzyć taką aplikację za pomocą BigQuery, Vertex AI i Cloud Run z pomocą Gemini.

Omówienie projektu

Nasz przypadek użycia koncentruje się na 4 głównych komponentach:

  • Książkowa baza danych: obszerny publiczny zbiór danych BigQuery z książkami z internetowego archiwum będzie służyć jako nasz wyczerpujący katalog książek.
  • Mechanizm podsumowywania AI: usługa Google Cloud Functions wyposażona w model językowy Gemini-Pro będzie generować szczegółowe podsumowania dostosowane do żądań użytkowników.
  • Integracja z BigQuery: funkcja zdalna w BigQuery, która wywołuje na żądanie naszą funkcję w Cloud Functions, aby dostarczać podsumowania i motywy książek.
  • Interfejs użytkownika: aplikacja internetowa hostowana w Cloud Run, która będzie oferować użytkownikom aplikację internetową do wyświetlania wyników.

Cały projekt podzieliliśmy na 3 ćwiczenia z programowania, a to ćwiczenie obejmuje ćwiczenie 3 na liście poniżej:

Ćwiczenie z programowania 1. Wykorzystaj Gemini, aby utworzyć funkcję w Cloud Functions dla aplikacji Gemini w języku Java.

Codelab 2: tworzenie aplikacji z generatywną AI w BigQuery przy użyciu tylko języka SQL.

Codelab 3: użyj Gemini do utworzenia aplikacji internetowej Java Spring Boot, która będzie współpracować z BigQuery.

2. Użyj Gemini do tworzenia aplikacji internetowej Spring Boot za pomocą BigQuery

Co utworzysz

  • Utwórz niezbędny zbiór danych i tabelę BigQuery.
  • Aplikacja internetowa Java Spring Boot, która współpracuje z BigQuery, by pobierać dane książek i wyświetlać ją w internecie.
  • Ta aplikacja jest wdrożona w Cloud Run.
  • Wykonywanie tych czynności będzie Ci pomagać Gemini.

3. Wymagania

Tworzenie projektu

Jeśli masz już aktywne konto rozliczeniowe i utworzyłeś(-aś) projekt za pomocą linku wymienionego w warunkowym kroku powyżej, możesz pominąć czynności opisane poniżej.

  1. W konsoli Google Cloud na stronie selektora projektu wybierz lub utwórz projekt Google Cloud.
  2. Sprawdź, czy w projekcie Cloud włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie są włączone płatności.

Aktywowanie Cloud Shell

  1. Użyjesz Cloud Shell – środowiska wiersza poleceń działającego w Google Cloud, które ma wstępnie zainstalowane narzędzie bq:

W Cloud Console w prawym górnym rogu kliknij Aktywuj Cloud Shell:

6757b2fb50ddcc2d.png

  1. Po nawiązaniu połączenia z Cloud Shell powinno pojawić się informacja, że użytkownik jest już uwierzytelniony i że projekt jest już ustawiony na identyfikator Twojego projektu. Aby potwierdzić uwierzytelnianie, uruchom w Cloud Shell to polecenie:
gcloud auth list
  1. Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt
gcloud config list project
  1. Jeśli projekt nie jest ustawiony, użyj tego polecenia:
gcloud config set project <YOUR_PROJECT_ID>

Więcej informacji o poleceniach i sposobie korzystania z gcloud znajdziesz w dokumentacji.

4. Włączanie Gemini i niezbędnych interfejsów API

Włącz Gemini

  1. Aby włączyć interfejs API, otwórz platformę handlową Gemini. Możesz też użyć tego polecenia:

gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID

  1. Otwórz stronę Gemini i kliknij „Rozpocznij rozmowę”.

Włączanie innych wymaganych interfejsów API

Jak to zrobić? Zapytajmy o to Gemini. Zanim to zrobisz, pamiętaj:

Uwaga: modele LLM nie są deterministyczne. Dlatego gdy wypróbujesz te prompty, otrzymana odpowiedź może wyglądać inaczej niż na moim zrzucie ekranu.

Otwórz konsolę czatu z Gemini, klikając ikonę „Otwórz Gemini” w prawym górnym rogu obok paska wyszukiwania w konsoli Google Cloud.

26e1491322855614.png

Wpisz pytanie w sekcji „Wpisz prompt tutaj”:

How do I enable the BigQuery and Cloud Run apis using gcloud command?

Otrzymasz odpowiedź widoczną na tym obrazie:

b97a8a9fa9143b3f.png

Skopiuj to polecenie (możesz użyć ikony kopiowania u góry fragmentu kodu polecenia) i uruchom je w terminalu Cloud Shell, aby włączyć odpowiednie usługi:

  • bigquery.googleapis.com
  • run.googleapis.com

5. Przeglądanie publicznego zbioru danych BigQuery zawierającego dane o książkach

Na początek zapoznaj się z publicznym zbiorem danych BigQuery zawierającym informacje o wielu książkach z archiwum internetowego. Jeśli nie możesz przejść do zbioru danych internetarchivebooks za pomocą tego linku, wykonaj podane niżej czynności, aby go wyświetlić, lub postępuj zgodnie z tą dokumentacją:

Ten publiczny zbiór danych znajdziesz w panelu Eksplorator BigQuery. Znajdziesz go po lewej stronie po przejściu do konsoli BigQuery.

39e2ac03cc99cbac.png

Na pasku wyszukiwania wpisz „gdelt-bq” lub „internetarchivebooks” i kliknij SZUKAJ WE WSZYSTKICH PROJEKTACH. Rozwiń wynik i oznacz gwiazdką książki z archiwum internetowego, jak pokazano na obrazku poniżej:

68dba68a79cddfc9.png.

Rozwiń zbiór danych, kliknij gdelt-bq.internetarchivebooks, a potem wyświetl podgląd danych w tabeli 1920. Ta tabela zawiera zarchiwizowane książki z roku 1920.

Aby zobaczyć schemat, którego będziemy używać w kolejnych sekcjach, uruchom to zapytanie:

select * from  `gdelt-bq.internetarchivebooks.1920` limit 5;

W naszym codelab użyjemy tych 3 pol:

  • BookMeta_Title (title)
  • Tematy (tematy rozdzielone znakiem ‘;')
  • BookMeta_FullText (pełny tekst książki)

6. Tworzenie podstawowego szablonu Java Cloud Run za pomocą Gemini

Otwórz edytor Cloud Shell, klikając ikonę Otwórz edytor w prawym górnym rogu terminala Cloud Shell (zwykle wolę otworzyć terminal i edytor jednocześnie w osobnych kartach, aby móc pisać kod w jednej, a w drugiej).

edd258384bc74f1f.png

Po otwarciu edytora sprawdź, czy logo Gemini w prawym dolnym rogu konsoli jest aktywne (i nie zostało anulowane). Sprawdź też, czy widoczny w lewym dolnym rogu projekt Google Cloud wskazuje aktywny projekt, z którym chcesz pracować. Jeśli są nieaktywne, kliknij je, autoryzuj, wybierz projekt Google Cloud, do którego mają wskazywać, i aktywuj je.

Gdy oba te elementy są aktywne, kliknij nazwę projektu w lewym dolnym rogu. W otwartym oknie „Cloud Code” przewiń w dół do opcji „Nowa aplikacja”.

db998cc557e83f40.png

Na tej liście wybierz aplikację Cloud Run. Z listy, która się pojawi, wybierz Java:

c7748de85120507b.png

Na wyświetlonej liście wpisz nazwę projektu „bookshelf-web” zamiast „helloworld” i kliknij OK.

7c58c764277c571f.png

Hurra! Za pomocą Gemini uruchomiłeś/uruchomiłaś prostą aplikację Java Cloud Run i nie zrobiłeś/nie zrobiłaś nic poza włączeniem i aktywowaniem konfiguracji, zgadzasz się?

Oto struktura projektu, którą powinieneś zobaczyć:

e6be37bbee730bd1.png

Teraz możesz już wdrożyć aplikację. Nie dlatego jednak zaczęliśmy to robić. Nadal musimy uwzględnić główną funkcję aplikacji internetowej, która polega na pobieraniu danych analitycznych z bazy danych BigQuery i wyświetlaniu ich w internecie.

Aby to zrobić, możesz dodać więcej promptów i uzyskiwać kod rozwijany stopniowo za pomocą Gemini lub napisać logikę samodzielnie. Połączę obie metody.

7. Dodawanie zależności, aby korzystać z BigQuery w aplikacji internetowej

Po zakończeniu wczytywania aplikacji możesz wprowadzić zmiany w jej źródle i jej właściwościach. Najpierw dodamy zależności. Poprośmy Gemini o rekomendację.

Sprawdź, czy na pasku stanu w edytorze Cloud Code wyświetla się Gemini aktywny, a w lewym dolnym rogu – aktywny projekt Google Cloud.

W edytorze Cloud Code otwórz plik pom.xml i tuż nad tagiem </dependencies> wpisz ten komentarz :

171d1c40ff8124e8.png

<!-- What maven dependency should I include to access BigQuery in the app-->

Wynik jest widoczny na obrazie poniżej:

2df51efd655a3557.png

Wklejam tutaj zależność, aby ułatwić Ci pracę. Jeśli w Twoim przypadku sugestia zawiera tag wersji, możesz go zignorować.

<dependency>
 <groupId>com.google.cloud</groupId>
 <artifactId>google-cloud-bigquery</artifactId>
</dependency>

8. Zaktualizuj źródło, aby przenieść dane półki na książki w internecie

Zastąp kod HelloWorldController.java poniższym kodem:

package cloudcode.helloworld.web;
import java.util.UUID;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.JobId;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;
import com.google.cloud.bigquery.FieldValueList;


@RestController
public final class HelloWorldController {


  /**
   * Create an endpoint for the landing page
   * @return the BigQuery analytics results string to the web
   */


  @GetMapping("/")
  public String helloWorld() throws Exception {
    /* Connect to bigquery and write a select SQL to fetch Title, Theme and Summary fields from the table `bookshelf.bookshelf_theme` if you have executed the codelab 1 of this series, if not just directly use records from gdelt-bq.internetarchivebooks.1920 table */

 
String query = "SELECT  BookMeta_Title || ' (' || Themes || ') ' as summary  from gdelt-bq.internetarchivebooks.1920 limit 10 ";


    BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    QueryJobConfiguration queryConfig =
        QueryJobConfiguration.newBuilder(query)
            .setUseLegacySql(false)
            .build();
    // Create a job ID so that we can safely retry.
    JobId jobId = JobId.of(UUID.randomUUID().toString());
    Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());
    // Wait for the query to complete.
    queryJob = queryJob.waitFor();
    // Check for errors
    if (queryJob == null) {
      throw new RuntimeException("Job no longer exists");
    } else if (queryJob.getStatus().getError() != null) {
      throw new RuntimeException(queryJob.getStatus().getError().toString());
    }
    // Get the results.
    TableResult result = queryJob.getQueryResults();
    String responseString = "";
    // Print all pages of the results.
    for (FieldValueList row : result.iterateAll()) {
      responseString += row.get("summary").getStringValue() + ".         \n";
      System.out.printf("%s\n", row.get("summary").getStringValue());
    }
    return responseString;
  }
}

Wprowadziliśmy w plikach źródłowych te zmiany:

  1. W pliku HelloWorldController.java zmodyfikowano @Controller na @RestController.
  2. Zawartość metody helloWorld() została zastąpiona przez wywołanie BigQuery, wykonanie zapytania, które pobiera dane, aby wyświetlić tytuł i motywy książki.
  3. Zamiast zwracać szablon widoku indeksu podczas wczytywania, jest on aktualizowany tak, aby zwracał odpowiedź w postaci ciągu znaków w internecie.

Ważna uwaga: pamiętaj, aby zaktualizować te informacje

  1. Zaktualizuj plik HelloWorldControllerTests.Java, aby skomentować bieżące wywołanie mvc.perform(...).

Gemini dla wyjaśnień kodu

Przesłaliśmy Ci kod i opisałeś zmiany, które wprowadziliśmy w plikach źródłowych. W razie potrzeby możesz też użyć Gemini, aby uzyskać wyjaśnienia kodu lub komentarze do kodu. Oto kilka rzeczy, które możesz wypróbować:

  1. Po otwarciu pliku HelloWorldController.java w IDE otwórz panel czatu w IDE i wyświetl to prompt: Explain this (Wyjaśnij to). Zapoznaj się ze szczegółowym wyjaśnieniem dostępnym przez Gemini. Możesz go użyć w każdej chwili, aby uzyskać wyjaśnienie kodu.
  2. Możesz wyróżnić dowolny fragment lub wiersz kodu (np. @GetMapping("/")), a następnie użyć tego prompta: Explain this (Wyjaśnij to). Spowoduje to wyświetlenie szczegółowego wyjaśnienia tylko w wybranym wierszu kodu lub fragmentu.
  3. Możesz nawet wypróbować zapytania, które pytają o kod w inny sposób. Możesz na przykład wybrać ten wiersz kodu

BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

i utwórz zapytanie „Co się stanie, jeśli zmienna bigquery będzie miała wartość null?” 4. Możesz też poprosić o poprawki w kodzie lub refaktoryzację za pomocą Gemini. Możesz na przykład wybrać cały kod metody helloWorld() i umieścić prompt: „Jak ulepszyć lub przerobić ten kod?”. Sprawdź sugestie, które udostępnia Gemini.

9. Kompilacja i wdrażanie

Przejdź do terminala Cloud Shell. Upewnij się, że w terminalu wskazuje on identyfikator Twojego projektu.

4b3392dd050340a3.png

Przejdź do katalogu projektu za pomocą polecenia cd:

cd bookshelf-web

Aby sprawdzić, czy aplikacja działa lokalnie, uruchom po kolei podane niżej polecenia.

mvn package

mvn spring-boot:run

Teraz kliknij przycisk „Podgląd w przeglądarce” i opcję „Podejrzyj na porcie 8080”, jak pokazano na ilustracji:

ea9464498b6bd9df.png

Upewnij się, że aplikacja działa lokalnie na maszynie Cloud Shell.

Teraz zapytajmy Gemini, jak wdrożyć tę aplikację internetową w Cloud Run. Otwórz Gemini Chat, klikając przycisk „Otwórz Gemini” w konsoli Google Cloud.

Oto mój prompt:

What is the gcloud command to deploy my app to cloud run without having to containerize, only by giving the source file?

Oto odpowiedź:

6f21c2d59b6dc416.png

Zastąpmy nazwę usługi i zakładki regionów w komendach gcloud, jak pokazano w tym fragmencie kodu:

gcloud run deploy bookshelf-web --source . --allow-unauthenticated --region $REGION

Uruchom to polecenie w terminalu Cloud Shell. Powinna pojawić się seria pytań, w których odpowiedziach należy wybrać odpowiednie odpowiedzi. W tym czasie będzie też widoczne wdrożenie:

66f5d6e00c16a4db.png

Aplikacja zostanie wdrożona w Google Cloud bezserwerowo, co zajmuje kilka minut. Kliknij wdrożoną aplikację Cloud Run i wyświetl wynik w internecie:

fd342d8f16e664ab.png

10. Gratulacje

Gratulacje! Udało nam się utworzyć, wdrożyć i przetestować aplikację internetową Java Cloud Run, która wykonuje analizę półki za pomocą Gemini. W ramach zadania zapytaj Gemini, jak usunąć wdrożoną usługę Cloud Run z konsoli Google Cloud i wykonaj podane w niej instrukcje, aby wyczyścić zasób.