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 函式來提供隨選書籍摘要和主題。
  • 使用者介面:在 Cloud Run 中託管的網頁應用程式,這個應用程式可為使用者提供查看結果的網頁應用程式。

我們已將整個專案實作分為 3 個程式碼研究室,本程式碼研究室涵蓋以下清單中的程式碼研究室 3:

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

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

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

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

建構項目

  • 建立必要的 BigQuery 資料集和資料表。
  • 與 BigQuery 互動,以擷取書籍資料並在網站上顯示的 Java Spring Boot 網頁應用程式。
  • 這個應用程式已部署至 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 並非確定性,因此,當你嘗試這些提示時,收到的回覆可能會與我的螢幕截圖不同。

前往 Gemini 即時通訊主控台,方法是按一下 Google Cloud 控制台右上角搜尋列旁的「Open 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 Explorer 窗格中找到這個公開資料集。您可以在 BigQuery 控制台的左側找到這項資訊。

39e2ac03cc99cbac.png

在搜尋列中輸入「gdelt-bq」或「internetArchivebooks」,然後按一下 [搜尋所有專案]。展開搜尋結果,並為網際網路封存書籍加上星號,如下圖所示:

68dba68a79cddfc9.png

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

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

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

本程式碼研究室會使用以下三個欄位:

  • BookMeta_Title (書名)
  • 主題 (主題以 ‘;' 分隔)
  • BookMeta_FullText (書籍完整內容)

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

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

edd258384bc74f1f.png

開啟編輯器後,請確認編輯器控制台右下角的 Gemini 標誌處於啟用狀態 (且未取消)。此外,請確認左下角的 Google Cloud 專案指向您要使用的現有專案。如果這些專案處於「未啟用」狀態,請按一下並授權,選取要指向的 Google Cloud 專案,並啟用專案。

兩者都已啟用後,請按一下左下角的專案名稱,然後在隨即顯示的「Cloud Code」彈出式清單中,向下捲動至「New Application」。

db998cc557e83f40.png

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

c7748de85120507b.png

在結果清單中,輸入專案名稱「bookshelf-web」(不要輸入 helloworld),然後按一下「OK」。

7c58c764277c571f.png

太棒了!您已使用 Gemini 啟動簡單的 Java Cloud Run 應用程式,除了啟用和啟動設定之外,您並未執行其他操作,對嗎?

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

e6be37bbee730bd1.png

您現在可以部署應用程式了。但這並不是我們推出這項功能的原因。我們仍需納入網頁應用程式的主要功能,也就是從 BigQuery 資料庫擷取分析資料,並在網頁上顯示。

如要這麼做,您可以自由新增更多提示,並透過 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 面板,並提供下列提示:Explain this。請參閱 Gemini 提供的詳細說明。您隨時可以使用這項功能,取得程式碼的說明。
  2. 您可以醒目顯示程式碼中的任何特定程式碼片段或行 (例如 @GetMapping("/")),然後使用以下提示:解釋這個。這項功能只會針對您選取的程式碼行或程式碼片段提供詳細說明。
  3. 您甚至可以嘗試使用其他方式查詢代碼。例如,您可以選取下列程式碼行

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

並提出以下查詢:「如果 BigQuery 變數為空值,會發生什麼情況?」4. 您也可以請 Gemini 協助改善或重構程式碼。例如,您可以選取 helloWorld() 方法的整段程式碼,並提供以下提示:「如何改善或重構這段程式碼?」查看 Gemini 提供的建議。

9. 建構及部署

前往 Cloud Shell 的「Terminal」。確認該指令在終端機中指向專案 ID。

4b3392dd050340a3.png

使用 cd 指令前往專案目錄:

cd bookshelf-web

依序執行下列指令,確認應用程式是否在本機執行。

mvn package

mvn spring-boot:run

現在,按一下 [網頁預覽] 按鈕,然後按一下 [透過以下通訊埠預覽:8080] 選項,如下所示:

ea9464498b6bd9df.png

確認您可以在 Cloud Shell 機器本機上執行應用程式。

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

這是我的提示:

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 服務,並按照回覆步驟操作,清理資源。