Bookshelf 數據分析:透過 BigQuery 和生成式 AI 運用 Gemini 建構 SQL 應用程式

1. 簡介

你喜歡閱讀書籍,但在眾多選擇中感到不知所措嗎?假設有一款採用 AI 技術的應用程式,不僅會推薦完美的讀物,還會根據所選類型提供簡明摘要,讓您一窺書籍的精髓。在本程式碼研究室中,我將逐步說明如何使用 BigQuery、Gemini 和 Gemini 支援的 Cloud Functions 建構這類應用程式。

專案總覽

我們的用途主要圍繞以下 4 個主要元件:

  • 書籍資料庫:龐大的 BigQuery 公開資料集內含網際網路封存書籍,做為我們完整的書籍目錄。
  • AI 摘要引擎:Google Cloud Functions 搭載 Gemini 1.0 Pro 語言模型,可依據使用者要求生成深入分析摘要。
  • BigQuery 整合:BigQuery 中的遠端函式,可呼叫 Cloud 函式來提供隨選書籍摘要和主題。
  • 使用者介面:在 Cloud Run 上託管的網頁應用程式,可提供網頁應用程式供使用者查看結果。

我們會將實作項目分成 3 個程式碼研究室:

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

程式碼研究室 2:運用 Gemini 搭配 BigQuery 和生成式 AI 建構 SQL 應用程式。

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

2. 使用 Gemini 搭配 BigQuery 和生成式 AI 建構 SQL 應用程式

建構項目

您將建立

  • BigQuery 中的遠端模型,可叫用 Vertex AI text-bison-32k 端點,從表格中以「"」分隔的關鍵字清單,找出書籍的類型 (或主題)。
  • BigQuery 中的遠端函式,可從遠端叫用已部署的生成式 AI Cloud 函式。
  • 使用遠端模型和函式,透過 SQL 查詢總結書籍主題和文字,並將結果寫入 Bookshelf 資料集的新資料表。
  • 您將透過 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 for Google Cloud 和必要的 API

啟用 Gemini

  1. 前往 Gemini for Google Cloud Marketplace 啟用 API。您也可以使用下列指令:

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

  1. 前往 Gemini 頁面,然後點選「開始對話」。

啟用其他必要的 API

我們該怎麼做?我們來問問 Gemini 吧。但在開始之前,請記住:

注意:LLM 是非決定性的。因此嘗試這些提示時,你收到的回覆可能會與螢幕截圖中的回應不同。

前往 Gemini 即時通訊主控台,方法是按一下 Google Cloud 控制台右上角搜尋列旁的「Open Gemini」圖示。

在「請輸入提示」部分輸入以下問題:

如何使用 gcloud 指令啟用 BigQuery 和 Vertex AI API?

您會收到回應,如下圖所示:

19c3fd78530794d9.png

複製該指令 (您可以使用指令片段頂端的複製圖示),然後在 Cloud Shell 終端機中執行,啟用相應服務:

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

5. 探索 BigQuery 公開資料集的書籍資料

首先,請熟悉 BigQuery 公開資料集,其中包含許多 網路檔案書籍的相關資訊。

您可以在 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. 建立名為「bookshelf」的新 BigQuery 資料集

我們想在專案下建立資料集,儲存要在本研究室中建立的所有資料庫和數據分析物件。我們來詢問 Gemini 如何建立 BigQuery 資料集。您應該已經在瀏覽器的另一個分頁中開啟 Gemini 即時通訊功能,並完成啟用 API 的步驟。如果尚未加入,請立即加入。前往 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. 在「Explorer」面板中,按一下專案 ID。
  3. 按一下「建立資料集」(點選專案 ID 旁的 3 點圖示時,這個選項應會列在清單中)
  4. 輸入資料集名稱「bookshelf」。
  5. 將位置設為「美國(多區域)」。
  6. 針對回應中的步驟 3、4、5 和 6,請保留預設選項。
  7. 點選「建立資料集」。

系統會建立資料集,並顯示在「Explorer」面板中。「bookshelf」資料集如下所示:

7. 建立遠端模型來叫用 Vertex AI 大型語言模型 (text-bison-32k)

接著,我們需要在 BigQuery 中建立叫用「text-bison-32k」Vertex AI 模型的模型。模型會從資料集中每本書的關鍵字清單中,找出書籍的共同主題和背景資訊。

我們來問問 Gemini 這個問題。如要這麼做,請前往開啟 Gemini 即時通訊主控台的分頁,然後輸入以下提示:

您要如何連結 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 多層檢視」窗格中,按一下「+ 新增」按鈕,然後點選「外部資料來源連線」。
  3. 此時系統會要求您啟用 BigQuery Connection API。按一下「啟用 API」:

ded96126495ffe9.png

  1. 按一下「與外部資料來源的連線」,畫面上應該會顯示「外部資料來源」投影片,如下所示 。在外部來源清單中,選取「Vertex AI」來源。

434cdbbb3a9436f2.png

  1. 輸入連線 ID (可以是您選擇的 ID,但目前請將其設為「bq-vx」) 和區域 (多區域「US」)。
  2. 按一下「建立連線」。

d3a2aeebc3ecdfae.png

  1. 建立連線後,按一下「前往連線」。
  2. 在連線資訊頁面中,複製服務帳戶 ID,因為我們會在後續步驟中使用這個 ID。
  3. 連線建立完成後,請為我們複製的服務帳戶 ID 指派權限,以便使用 Vertex AI。
  4. 在 Google Cloud 控制台頁面中開啟 Google Cloud IAM,或前往連結。
  5. 按一下「View by Principals」部分下方的「Grant Access」

5317eed5da0bb8c5.png

  1. 在「Grant Access」對話方塊中,在「New principals」文字方塊中輸入先前記下的服務帳戶 ID。
  2. 將角色設為「Vertex AI 使用者」。

f213db33d220aa5f.png

系統會建立必要的連線。授予必要權限,讓實體 (連線的服務帳戶) 能夠透過 BigQuery 使用 Vertex AI。

執行下列 DDL (資料定義語言) 陳述式,表示建立資料庫物件 (在本例中為 BigQuery 查詢編輯器中的 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」替換為該名稱。這項查詢會在先前建立的「書架」資料集中建立遠端模型。

8. 建立可叫用 Java Cloud 函式的遠端函式

我們現在將使用本系列程式碼研究室 1 中建立的 Java Cloud Function,在 BigQuery 中建立遠端函式,以便實作 Gemini 模型。這個遠端函式將用於摘要書籍內容。

注意:如果您錯過這個 程式碼研究室,或是尚未部署這個 Cloud Function,可以略過這個步驟,直接前往下一主題 (使用遠端模型總結書籍主題)。

前往 BigQuery 控制台,並將下列 DDL 陳述式貼到查詢編輯器 (按一下「+」按鈕即可建立新的查詢編輯器分頁)

a54c0b0014666cac.png

以下是您可以複製的 DDL。請記得將端點替換為已部署的 Cloud Function 端點 (透過 codelab 1 建立)。如果沒有端點,您可以將下方 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. 使用遠端模型產生主題摘要

讓我們使用我們建立的遠端模型「書架.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 函式,以便為書籍製作摘要。

注意:如果您略過遠端函式建立作業 (本程式碼研究室中先前的主題),請務必也略過 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.png

11. 將書籍資料儲存在資料表中

我們現在只使用 SQL 查詢測試了 BigQuery 的 LLM 呼叫 (遠端模型和函式),現在讓我們建立 BigQuery 資料表,在遠端模型和函式相同的資料集中,儲存含有主題洞察的「擁有主題洞察」的資料。

我們其實可以在這步驟中同時加入 LLM 模型呼叫和遠端函式呼叫。不過,由於我們已將遠端函式呼叫 (會叫用 Cloud Function) 標示為選用步驟,因此我們只會使用遠端模型的深入分析資料。

以下是我們要使用的查詢:

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 根據上述查詢,建立名為「書架.books」的資料表。前往 Google Cloud Console 中的 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.png

大功告成!您現在可以查詢資料表,並試著運用資料來取得更多洞察資料。

12. 恭喜

恭喜!我們已成功完成以下工作,並在過程中的部分步驟中使用 Gemini:

  • 在 BigQuery 中建立遠端模型,用於叫用 Vertex AI「text-bison-32k」端點,從表格中以「"」分隔的關鍵字清單中,找出書籍的類型 (或主題)。
  • 在 BigQuery 中建立遠端函式,以便遠端叫用這個已部署的生成式 AI Cloud 函式。這個函式會將提示做為輸入內容,並輸出字串,以 5 行概述書籍。
  • 使用遠端模型和函式,透過 SQL 查詢摘要書籍的主題和內容,並將結果寫入書架資料集的新資料表。
  • 後續作業,可以使用 Gemini 取得 SQL,以便刪除在 BigQuery 中建立的物件。這會涵蓋清理步驟。