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 czytać książki, ale przytłacza Cię ogromny wybór? Wyobraź sobie aplikację opartą na AI, która nie tylko poleca idealną lekturę, ale też oferuje zwięzłe podsumowanie na podstawie wybranego gatunku, dając Ci wgląd w treść książki. W tym module pokażę Ci, jak utworzyć taką aplikację przy użyciu BigQuery, Vertex AI i Cloud Run z pomocą Gemini.

Project Overview

Nasz przypadek użycia opiera się na tych 4 kluczowych komponentach:

  • Baza danych książek: obszerny publiczny zbiór danych BigQuery zawierający książki z archiwum internetowego będzie służyć jako nasz kompleksowy katalog książek.
  • Silnik podsumowań oparty na AI: Google Cloud Functions, wyposażone w model językowy Gemini-Pro, będą generować przydatne podsumowania dostosowane do żądań użytkowników.
  • Integracja z BigQuery: funkcja zdalna w BigQuery, która wywołuje naszą funkcję Cloud Functions, aby dostarczać podsumowania i motywy książek na żądanie.
  • Interfejs użytkownika: aplikacja internetowa hostowana w Cloud Run, która będzie udostępniać użytkownikom aplikację internetową do wyświetlania wyników.

Wdrożenie całego projektu podzieliliśmy na 3 laboratoria. To laboratorium obejmuje laboratorium 3 z poniższej listy:

Codelab 1. Użyj Gemini do utworzenia funkcji w Cloud Functions w języku Java na potrzeby aplikacji Gemini.

Codelab 2: używanie Gemini do tworzenia aplikacji generatywnej AI opartych wyłącznie na SQL w BigQuery.

Codelab 3: użyj Gemini do utworzenia aplikacji internetowej Java Spring Boot, która wchodzi w interakcję z BigQuery.

2. Tworzenie aplikacji internetowej Spring Boot z BigQuery za pomocą Gemini

Co utworzysz

  • Utwórz niezbędny zbiór danych i tabelę BigQuery.
  • Aplikacja internetowa Java Spring Boot, która wchodzi w interakcję z BigQuery, aby pobierać dane o książkach i wyświetlać je w internecie.
  • Ta aplikacja jest wdrożona w Cloud Run.
  • Wykonasz te czynności z pomocą Gemini.

3. Wymagania

Tworzenie projektu

Jeśli masz już aktywne konto rozliczeniowe i utworzony projekt, możesz pominąć poniższe czynności. W tym celu kliknij link podany w kroku warunkowym powyżej.

  1. W konsoli Google Cloud na stronie selektora projektów 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.

Aktywuj Cloud Shell

  1. Będziesz używać Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud, które jest wstępnie załadowane narzędziem bq:

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

6757b2fb50ddcc2d.png

  1. Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list
  1. Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project
  1. Jeśli projekt nie jest ustawiony, użyj tego polecenia, aby go ustawić:
gcloud config set project <YOUR_PROJECT_ID>

Informacje o poleceniach gcloud i ich użyciu znajdziesz w dokumentacji.

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

Włącz Gemini

  1. Aby włączyć interfejs API, przejdź do Gemini Marketplace. Możesz też użyć tego polecenia:

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

  1. Odwiedź stronę Gemini i kliknij „Rozpocznij czat”.

Włącz inne niezbędne interfejsy API

Jak to zrobić? Zapytajmy o to Gemini. Pamiętaj jednak, że:

Uwaga: duże modele językowe nie są deterministyczne. Dlatego podczas testowania tych promptów otrzymana odpowiedź może wyglądać inaczej niż na moim zrzucie ekranu.

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

26e1491322855614.png

Wpisz to pytanie w sekcji „Tutaj wpisz prompta”:

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) 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 z danymi o książkach

Zacznij od zapoznania się z publicznym zbiorem danych BigQuery zawierającym informacje o wielu książkach z archiwum internetowego. Jeśli nie możesz otworzyć zbioru danych internetarchivebooks za pomocą tego linku, wykonaj poniższe czynności, aby go przejrzeć, lub zapoznaj się z tą dokumentacją:

Ten publiczny zbiór danych znajdziesz w panelu eksploratora BigQuery. Znajduje się ona po lewej stronie konsoli BigQuery.

39e2ac03cc99cbac.png

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

68dba68a79cddfc9.png.

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

Aby zapoznać się ze schematem, którego będziemy używać w kolejnych sekcjach, uruchom to zapytanie:

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

W tym samouczku będziemy używać tych 3 pól:

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

6. Tworzenie podstawowego szablonu Cloud Run w języku Java za pomocą Gemini

Otwórz edytor Cloud Shell, klikając ikonę Otwórz edytor w prawym górnym rogu terminala Cloud Shell (zwykle wolę otwierać terminal i edytor równolegle w osobnych kartach, aby móc pisać kod w jednym i budować w drugim).

edd258384bc74f1f.png

Po otwarciu edytora upewnij się, że logo Gemini w prawym dolnym rogu konsoli edytora jest aktywne (nie jest przekreślone). Sprawdź też, czy w lewym dolnym rogu jest wyświetlany projekt Google Cloud, z którego chcesz korzystać. Jeśli są nieaktywne, kliknij je, autoryzuj, wybierz projekt Google Cloud, do którego mają prowadzić, i aktywuj je.

