书架分析:使用 Gemini 通过 BigQuery 和生成式 AI 构建 SQL 应用

1. 简介

您是否喜欢钻研书籍,却困于繁杂的海量图书选择?假设有一款 AI 赋能的应用,它不仅能推荐理想的读物,还会根据您选择的图书类型提供简明摘要,让您快速掌握书本的精髓。在此 Codelab 中,我将逐步介绍如何在 Gemini 的助力下使用 BigQuery、Gemini 和 Cloud Functions 构建此类应用。

项目概览

我们的应用场景围绕以下 4 个关键组件展开:

  • Book Database:这是一个庞大的互联网归档图书 BigQuery 公共数据集,将作为我们全面的图书目录。
  • AI 摘要引擎:Google Cloud Functions 依托 Gemini 1.0 Pro 语言模型,可根据用户请求生成富有洞见的摘要。
  • BigQuery Integration:BigQuery 中的远程函数,可调用 Cloud Functions 函数,以便按需提供图书摘要和主题。
  • User Interface:托管在 Cloud Run 上的 Web 应用,可供用户查看结果。

我们将将实现分为 3 个 Codelab:

Codelab 1:使用 Gemini 为 Gemini 应用构建 Java Cloud Functions 函数。

Codelab 2:使用 Gemini 通过 BigQuery 和生成式 AI 构建 SQL 应用。

Codelab 3:使用 Gemini 创建与 BigQuery 进行交互的 Java Spring Boot Web 应用。

2. 使用 Gemini 通过 BigQuery 和生成式 AI 构建 SQL 应用

构建内容

您需要创建一个

  • BigQuery 中的远程模型,用于调用 Vertex AI text-bison-32k 端点,以便从表格中以“;”分隔的关键字列表中识别图书的类型(或主题)。
  • BigQuery 中的远程函数,用于远程调用已部署的生成式 AI Cloud Functions 函数。
  • 使用远程模型和函数通过 SQL 查询总结图书的主题和文本,并将结果写入书架数据集中的新表。
  • 您将在 Gemini 的帮助下实现这些步骤

3. 要求

  • 一个浏览器,例如 ChromeFirefox
  • 启用了结算功能的 Google Cloud 项目
  • 如果您已在第 1 部分 Codelab 使用 Gemini 构建 Gemini 应用的 Java Cloud Functions 函数中部署 Cloud Functions 函数,将对后续工作很有帮助。
  • 条件:如果您目前可以访问免费 Google Cloud 赠金链接(可能是由研讨会组织者为您预先配置的),请按照下方页面中的说明提前完成激活赠金和创建项目步骤。如果您没有此链接,请继续执行以下项目和结算的预先准备步骤:

创建项目

如果您已激活结算账号并使用上述条件步骤中提及的链接创建了项目,则可以跳过以下步骤。

  1. Google Cloud Console 的项目选择器页面上,选择或创建一个 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. 启用 Google Cloud 专用 Gemini 和必要的 API

启用 Gemini

  1. 前往 Marketplace for Google Cloud 启用该 API。您还可以使用以下命令:

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

  1. 访问 Gemini 页面,然后点击“开始聊天”。

启用其他必要的 API

我们该怎么做呢?让我们来问问 Gemini 吧。但在此之前,请记住:

注意:LLM 具有不确定性。因此,在您尝试提出这些问题时,您收到的回答可能与我的屏幕截图中的回答有所不同。

点击右上角的“打开 Gemini”图标(位于 Google Cloud 控制台搜索栏旁边),前往 Gemini Chat 控制台。

在“在此处输入提示”部分输入以下问题:

如何使用 gcloud 命令启用 BigQuery 和 Vertex AI API?

您会获得如下图所示的回答:

19c3fd78530794d9

复制该命令(您可以使用命令代码段顶部的复制图标),并在 Cloud Shell 终端中运行,以便启用相应服务:

  • bigquery.googleapis.com
  • aiplatform.googleapis.com

5. 探索图书数据的 BigQuery 公共数据集

首先熟悉 BigQuery 公共数据集,其中包含众多互联网归档图书的相关信息。

您可以在 BigQuery Explorer 窗格中找到此公共数据集。进入 BigQuery 控制台后,您可以在左侧找到此工具。

39e2ac03cc99cbac.png

在搜索栏中输入“gdelt-bq”或“internetarchivebooks”,然后点击“搜索所有项目”。展开搜索结果并为 internetarchivebooks 加注星标,如下图所示:

68dba68a79cddfc9.png

