Bookshelf 數據分析:使用 Gemini 建構 Java Cloud Run 應用程式,將 BigQuery 資料傳送到網頁

1. 簡介

你喜歡深入瞭解書籍,但選擇太多讓你不知從何下手嗎?想像一下,如果有一款 AI 輔助應用程式,不僅能推薦最適合你的讀物,還能根據你選擇的類型提供簡要摘要,讓你一窺書中精髓。在本程式碼研究室中,我將逐步說明如何使用 BigQuery、Vertex AI 和 Cloud Run 建構這類應用程式,並在 Gemini 的協助下完成。

專案總覽

我們的用途圍繞以下 4 個主要元件:

  • 書籍資料庫:我們將使用網際網路封存書籍的龐大 BigQuery 公開資料集做為完整的書籍目錄。
  • AI 摘要引擎:Google Cloud Functions 搭載 Gemini-Pro 語言模型,可根據使用者要求生成深入的摘要。
  • BigQuery 整合:BigQuery 中的遠端函式,可呼叫我們的 Cloud Function,提供隨選書籍摘要和主題。
  • 使用者介面:託管在 Cloud Run 上的網頁應用程式,可為使用者提供網頁應用程式,方便查看結果。

我們將整個專案實作作業分成 3 個程式碼研究室,而本程式碼研究室涵蓋下列清單中的程式碼研究室 3:

程式碼研究室 1:使用 Gemini 為 Gemini 應用程式建構 Java Cloud Function。

程式碼實驗室 2:使用 Gemini 搭配 BigQuery,建構僅限 SQL 的生成式 AI 應用程式。

程式碼實驗室 3:使用 Gemini 建立可與 BigQuery 互動的 Java Spring Boot 網頁應用程式。

2. 使用 Gemini 建構 Spring Boot 網頁應用程式,並搭配 BigQuery 使用

建構項目

  • 建立必要的 BigQuery 資料集和資料表。
  • Java Spring Boot 網頁應用程式,可與 BigQuery 互動以擷取書籍資料,並顯示在網頁上。
  • 這個應用程式部署在 Cloud Run 上。
  • 您將在 Gemini 的協助下完成這些步驟。

3. 需求條件

建立專案

如果您已啟用帳單帳戶,並使用上述條件步驟中提及的連結建立專案,則可略過下列步驟。

  1. Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案
  2. 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能

啟用 Cloud Shell

  1. 您將使用 Cloud Shell,這是 Google Cloud 中執行的指令列環境,已預先載入 bq

在 Cloud 控制台,按一下右上角的「啟用 Cloud Shell」:

6757b2fb50ddcc2d.png

  1. 連至 Cloud Shell 後,您應該會看到驗證已完成,專案也已設為獲派的專案 ID。在 Cloud Shell 中執行下列指令,確認您已通過驗證:
gcloud auth list
  1. 在 Cloud Shell 中執行下列指令,確認 gcloud 指令已瞭解您的專案
gcloud config list project
  1. 如果未設定專案,請使用下列指令來設定:
gcloud config set project <YOUR_PROJECT_ID>

如要瞭解 gcloud 指令和用法,請參閱說明文件

4. 啟用 Gemini 和必要的 API

啟用 Gemini

  1. 前往 Gemini Marketplace 啟用 API。您也可以使用下列指令:

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

  1. 前往 Gemini 頁面,然後按一下「開始對話」。

啟用其他必要的 API

我們該怎麼做?我們來問問 Gemini 吧!但請先注意以下事項:

注意:LLM 具有非決定性。因此,您嘗試這些提示時,收到的回覆可能與我螢幕截圖中的回覆不同。

在 Google Cloud 控制台的搜尋列旁,按一下右上角的「開啟 Gemini」圖示,前往 Gemini 對話控制台。

26e1491322855614.png

在「在這裡輸入提示」部分輸入以下問題:

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

您會收到如下圖所示的回應:

b97a8a9fa9143b3f.png

複製該指令 (您可以使用指令程式碼片段頂端的複製圖示),並在 Cloud Shell 終端機中執行,以啟用相關服務:

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

5. 探索 BigQuery 書籍資料公開資料集

首先,請熟悉 BigQuery 公開資料集,其中包含大量網際網路檔案館書籍的資訊。如果無法透過這個連結前往 internetarchivebooks 資料集,請按照下列步驟探索資料集,或參閱這份文件

您可以在 BigQuery 探索器窗格中找到這個公開資料集。登陸 BigQuery 控制台後,即可在左側找到這個選項。

39e2ac03cc99cbac.png

在搜尋列中輸入「gdelt-bq」或「internetarchivebooks」,然後按一下「SEARCH ALL PROJECTS」(搜尋所有專案)。在結果中展開並為網際網路檔案館書籍加上星號,如下圖所示:

68dba68a79cddfc9.png

展開資料集,按一下 gdelt-bq.internetarchivebooks,然後預覽 1920 資料表中的資料。這個表格包含 1920 年封存的書籍。

如要查看後續章節中使用的結構定義,請執行下列查詢:

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

