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. 需求條件
- Chrome 或 Firefox 瀏覽器
- 已啟用計費功能的 Google Cloud 專案
- 如果您已部署 Cloud Function,這對您很有幫助。這項部署作業是 使用 Gemini 建構生成式 AI 應用程式的 Java Cloud Function 程式碼實驗室第 1 部分的一部分。
- 視情況:如果此時您有權存取免費的 Google Cloud 抵免額連結 (可能由研討會主辦單位提供),請先按照下方頁面的操作說明完成「啟用抵免額和建立專案」步驟。如果沒有這個連結,請繼續執行下列專案和帳單先決條件步驟:
建立專案
如果您已啟用帳單帳戶,並使用上述條件步驟中提及的連結建立專案,則可略過下列步驟。
- 在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案。
- 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能。
啟用 Cloud Shell
- 您將使用 Cloud Shell,這是 Google Cloud 中執行的指令列環境,已預先載入 bq:
在 Cloud 控制台,按一下右上角的「啟用 Cloud Shell」:

- 連至 Cloud Shell 後,您應該會看到驗證已完成,專案也已設為獲派的專案 ID。在 Cloud Shell 中執行下列指令,確認您已通過驗證:
gcloud auth list
- 在 Cloud Shell 中執行下列指令,確認 gcloud 指令已瞭解您的專案
gcloud config list project
- 如果未設定專案,請使用下列指令來設定:
gcloud config set project <YOUR_PROJECT_ID>
如要瞭解 gcloud 指令和用法,請參閱說明文件。
4. 啟用 Gemini 和必要的 API
啟用 Gemini
- 前往 Gemini Marketplace 啟用 API。您也可以使用下列指令:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- 前往 Gemini 頁面,然後按一下「開始對話」。
啟用其他必要的 API
我們該怎麼做?我們來問問 Gemini 吧!但請先注意以下事項:
注意:LLM 具有非決定性。因此,您嘗試這些提示時,收到的回覆可能與我螢幕截圖中的回覆不同。
在 Google Cloud 控制台的搜尋列旁,按一下右上角的「開啟 Gemini」圖示,前往 Gemini 對話控制台。

在「在這裡輸入提示」部分輸入以下問題:
How do I enable the BigQuery and Cloud Run apis using gcloud command?
您會收到如下圖所示的回應:

複製該指令 (您可以使用指令程式碼片段頂端的複製圖示),並在 Cloud Shell 終端機中執行,以啟用相關服務:
- bigquery.googleapis.com
- run.googleapis.com
5. 探索 BigQuery 書籍資料公開資料集
首先,請熟悉 BigQuery 公開資料集,其中包含大量網際網路檔案館書籍的資訊。如果無法透過這個連結前往 internetarchivebooks 資料集,請按照下列步驟探索資料集,或參閱這份文件:
您可以在 BigQuery 探索器窗格中找到這個公開資料集。登陸 BigQuery 控制台後,即可在左側找到這個選項。

在搜尋列中輸入「gdelt-bq」或「internetarchivebooks」,然後按一下「SEARCH ALL PROJECTS」(搜尋所有專案)。在結果中展開並為網際網路檔案館書籍加上星號,如下圖所示:
。
展開資料集,按一下 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 編輯器 (我通常偏好在不同的分頁中並行開啟終端機和編輯器,這樣就能在一個分頁中編寫程式碼,在另一個分頁中建構程式碼)。

開啟編輯器後,請確認編輯器控制台右下角的 Gemini 標誌已啟用 (而非取消)。此外,請確認左下角的 Google Cloud 專案指向您目前要使用的有效專案。如果這些服務處於非啟用狀態,請點選服務、授權,然後選取要指向的 Google Cloud 專案,並啟用服務。
兩者都啟用後,按一下左下角的專案名稱,然後在開啟的彈出式清單中,向下捲動至「New Application」(新應用程式)。

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

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

太棒了!您已使用 Gemini 啟動簡單的 Java Cloud Run 應用程式,除了啟用和啟動設定外,您幾乎沒有做任何事,對吧?
您應該會看到以下專案結構:

現在可以部署應用程式。但這並非我們啟動這項計畫的原因。我們仍需納入網頁應用程式的主要功能,也就是從 BigQuery 資料庫擷取 Analytics 資料,並顯示在網頁上。
為此,您可以自由新增更多提示,讓 Gemini 逐步開發程式碼,或自行編寫邏輯。我會參加這兩種活動。
7. 在網頁應用程式中新增依附元件,以便使用 BigQuery
應用程式啟動後,我們就可以開始變更應用程式來源和屬性。首先,請新增依附元件。請 Gemini 推薦。
在 Cloud Code 編輯器中,確認狀態列右下角顯示 Gemini 已啟用,且左下角已選取有效的 Google Cloud 專案。
在 Cloud Code 編輯器中前往 pom.xml 檔案,在 </dependencies> 標記的正上方,輸入下列提示註解:

<!-- What maven dependency should I include to access BigQuery in the app-->
我得到這個結果,如下圖所示:

為方便起見,我們在此貼上依附元件。如果系統建議的標記包含版本標記,您可以忽略該標記。
<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;
}
}
我們對來源檔案進行了下列變更:
- 在 HelloWorldController.java 中,將 @Controller 更新為 @RestController。
- 取代 helloWorld() 方法的內容,加入對 BigQuery 的呼叫,並執行查詢來擷取資料,列出書籍的書名和主題。
- 載入時,系統不會傳回索引檢視範本,而是更新為將回應以字串形式傳回給網頁。
重要事項:請記得更新下列資訊
- 更新 HelloWorldControllerTests.Java 檔案,註解掉目前的 mvc.perform(...) 呼叫。
Gemini 程式碼解說
我們已提供程式碼給您,並說明對來源檔案所做的變更。您也可以視需要使用 Gemini 取得程式碼說明和/或程式碼註解。建議您試試以下方法:
- 在 IDE 中開啟 HelloWorldController.java 檔案,然後前往 IDE 的「Chat Panel」(對話面板),輸入以下提示:「Explain this」(說明這個)。查看 Gemini 提供的詳細說明。您隨時可以使用這項功能,取得程式碼的說明。
- 您可以醒目顯示程式碼中的任何特定程式碼片段或行 (例如 @GetMapping("/") ),然後使用下列提示詞:說明這個。系統只會詳細說明您選取的程式碼行或程式碼片段。
- 您甚至可以嘗試以不同方式查詢程式碼。舉例來說,您可以選取下列程式碼行
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
並提出下列查詢:「如果 bigquery 變數為空值,會發生什麼情況?」4. 你也可以在 Gemini 的協助下改良或重構程式碼。舉例來說,您可以選取 helloWorld() 方法的完整程式碼,然後輸入以下提示:「如何改良或重構這段程式碼?」。查看 Gemini 提供的建議。
9. 建構及部署
前往 Cloud Shell 終端機。確認終端機中指向的專案 ID 正確無誤。

使用 cd 指令進入專案目錄:
cd bookshelf-web
逐一執行下列指令,確保應用程式在本機上執行。
mvn package
mvn spring-boot:run
現在,按一下「Web Preview」按鈕,然後按一下「Preview on port 8080」選項,如下所示:

請確認您可以在 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?
回覆內容如下:

請替換 gcloud 指令中的服務名稱和地區預留位置,如下列程式碼片段所示:
gcloud run deploy bookshelf-web --source . --allow-unauthenticated --region $REGION
請從 Cloud Shell 終端機執行這項指令。您應該會看到幾個後續問題,請選取適當的回覆,然後您應該就能看到部署作業正在進行:

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

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