展开数据集,点击 gdelt-bq.internetarchivebooks,然后预览 1920 年表格中的数据。此表格包含 1920 年以来归档的图书。

如需查看我们将在后续部分中使用的架构,请运行以下查询:

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

在此 Codelab 中,我们将使用以下三个字段:

  • BookMeta_Title(书名)
  • 主题(用“;”分隔)
  • BookMeta_FullText(图书全文)

6. 创建一个名为 bookshelf 的新 BigQuery 数据集

我们希望在此项目下创建一个数据集,以存储我们将在此实验中创建的所有数据库和分析对象。我们来问问 Gemini 如何创建 BigQuery 数据集。在启用 API 步骤中,您应该已在浏览器的另一个标签页中打开 Gemini 对话。如果没有,您可以立即进行设置。前往 https://console.cloud.google.com 进入 Google Cloud 控制台,您应该会在顶部的搜索栏旁边看到 Gemini 图标。点击该链接,聊天对话就会打开。

26e1491322855614.png

输入提示,如下所示。

我的提示是:

How to create a BigQuery dataset?

响应如下:

f7a989cc9a01009.png

我们将按照回复中列出的步骤,在您的有效项目中创建一个名为“bookshelf”的数据集。

如需创建 BigQuery 数据集,请按以下步骤操作:

  1. 转到 Google Cloud 控制台中的 BigQuery 页面。
  2. 在“探索器”面板中,点击您的项目 ID。
  3. 点击“创建数据集”(点击项目 ID 旁边的三点状图标后,该选项应会显示在列出的选项中)
  4. 输入数据集名称“bookshelf”。
  5. 将位置设置为“US(Multi-region)”。
  6. 对于回答中的第 3、4、5 和 6 步,请保留默认选项。
  7. 点击“创建数据集”。

系统会创建您的数据集,并将其显示在“探索器”面板中。“bookshelf”数据集如下所示:

7. 创建一个远程模型以调用 Vertex AI LLM (text-bison-32k)

接下来,我们需要在 BigQuery 中创建一个会调用“text-bison-32k”Vertex AI 模型的模型。该模型将帮助从数据集中每本图书的关键字列表中确定图书的常见主题和背景。

我们来问问 Gemini 这个问题。为此,请前往打开 Gemini Chat 控制台的标签页,然后输入以下提示:

您将如何连接 BigQuery 和 Vertex AI,以便在 BigQuery 中调用 LLM 端点 (text-bison-32k)?

响应如下所示:

41904e30ce92b436.png

响应包含准确的信息,例如使用 CREATE MODEL 语句、使用 BigQuery 连接和定义端点的步骤。对我来说,查询语句是准确的,但这并不意味着您将获得完全相同的输出,因为这是一个大语言模型,您可能会获得不同格式、数量和深度的响应。如果您没有看到我收到的所有详细信息,请随时通过后续问题深入探讨聊天内容。例如:详细说明如何创建连接资源或为何缺少连接属性,或详细介绍如何从 BigQuery 连接到 Vertex AI 等。

以下是一条跟进提示示例(仅在您需要跟进时使用此提示;如果您收到的第一个回复已足够,请继续使用该回复):

What about the connection? How will I connect from BigQuery to Vertex AI?

响应如下:

2ed9b3ed96b11bc9.png

我们来按照响应中的步骤创建 BigQuery 连接:

  1. 前往 BigQuery 控制台。
  2. 在 BigQuery 浏览器窗格中,点击“+ADD”按钮,然后点击“与外部数据源的连接”。
  3. 此时,系统会要求您启用 BigQuery Connection API。点击“启用 API”:

ded96126495ffe9.png

  1. 点击“与外部数据源的连接”,您应该会看到“外部数据源”幻灯片,如下所示。从外部来源列表中,选择“Vertex AI”来源。

434cdbbb3a9436f2

  1. 输入连接 ID(可以是您选择的 ID,但目前请将其设为“bq-vx”)和区域(多区域“US”)。
  2. 点击“创建关联”。

d3a2aeebc3ecdfae.png

  1. 创建连接后,点击“前往连接”。
  2. 在连接信息页面中,复制服务账号 ID,因为我们将在后续步骤中使用此 ID。
  3. 现在,连接已创建完毕,接下来为我们复制的服务账号 ID 分配权限,以便使用 Vertex AI。
  4. 在 Google Cloud 控制台页面中,打开 Google Cloud IAM 或前往相应链接。
  5. 点击按主账号查看部分下的授予访问权限