在本程式碼研究室中,我們會使用下列三個欄位:

  • BookMeta_Title (title)
  • 主題 (以「;'」分隔主題)
  • BookMeta_FullText (書籍全文)

6. 使用 Gemini 建立基本 Java Cloud Run 範本

點按 Cloud Shell 終端機右上角的「開啟編輯器」圖示,開啟 Cloud Shell 編輯器 (我通常偏好在不同的分頁中並行開啟終端機和編輯器,這樣就能在一個分頁中編寫程式碼,在另一個分頁中建構程式碼)。

edd258384bc74f1f.png

開啟編輯器後,請確認編輯器控制台右下角的 Gemini 標誌已啟用 (而非取消)。此外,請確認左下角的 Google Cloud 專案指向您目前要使用的有效專案。如果這些服務處於非啟用狀態,請點選服務、授權,然後選取要指向的 Google Cloud 專案,並啟用服務。

兩者都啟用後,按一下左下角的專案名稱,然後在開啟的彈出式清單中,向下捲動至「New Application」(新應用程式)。

db998cc557e83f40.png

在該清單中,選取 Cloud Run 應用程式。在彈出式清單中選取 Java:

c7748de85120507b.png

在隨即顯示的清單中,輸入專案名稱「bookshelf-web」,而非 helloworld,然後按一下「確定」。

7c58c764277c571f.png

太棒了!您已使用 Gemini 啟動簡單的 Java Cloud Run 應用程式,除了啟用和啟動設定外,您幾乎沒有做任何事,對吧?

您應該會看到以下專案結構:

e6be37bbee730bd1.png

現在可以部署應用程式。但這並非我們啟動這項計畫的原因。我們仍需納入網頁應用程式的主要功能,也就是從 BigQuery 資料庫擷取 Analytics 資料,並顯示在網頁上。

為此,您可以自由新增更多提示,讓 Gemini 逐步開發程式碼,或自行編寫邏輯。我會參加這兩種活動。

7. 在網頁應用程式中新增依附元件,以便使用 BigQuery

應用程式啟動後,我們就可以開始變更應用程式來源和屬性。首先,請新增依附元件。請 Gemini 推薦。

在 Cloud Code 編輯器中,確認狀態列右下角顯示 Gemini 已啟用,且左下角已選取有效的 Google Cloud 專案。

在 Cloud Code 編輯器中前往 pom.xml 檔案,在 </dependencies> 標記的正上方,輸入下列提示註解:

171d1c40ff8124e8.png

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

我得到這個結果,如下圖所示:

2df51efd655a3557.png

為方便起見,我們在此貼上依附元件。如果系統建議的標記包含版本標記,您可以忽略該標記。

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

8. 更新來源,將書架資料匯入網站

將 HelloWorldController.java 程式碼替換為下列內容:

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;
  }
}

我們對來源檔案進行了下列變更:

  1. HelloWorldController.java 中,將 @Controller 更新為 @RestController。
  2. 取代 helloWorld() 方法的內容,加入對 BigQuery 的呼叫,並執行查詢來擷取資料,列出書籍的書名和主題。
  3. 載入時,系統不會傳回索引檢視範本,而是更新為將回應以字串形式傳回給網頁。

重要事項:請記得更新下列資訊

  1. 更新 HelloWorldControllerTests.Java 檔案,註解掉目前的 mvc.perform(...) 呼叫。

Gemini 程式碼解說

我們已提供程式碼給您,並說明對來源檔案所做的變更。您也可以視需要使用 Gemini 取得程式碼說明和/或程式碼註解。建議您試試以下方法:

  1. 在 IDE 中開啟 HelloWorldController.java 檔案,然後前往 IDE 的「Chat Panel」(對話面板),輸入以下提示:「Explain this」(說明這個)。查看 Gemini 提供的詳細說明。您隨時可以使用這項功能,取得程式碼的說明。
  2. 您可以醒目顯示程式碼中的任何特定程式碼片段或行 (例如 @GetMapping("/") ),然後使用下列提示詞:說明這個。系統只會詳細說明您選取的程式碼行或程式碼片段。
  3. 您甚至可以嘗試以不同方式查詢程式碼。舉例來說,您可以選取下列程式碼行

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

並提出下列查詢:「如果 bigquery 變數為空值,會發生什麼情況?」4. 你也可以在 Gemini 的協助下改良或重構程式碼。舉例來說,您可以選取 helloWorld() 方法的完整程式碼,然後輸入以下提示:「如何改良或重構這段程式碼?」。查看 Gemini 提供的建議。

9. 建構及部署

前往 Cloud Shell 終端機。確認終端機中指向的專案 ID 正確無誤。

4b3392dd050340a3.png

使用 cd 指令進入專案目錄:

cd bookshelf-web

逐一執行下列指令,確保應用程式在本機上執行。

mvn package

mvn spring-boot:run

現在,按一下「Web Preview」按鈕,然後按一下「Preview on port 8080」選項,如下所示:

ea9464498b6bd9df.png

請確認您可以在 Cloud Shell 電腦上看到應用程式在本機執行。

現在,讓我們詢問 Gemini 如何在 Cloud Run 上部署這個網頁應用程式。在 Google Cloud 控制台中,按一下「Open Gemini」按鈕,前往 Gemini Chat。

我的提示如下:

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

回覆內容如下:

6f21c2d59b6dc416.png

請替換 gcloud 指令中的服務名稱和地區預留位置,如下列程式碼片段所示:

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

請從 Cloud Shell 終端機執行這項指令。您應該會看到幾個後續問題,請選取適當的回覆,然後您應該就能看到部署作業正在進行:

66f5d6e00c16a4db.png

這項作業需要幾分鐘,應用程式就會部署到 Google Cloud 無伺服器環境。按一下 Cloud Run 部署的應用程式,並在網頁上查看結果:

fd342d8f16e664ab.png

10. 恭喜

恭喜!我們已成功建構、部署及測試 Java Cloud Run 網頁應用程式,使用 Gemini 執行書架分析。接著,請詢問 Gemini 如何從 Google Cloud 控制台刪除已部署的 Cloud Run 服務,並按照 Gemini 回覆的步驟清理資源。