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. 需求條件
- Chrome 或 Firefox 等瀏覽器
- 已啟用計費功能的 Google Cloud 專案
- 建議您在第 1 部分的程式碼研究室使用 Gemini 為生成式 AI 應用程式建構 Java Cloud Function程式碼研究室中,部署 Cloud Function。
- 條件:如果您目前可以使用免費的 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 並非確定性,因此,當你嘗試這些提示時,收到的回覆可能會與我的螢幕截圖不同。
前往 Gemini 即時通訊主控台,方法是按一下 Google Cloud 控制台右上角搜尋列旁的「Open 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 Explorer 窗格中找到這個公開資料集。您可以在 BigQuery 控制台的左側找到這項資訊。
在搜尋列中輸入「gdelt-bq」或「internetArchivebooks」,然後按一下 [搜尋所有專案]。展開搜尋結果,並為網際網路封存書籍加上星號,如下圖所示:
。
展開資料集,按一下 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 編輯器 (我通常會在不同的分頁中同時開啟終端機和編輯器,這樣就能在一個分頁中編寫程式碼,並在另一個分頁中進行建構)。
開啟編輯器後,請確認編輯器控制台右下角的 Gemini 標誌處於啟用狀態 (且未取消)。此外,請確認左下角的 Google Cloud 專案指向您要使用的現有專案。如果這些專案處於「未啟用」狀態,請按一下並授權,選取要指向的 Google Cloud 專案,並啟用專案。
兩者都已啟用後,請按一下左下角的專案名稱,然後在隨即顯示的「Cloud Code」彈出式清單中,向下捲動至「New Application」。
在清單中選取 Cloud Run 應用程式。在彈出式清單中選取 Java:
在結果清單中,輸入專案名稱「bookshelf-web」(不要輸入 helloworld),然後按一下「OK」。
太棒了!您已使用 Gemini 啟動簡單的 Java Cloud Run 應用程式,除了啟用和啟動設定之外,您並未執行其他操作,對嗎?
您應該會看到以下專案結構:
您現在可以部署應用程式了。但這並不是我們推出這項功能的原因。我們仍需納入網頁應用程式的主要功能,也就是從 BigQuery 資料庫擷取分析資料,並在網頁上顯示。
如要這麼做,您可以自由新增更多提示,並透過 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 面板,並提供下列提示:Explain this。請參閱 Gemini 提供的詳細說明。您隨時可以使用這項功能,取得程式碼的說明。
- 您可以醒目顯示程式碼中的任何特定程式碼片段或行 (例如 @GetMapping("/")),然後使用以下提示:解釋這個。這項功能只會針對您選取的程式碼行或程式碼片段提供詳細說明。
- 您甚至可以嘗試使用其他方式查詢代碼。例如,您可以選取下列程式碼行
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
並提出以下查詢:「如果 BigQuery 變數為空值,會發生什麼情況?」4. 您也可以請 Gemini 協助改善或重構程式碼。例如,您可以選取 helloWorld() 方法的整段程式碼,並提供以下提示:「如何改善或重構這段程式碼?」查看 Gemini 提供的建議。
9. 建構及部署
前往 Cloud Shell 的「Terminal」。確認該指令在終端機中指向專案 ID。
使用 cd 指令前往專案目錄:
cd bookshelf-web
依序執行下列指令,確認應用程式是否在本機執行。
mvn package
mvn spring-boot:run
現在,按一下 [網頁預覽] 按鈕,然後按一下 [透過以下通訊埠預覽:8080] 選項,如下所示:
確認您可以在 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?
以下是回應:
讓我們在 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 服務,並按照回覆步驟操作,清理資源。