5317eed5da0bb8c5

  1. 在“授予访问权限”对话框中的“新原则”文本框中输入我们前面记下的服务账号 ID。
  2. 将角色设置为“Vertex AI User”。

f213db33d220aa5f.png

系统会创建所需的连接。为主账号(连接的服务账号)授予了从 BigQuery 使用 Vertex AI 的必要权限。

在 BigQuery 查询编辑器中,运行以下 DDL(数据定义语言)语句,表示创建数据库对象(在本例中为 MODEL)。

CREATE OR REPLACE MODEL bookshelf.llm_model
  REMOTE WITH CONNECTION `us.bq-vx`
  OPTIONS (ENDPOINT = 'text-bison-32k');

作为上述步骤的替代方案,您可以尝试让 Gemini 提出一个查询建议,用于创建调用“text-bison-32k”模型的模型。

注意:如果您为连接使用了其他名称,请在之前的 DDL 语句中将“us.bq-vx”替换为该名称。此查询将在我们之前创建的数据集“bookshelf”中创建远程模型。

8. 创建用于调用 Java Cloud Functions 函数的远程函数

现在,我们将使用本系列 Codelab 1 中创建的 Java Cloud Functions 函数在 BigQuery 中创建一个远程函数,以实现 Gemini 模型。此远程函数将用于总结图书内容。

注意:如果您错过了此 Codelab 或尚未部署此 Cloud Functions 函数,则可以跳过此步骤并进入下一个主题(即使用远程模型总结图书主题)。

转到 BigQuery 控制台,并将以下 DDL 语句粘贴到查询编辑器中(您可以点击“+”按钮创建新的“查询编辑器”标签页)

a54c0b0014666cac.png

以下是您可以复制的 DDL。请务必将该端点替换为您部署的 Cloud Functions 端点(通过第 1 个 Codelab创建)。如果您没有端点,可以将以下 DDL 中的经过屏蔽处理的字符替换为“abis-345004”,以便演示。

CREATE OR REPLACE FUNCTION
  `bookshelf.GEMINI_REMOTE_CALL` (context STRING) RETURNS STRING
  REMOTE WITH CONNECTION `us.bq-vx`
  OPTIONS (
    endpoint = 'https://us-central1-****-******.cloudfunctions.net/remote-gemini-call'  );

前往 Google Cloud 平台上的 BigQuery 控制台,然后打开新的“查询编辑器”标签页。在 BigQuery 查询编辑器中,粘贴上面的 DDL 语句。运行查询后,您会看到以下响应:

a023d5691acf6f.png

现在,模型和函数已创建完毕,接下来,我们将在 SELECT 查询中运行这两个 BigQuery 对象,以便对其进行测试。

9. 使用远程模型总结主题

我们将使用我们创建的远程模型“bookshelf.llm_model”,根据给定的主题列表为图书生成一个综合关键字:

SELECT * FROM ML.GENERATE_TEXT(MODEL `bookshelf.llm_model`,
(
SELECT
     CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
    FROM `gdelt-bq.internetarchivebooks.1920` LIMIT 1
));

可选步骤:LLM 生成的结果字段的结果是嵌套的。让我们在查询中添加一些 LLM 参数和“flatten_json_output”属性。使用“flatten_json_output”属性有助于从 LLM 生成的结果字段中移除嵌套结构。

SELECT * FROM ML.GENERATE_TEXT ( MODEL `bookshelf.llm_model`, (
 SELECT CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt FROM `gdelt-bq.internetarchivebooks.1920` limit 1),
    STRUCT( 0.2 AS temperature, 100 AS max_output_tokens, TRUE AS flatten_json_output));

现在,在 BigQuery 编辑器中运行 SELECT 查询并验证结果。我们已将查询结果限制为 1 个,以便进行测试。结果如下所示:

9b0d33eca61a73d2.png

10. 使用远程函数总结图书全文

现在,我们将尝试运行之前创建的 bookshelf.GEMINI_REMOTE_CALL Cloud Functions 函数,以总结这本书。

注意:如果您跳过了远程 FUNCTION 创建(此 Codelab 中的上一主题),也请记得跳过 SELECT 查询中的“bookshelf.GEMINI_REMOTE_CALL”函数调用。

使用 SELECT 查询来调用我们之前创建的远程函数 (GEMINI_REMOTE_CALL)。对此函数 GEMINI_REMOTE_CALL 的调用包含一个提示,要求提供图书文本的摘要:

