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
- przeglądarka, np. Chrome lub Firefox;
- projekt Google Cloud z włączonymi płatnościami;
- Warto, aby funkcja w Cloud Functions została wdrożona w ramach ćwiczenia z programowania w części 1 Ćwiczenia z programowania w Gemini do tworzenia funkcji w Cloud Functions dla aplikacji Generative AI.
- Warunkowe: jeśli masz obecnie dostęp do bezpłatnego linku do środków w Google Cloud (który mógł Ci udostępnić organizator warsztatów), skorzystaj z instrukcji na stronie poniżej, aby wcześniej wykonać czynności dotyczące AKTYWACJI ŚRODKÓW I TWORZENIA PROJEKTU. Jeśli nie masz tego linku, wykonaj te czynności:
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.
- W konsoli Google Cloud na stronie selektora projektu wybierz lub utwórz projekt Google Cloud.
- 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
- 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:
- 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
- Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt
gcloud config list project
- 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
- 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
- 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.
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:
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.
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:
.
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).
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”.
Na tej liście wybierz aplikację Cloud Run. Z listy, która się pojawi, wybierz Java:
Na wyświetlonej liście wpisz nazwę projektu „bookshelf-web” zamiast „helloworld” i kliknij OK.
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ć:
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 :
<!-- What maven dependency should I include to access BigQuery in the app-->
Wynik jest widoczny na obrazie poniżej:
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:
- W pliku HelloWorldController.java zmodyfikowano @Controller na @RestController.
- 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.
- 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
- 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ć:
- 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.
- 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.
- 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.
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:
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ź:
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:
Aplikacja zostanie wdrożona w Google Cloud bezserwerowo, co zajmuje kilka minut. Kliknij wdrożoną aplikację Cloud Run i wyświetl wynik w internecie:
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.