1. 简介
您是否喜欢钻研书籍,却困于繁杂的海量图书选择?假设有一款 AI 赋能的应用,它不仅能推荐理想的读物,还会根据您选择的图书类型提供简明摘要,让您快速掌握书本的精髓。在此 Codelab 中,我将逐步介绍如何在 Gemini 的辅助下使用 BigQuery、Vertex AI 和 Cloud Run 构建此类应用。
项目概览
我们的应用场景围绕以下 4 个关键组件展开:
- Book Database:这是一个庞大的互联网归档图书 BigQuery 公共数据集,将作为全面的图书目录。
- AI Summarization Engine:这是一个 Google Cloud Functions 函数,配有 Gemini-Pro 语言模型,可根据用户请求生成富有见地的图书摘要。
- BigQuery Integration:BigQuery 中的远程函数,可调用 Cloud Functions 函数,以便按需提供图书摘要和主题。
- User Interface:托管在 Cloud Run 上的 Web 应用,可供用户查看结果。
我们已将整个项目的实现代码分为 3 个 Codelab,此 Codelab 属于以下列表中的第 3 个 Codelab:
Codelab 1:使用 Gemini 为 Gemini 应用构建 Java Cloud Functions 函数。
Codelab 2:使用 Gemini 通过 BigQuery 构建仅限 SQL 的生成式 AI 应用。
Codelab 3:使用 Gemini 创建与 BigQuery 进行交互的 Java Spring Boot Web 应用。
2. 使用 Gemini 通过 BigQuery 构建 Spring Boot Web 应用
构建内容
- 创建必要的 BigQuery 数据集和表。
- Java Spring Boot Web 应用,可与 BigQuery 交互以提取图书数据并在网页上显示。
- 此应用部署在 Cloud Run 上。
- 您将在 Gemini 的帮助下实现这些步骤。
3. 要求
- 一个浏览器,例如 Chrome 或 Firefox
- 启用了结算功能的 Google Cloud 项目
- 如果您已在第 1 部分 Codelab 使用 Gemini 构建生成式 AI 应用的 Java Cloud Functions 函数中部署 Cloud Functions 函数,将对后续工作很有帮助。
- 条件:如果您目前可以访问免费 Google Cloud 赠金链接(可能是由研讨会组织者为您预先配置的),请按照下方页面中的说明提前完成激活赠金和创建项目步骤。如果您没有此链接,请继续执行以下项目和结算的预先准备步骤:
创建项目
如果您已激活结算账号并使用上述条件步骤中提及的链接创建了项目,则可以跳过以下步骤。
- 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 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 控制台搜索栏旁边),前往 Gemini Chat 控制台。
在“在此处输入提示”部分输入以下问题:
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”,然后点击“搜索所有项目”。展开搜索结果并为 internetarchivebooks 加注星标,如下图所示:
。
展开数据集,点击 gdelt-bq.internetarchivebooks,然后预览 1920 年表格中的数据。此表格包含 1920 年以来归档的图书。
如需查看我们将在后续部分中使用的架构,请运行以下查询:
select * from `gdelt-bq.internetarchivebooks.1920` limit 5;
在此 Codelab 中,我们将使用以下三个字段:
- BookMeta_Title(书名)
- 主题(用“;”分隔)
- BookMeta_FullText(图书全文)
6. 使用 Gemini 创建基本的 Java Cloud Run 模板
点击 Cloud Shell 终端右上角的“打开编辑器”图标,打开 Cloud Shell 编辑器(我通常更喜欢在单独的标签页中并行打开终端和编辑器,以便在一个标签页中编写代码,在另一个标签页中构建)。
打开编辑器后,确保编辑器控制台右下角的 Gemini 徽标处于有效状态(而非取消状态)。此外,确保左下角的 Google Cloud 项目指向您当前想要处理的有效项目。如果它们处于无效状态,请点击进行授权,选择您要指向的 Google Cloud 项目并将其激活。
两者都处于有效状态后,点击左下角的项目名称,在随即打开的名为“Cloud Code”的弹出式列表中向下滚动到“新应用”。
在该列表中,选择“Cloud Run 应用”。从弹出的列表中选择“Java”:
在结果列表中,输入项目名称“bookshelf-web”而不是“helloworld”,然后点击“确定”。
太棒了!您已在简单的 Java Cloud Run 应用中启用 Gemini 引导功能,除了启用和激活配置之外,您并没进行太多操作,对吧?
您应该会看到以下项目结构:
现在,您就可以部署应用了。但这并非我们开始这项工作的原因。我们仍然需要包含 Web 应用的主要功能,即从 BigQuery 数据库获取分析数据并将其显示在网页上。
为此,您可以添加更多提示,并使用 Gemini 逐步开发代码,也可以自行编写逻辑。我会同时采用这两种方法。
7. 添加依赖项以便在 Web 应用中使用 BigQuery
现在应用已引导完毕,我们可以更改应用源代码和属性了。首先,我们要添加依赖项。让 Gemini 推荐一下吧。
在 Cloud Code 编辑器中,确保右下角的状态栏显示 Gemini 已启用,并确保已在左下角选中正在运行的 Google Cloud 项目。
在 Cloud Code 编辑器中,找到 </dependencies> 标记正上方的 pom.xml 文件,然后输入以下提示作为注释:
<!-- 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 中的聊天面板,并提供以下提示:Explain this。请查看 Gemini 提供的详细说明。您可以随时用它获取代码的说明。
- 您可以突出显示代码中的任何特定代码段或行(例如 @GetMapping("/")),然后使用以下提示:Explain this。这样将仅对您选择的代码行或代码段提供详细说明。
- 您甚至可以尝试不同形式的查询来咨询代码信息。例如,您可以选择以下代码行
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
并进行以下查询:如果 BigQuery 变量为 null,会发生什么?4. 您也可以在 Gemini 的帮助下要求改进或重构代码。例如,您可以选择 helloWorld() 方法的整个代码,然后给出以下提示:如何改进或重构此代码?请查看 Gemini 提供的建议。
9. 构建和部署
打开 Cloud Shell 终端。确保终端指向您的项目 ID。
使用 cd 命令导航到项目目录:
cd bookshelf-web
请逐个运行以下命令,确保您的应用在本地运行。
mvn package
mvn spring-boot:run
现在,点击“网页预览”按钮,然后点击“在端口 8080 上预览”选项,如下所示:
确保您可以看到应用在 Cloud Shell 机器上本地运行。
现在,我们来问问 Gemini 如何在 Cloud Run 上部署此 Web 应用。点击 Google Cloud 控制台中的“打开 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 Web 应用,该应用可使用 Gemini 进行书架分析。后续任务是询问 Gemini 如何从 Google Cloud 控制台中删除已部署的 Cloud Run 服务,并按照其回答给出的步骤清理资源。