Gdy oba będą aktywne, kliknij nazwę projektu w lewym dolnym rogu, a następnie na liście, która się otworzy, zatytułowanej „Cloud Code” przewiń w dół do pozycji „New Application” (Nowa aplikacja).

db998cc557e83f40.png

Na tej liście wybierz Aplikacja Cloud Run. Z wyświetlonej listy wybierz Java:

c7748de85120507b.png

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

7c58c764277c571f.png

Hurra! Uruchomiono prostą aplikację Java Cloud Run z Gemini i nie wykonano żadnych innych czynności poza włączeniem i aktywacją konfiguracji. Zgadzasz się?

Powinna pojawić się ta struktura projektu:

e6be37bbee730bd1.png

Możesz teraz wdrożyć aplikację. Ale nie dlatego zaczęliśmy to robić. Musimy jeszcze uwzględnić główną funkcję aplikacji internetowej, czyli pobieranie danych analitycznych z bazy danych BigQuery i wyświetlanie ich w internecie.

Aby to zrobić, możesz dodać więcej promptów i stopniowo rozwijać kod za pomocą Gemini lub samodzielnie napisać logikę. Zamierzam użyć obu tych metod.

7. Dodawanie zależności, aby używać BigQuery w aplikacji internetowej

Po uruchomieniu aplikacji możemy wprowadzać zmiany w jej źródle i właściwościach. Najpierw dodajmy zależności. Poprośmy Gemini o rekomendację.

W edytorze Cloud Code sprawdź, czy w prawym dolnym rogu paska stanu wyświetla się informacja o aktywności Gemini, a w lewym dolnym rogu – aktywny projekt Google Cloud.

W edytorze Cloud Code przejdź do pliku pom.xml i wpisz powyżej tagu </dependencies> ten komentarz z promptem :

171d1c40ff8124e8.png

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

Otrzymany wynik wygląda tak, jak na obrazie poniżej:

2df51efd655a3557.png

Dla wygody wklejamy tutaj zależność. 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. Aktualizowanie źródła, aby przenieść dane z półki do sieci

Zastąp kod w pliku HelloWorldController.java tym 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;
  }
}

W plikach źródłowych wprowadziliśmy te zmiany:

  1. W pliku HelloWorldController.java zmieniono @Controller na @RestController.
  2. Zastąpiliśmy treść metody helloWorld(), aby uwzględnić wywołanie BigQuery i wykonanie zapytania, które pobiera dane do wyświetlenia tytułu i tematów książki.
  3. Zamiast zwracać szablon widoku indeksu podczas ładowania, jest on aktualizowany, aby zwracać odpowiedź jako ciąg tekstowy do internetu.

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

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

Gemini do wyjaśniania kodu

Przesłaliśmy Ci kod i opisaliśmy 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. Otwórz plik HelloWorldController.java w IDE, przejdź do panelu czatu w IDE i wpisz ten prompt: Explain this (Wyjaśnij to). Zapoznaj się ze szczegółowym wyjaśnieniem podanym przez Gemini. W każdej chwili możesz z niego skorzystać, aby uzyskać wyjaśnienie dotyczące kodu.
  2. Możesz wyróżnić dowolny fragment lub wiersz kodu (np. @GetMapping("/")), a następnie użyć tego promptu: Explain this. Wyświetli to szczegółowe wyjaśnienie tylko w przypadku wybranego wiersza kodu lub fragmentu kodu.
  3. Możesz nawet wypróbować zapytania, które dotyczą kodu w inny sposób. Możesz na przykład wybrać ten wiersz kodu:

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

i wpisz zapytanie „Co się stanie, jeśli zmienna BigQuery będzie miała wartość null?”. 4. Możesz też poprosić Gemini o ulepszenie lub refaktoryzację kodu. Możesz na przykład wybrać cały kod metody helloWorld() i wpisać ten prompt: „Jak mogę ulepszyć lub refaktoryzować ten kod?”. Sprawdź sugestie Gemini.

9. Kompilacja i wdrożenie

Otwórz Cloud Shell Terminal. Sprawdź, czy w terminalu wskazuje on identyfikator Twojego projektu.

4b3392dd050340a3.png

Przejdź do katalogu projektu za pomocą polecenia cd:

cd bookshelf-web

Uruchom kolejno te polecenia, aby sprawdzić, czy aplikacja działa lokalnie.

mvn package

mvn spring-boot:run

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

ea9464498b6bd9df.png

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

Zapytajmy teraz Gemini, jak wdrożyć tę aplikację internetową w Cloud Run. Aby przejść do Gemini Chat, w konsoli Google Cloud kliknij przycisk „Otwórz Gemini”.

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?

Odpowiedź:

6f21c2d59b6dc416.png

Zastąpmy zmienne nazwy usługi i regionu w poleceniu gcloud, jak pokazano we fragmencie kodu poniżej:

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

Uruchom to polecenie w terminalu Cloud Shell. Powinno pojawić się kilka pytań uzupełniających. Wybierz odpowiednie odpowiedzi, a następnie sprawdź, czy wdrożenie jest w toku:

66f5d6e00c16a4db.png

Zajmuje to kilka minut, a aplikacja jest wdrażana bezserwerowo w Google Cloud. 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 za pomocą Gemini przeprowadza analizę półek na książki. Następnie zapytaj Gemini, jak usunąć wdrożoną usługę Cloud Run z konsoli Google Cloud, i wykonaj podane przez nią czynności, aby usunąć zasób.