select BookMeta_Title, `bookshelf.GEMINI_REMOTE_CALL` (
  CONCAT('This is about a book. The title of the book is this: ', BookMeta_Title,  ' . The theme of the book is as follows: ', Themes, 'The following text contains an excerpt from the book. Summarize it in less than 5 lines to create the gist. If you do not have a summary, use the title and themes to make up a short summary. DO NOT RETURN EMPTY RESPONSE. ', SUBSTR(BookMeta_FullText, 5000, 10000))) Summary 
  from `gdelt-bq.internetarchivebooks.1920` where Themes like '%EDUCATION%' limit 1;

请注意,我们已获取图书全文的子字符串以生成摘要。

查询结果如下所示:

658bb0a9c9cf0938

11. 将图书数据存储在表中

现在,我们仅使用 SQL 查询测试了来自 BigQuery 的 LLM 调用(远程模型和函数),接下来在远程模型和函数所在的数据集中创建一个 BigQuery 表,用于存储具有主题数据分析的“bookshelf”数据。

实际上,我们可以在此步骤中同时包含 LLM 模型调用和远程函数调用。不过,由于我们已将远程函数调用(用于调用 Cloud Functions 函数)标记为可选步骤,因此我们将仅使用远程模型提供的数据洞见。

以下是我们将使用的查询:

SELECT
  BookMeta_Title, Themes, ml_generate_text_llm_result Context 
   FROM
  ML.GENERATE_TEXT (
    MODEL `bookshelf.llm_model`,
    (
 SELECT
      BookMeta_Title,
      Themes,BookMeta_FullText,
      CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
    FROM `gdelt-bq.internetarchivebooks.1920` limit 5),
    STRUCT(
      0.2 AS temperature,
      100 AS max_output_tokens,
      TRUE AS flatten_json_output));

在 BigQuery 编辑器中运行该查询时,结果如下所示:

2c6e08e75a680867.png

现在,我们让 Gemini 根据上述查询创建一个名为“bookshelf.books”的表。前往 Google Cloud 控制台中的 Gemini 聊天控制台,然后输入以下提示。

我们将使用以下提示:

Create a BigQuery table named bookshelf.books from this SELECT query: 
SELECT
  BookMeta_Title, Themes, ml_generate_text_llm_result Context 
   FROM
  ML.GENERATE_TEXT (
    MODEL `bookshelf.llm_model`,
    (
 SELECT
      BookMeta_Title,
      Themes,BookMeta_FullText,
      CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
    FROM `gdelt-bq.internetarchivebooks.1920` limit 5),
    STRUCT(
      0.2 AS temperature,
      100 AS max_output_tokens,
      TRUE AS flatten_json_output));

Gemini 对话的回答如下:

df6595a4b14f7b9.png

以下是查询,如果您想直接从这里复制,请使用此查询:

CREATE TABLE bookshelf.books (
  BookMeta_Title STRING,
  Themes STRING,
  ml_generate_text_llm_result STRING
) AS (
  SELECT
    BookMeta_Title,
    Themes,
    ml_generate_text_llm_result Context
  FROM
    ML.GENERATE_TEXT (
      MODEL `bookshelf.llm_model`,
      (
        SELECT
          BookMeta_Title,
          Themes,
          BookMeta_FullText,
          CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
        FROM `gdelt-bq.internetarchivebooks.1920`
        LIMIT 5
      ),
      STRUCT(
        0.2 AS temperature,
        100 AS max_output_tokens,
        TRUE AS flatten_json_output
      )
    )
);

在 BigQuery 编辑器中运行查询后,结果如下所示:

2d1ce716f844b7ad

大功告成!现在,您可以查询该表,并处理数据以获得更多数据洞见。

12. 恭喜

恭喜!我们已成功完成以下工作,并在流程的某些步骤中使用了 Gemini:

  • 在 BigQuery 中创建一个远程模型,该模型可调用 Vertex AI“text-bison-32k”端点,从表中以“;”分隔的关键字列表中识别图书的类型(或主题)。
  • 在 BigQuery 中创建了一个远程函数,该函数将远程调用此已部署的生成式 AI Cloud Functions 函数。此函数将提示作为输入,并输出一个字符串,以 5 行形式对图书进行总结。
  • 使用远程模型和函数通过 SQL 查询总结图书的主题和文本,并将结果写入书架数据集中的新表。
  • 作为后续作业,请尝试使用 Gemini 获取用于删除在 BigQuery 中创建的对象的 SQL。本部分将介绍清理步骤。