使用 AI.GENERATE_TABLE 函式產生結構化資料

本文件說明如何使用 Gemini 模型產生結構化資料,然後使用 SQL 結構定義格式化模型的回應。

如要這樣做,請完成下列工作:

所需權限

  • 如要建立連結,您必須具備下列身分與存取權管理 (IAM) 角色的成員資格:

    • roles/bigquery.connectionAdmin
  • 如要將權限授予連線的服務帳戶,您必須具備下列權限:

    • resourcemanager.projects.setIamPolicy
  • 如要使用 BigQuery ML 建立模型,您需要具備下列 IAM 權限:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata
  • 如要執行推論,您需要具備下列權限:

    • bigquery.tables.getData 在桌上
    • 模型的 bigquery.models.getData
    • bigquery.jobs.create

事前準備

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

建立資料集

建立 BigQuery 資料集來容納資源:

控制台

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」頁面

  2. 在「Explorer」窗格中,按一下專案名稱。

  3. 依序點選 「View actions」(查看動作) >「Create dataset」(建立資料集)

  4. 在「Create dataset」頁面上執行下列操作:

    • 在「Dataset ID」(資料集 ID) 部分,輸入資料集名稱。

    • 在「位置類型」中,選取資料集的位置。

    • 點選「建立資料集」

bq

  1. 如要建立新的資料集,請使用 bq mk 指令搭配 --location 標記:

    bq --location=LOCATION mk -d DATASET_ID

    更改下列內容:

    • LOCATION:資料集的位置
    • DATASET_ID 是您要建立的資料集 ID。
  2. 確認資料集已建立:

    bq ls

建立連線

如果您已設定具備適當權限的預設連線,可以略過這個步驟。

為遠端模型建立Cloud 資源連線,並取得連線的服務帳戶。請在與您在上一個步驟中建立的資料集相同的位置建立連線。

選取下列選項之一:

主控台

  1. 前往「BigQuery」頁面

    前往 BigQuery

  2. 在「Explorer」窗格中,按一下 「新增資料」

    「新增資料」UI 元素。

    「Add data」對話方塊隨即開啟。

  3. 在「Filter By」窗格中的「Data Source Type」部分,選取「Business Applications」

    或者,您也可以在「Search for data sources」欄位中輸入 Vertex AI

  4. 在「精選資料來源」部分,按一下「Vertex AI」

  5. 按一下「Vertex AI 模型:BigQuery 聯盟」解決方案資訊卡。

  6. 在「連線類型」清單中,選取「Vertex AI 遠端模型、遠端函式和 BigLake (Cloud 資源)」

  7. 在「連線 ID」欄位中,輸入連線的名稱。

  8. 點選「建立連線」

  9. 按一下「前往連線」

  10. 在「連線資訊」窗格中,複製服務帳戶 ID,以便在後續步驟中使用。

bq

  1. 在指令列環境中建立連線:

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID

    --project_id 參數會覆寫預設專案。

    更改下列內容:

    • REGION:您的連線區域
    • PROJECT_ID:您的 Google Cloud 專案 ID
    • CONNECTION_ID:連線 ID

    建立連線資源時,BigQuery 會建立專屬的系統服務帳戶,並將該帳戶與連線建立關聯。

    疑難排解:如果您收到下列連線錯誤,請更新 Google Cloud SDK

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. 擷取並複製服務帳戶 ID,以便在後續步驟中使用:

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID

    輸出結果會與下列內容相似:

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

使用 google_bigquery_connection 資源。

如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。

以下範例會在 US 地區中建立名為 my_cloud_resource_connection 的 Cloud 資源連線:


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節中的步驟。

準備 Cloud Shell

  1. 啟動 Cloud Shell
  2. 設定要套用 Terraform 設定的預設 Google Cloud 專案。

    您只需為每個專案執行這個指令一次,而且可以在任何目錄中執行。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 設定檔中設定明確的值,系統就會覆寫環境變數。

準備目錄

每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。

  1. Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱必須包含 .tf 副檔名,例如 main.tf。在本教學課程中,檔案稱為 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您正在參考教學課程,可以複製各個章節或步驟中的程式碼範例。

    將範例程式碼複製到新建立的 main.tf 中。

    您可以視需要從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您採用這種做法。

  3. 查看並修改要套用至環境的範例參數。
  4. 儲存變更。
  5. 初始化 Terraform。這項操作只需對每個目錄執行一次。
    terraform init

    如要使用最新版的 Google 供應器,您可以選擇加入 -upgrade 選項:

    terraform init -upgrade

套用變更

  1. 檢查設定,確認 Terraform 要建立或更新的資源符合您的預期:
    terraform plan

    視需要修正設定。

  2. 執行下列指令,並在提示中輸入 yes,即可套用 Terraform 設定:
    terraform apply

    等待 Terraform 顯示「Apply complete!」(套用完成) 訊息。

  3. 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。

授予服務帳戶存取權

為連線的服務帳戶授予 Vertex AI 使用者角色。

如果您打算在建立遠端模型時,將端點指定為網址 (例如 endpoint = 'https://us-central1-aiplatform.googleapis.com/v1/projects/myproject/locations/us-central1/publishers/google/models/gemini-1.5-flash'),請在網址中指定的專案中授予這個角色。

如果您打算在建立遠端模型時,使用模型名稱指定端點 (例如 endpoint = 'gemini-1.5-flash'),請在您打算建立遠端模型的專案中授予這個角色。

在其他專案中授予角色會導致 bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource 錯誤。

如要授予角色,請按照下列步驟操作:

主控台

  1. 前往「IAM & Admin」(IAM 與管理) 頁面。

    前往「IAM & Admin」(IAM 與管理)

  2. 按一下 「新增」

    系統會開啟「Add principals」對話方塊。

  3. 在「新增主體」欄位,輸入先前複製的服務帳戶 ID。

  4. 在「請選擇角色」欄位中,依序選取「Vertex AI」和「Vertex AI 使用者」

  5. 按一下 [儲存]

gcloud

使用 gcloud projects add-iam-policy-binding 指令

gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None

請依指示取代下列項目:

  • PROJECT_NUMBER:您的專案編號
  • MEMBER:先前複製的服務帳戶 ID

建立 BigQuery ML 遠端模型

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 使用 SQL 編輯器建立遠端模型

    CREATE OR REPLACE MODEL
    `PROJECT_ID.DATASET_ID.MODEL_NAME`
    REMOTE WITH CONNECTION {DEFAULT | `PROJECT_ID.REGION.CONNECTION_ID`}
    OPTIONS (ENDPOINT = 'ENDPOINT');

    請依指示取代下列項目:

    • PROJECT_ID:您的專案 ID
    • DATASET_ID:包含模型的資料集 ID。這個資料集必須位於與您使用的連線相同的位置
    • MODEL_NAME:模型名稱
    • REGION:連線使用的區域
    • CONNECTION_ID:BigQuery 連線的 ID

      在 Google Cloud 控制台查看連線詳細資料時,這是連線 ID 中顯示的完整限定連線 ID 最後一個部分的值,例如 projects/myproject/locations/connection_location/connections/myconnection

    • ENDPOINT:要使用的 Gemini 模型名稱。詳情請參閱 ENDPOINT

產生結構化資料

使用遠端模型搭配 AI.GENERATE_TABLE 函式,並使用來自資料表欄的提示資料,產生結構化資料:

SELECT *
FROM AI.GENERATE_TABLE(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  [TABLE `PROJECT_ID.DATASET_ID.TABLE_NAME` / (PROMPT_QUERY)],
  STRUCT(TOKENS AS max_output_tokens, TEMPERATURE AS temperature,
  TOP_P AS top_p, STOP_SEQUENCES AS stop_sequences,
  SAFETY_SETTINGS AS safety_settings,
  OUTPUT_SCHEMA AS output_schema)
);

請依指示取代下列項目:

  • PROJECT_ID:您的專案 ID。
  • DATASET_ID:包含模型的資料集 ID。
  • MODEL_NAME:模型名稱。
  • TABLE_NAME:包含提示的資料表名稱。這個資料表必須有一個名為 prompt 的資料欄,或者您可以使用別名來使用名稱不同的資料欄。
  • PROMPT_QUERY:產生提示資料的 GoogleSQL 查詢。提示值本身可從資料欄中提取,也可以將其指定為結構體值,並包含任意數量的字串和資料欄名稱子欄位。例如:SELECT ('Analyze the sentiment in ', feedback_column, 'using the following categories: positive, negative, neutral') AS prompt
  • TOKENSINT64 值,可設定回覆中可產生的符記數量上限。這個值必須介於 [1,8192] 的範圍內。如要取得較短的回覆,請指定較低的值;如要取得較長的回覆,請調高此值。預設為 128
  • TEMPERATURE:範圍為 [0.0,2.0]FLOAT64 值,用於控制選取符記時的隨機程度。預設為 1.0

    如果您想藉由提示生成更具確定性、較不具開放性和創意性的回覆,建議調低 temperature 的值。另一方面,如果 temperature 的值較高,則可能產生較多元或有創意的結果。temperature0 值為確定值,表示系統一律會選取可能性最高的回覆。

  • TOP_P:範圍內的 FLOAT64[0.0,1.0] 有助於判斷符記的選取機率。如要取得較不隨機的回覆,請指定較低的值;如要取得較隨機的回覆,請調高此值。預設為 0.95
  • STOP_SEQUENCES:如果模型回應中包含指定字串,則會移除該字串的 ARRAY 值。字串比對時會完全相符,包括大小寫。預設為空陣列。
  • SAFETY_SETTINGS:用於設定內容安全門檻以篩選回應的 ARRAY> 值。結構體中的第一個元素會指定危害類別,而結構體中的第二個元素會指定相應的封鎖門檻。模型會過濾違反這些設定的內容。每個類別只能指定一次。舉例來說,您無法同時指定 STRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_MEDIUM_AND_ABOVE' AS threshold)STRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_ONLY_HIGH' AS threshold)。如果特定類別沒有安全設定,系統會使用 BLOCK_MEDIUM_AND_ABOVE 安全設定。

    支援的類別如下:

    • HARM_CATEGORY_HATE_SPEECH
    • HARM_CATEGORY_DANGEROUS_CONTENT
    • HARM_CATEGORY_HARASSMENT
    • HARM_CATEGORY_SEXUALLY_EXPLICIT

    支援的門檻如下:

    • BLOCK_NONE (受限)
    • BLOCK_LOW_AND_ABOVE
    • BLOCK_MEDIUM_AND_ABOVE (預設)
    • BLOCK_ONLY_HIGH
    • HARM_BLOCK_THRESHOLD_UNSPECIFIED

    詳情請參閱「有害內容類別」和「如何設定內容篩選器」。

  • OUTPUT_SCHEMA:指定模型回應格式的 STRING 值。output_schema 值必須是 SQL 結構定義,類似於 CREATE TABLE 陳述式中使用的結構定義。支援的資料類型如下:
    • INT64
    • FLOAT64
    • BOOL
    • STRING
    • ARRAY
    • STRUCT

    針對 Gemini 1.5 模型,只有在您確定傳回值不會是捨入值時,才指定 FLOAT64 資料類型。這些模型有時會傳回 INT64 值,而不是 FLOAT64 值來表示整數,例如 2 而非 2.0,這可能會導致查詢中發生剖析錯誤。

    使用 output_schema 引數根據表格中的提示產生結構化資料時,請務必瞭解提示資料,以便指定適當的結構定義。

    舉例來說,假設您要分析來自下列欄位的資料表中的電影評論內容:

    • movie_id
    • review
    • 提示

    接著,您可以執行類似以下的查詢,建立提示文字:

    UPDATE mydataset.movie_review
    SET prompt = CONCAT('Extract the key words and key sentiment from the text below: ', review)
    WHERE review IS NOT NULL;

    您可以指定類似 "keywords ARRAY, sentiment STRING" AS output_schemaoutput_schema 值。

範例

以下範例顯示要求從資料表取得提示資料,並提供 SQL 結構定義來設定模型回應格式:

SELECT
*
FROM
AI.GENERATE_TABLE( MODEL `mydataset.gemini_model`,
  TABLE `mydataset.mytable`,
  STRUCT("keywords ARRAY, sentiment STRING" AS output_schema));

以下範例顯示要求從查詢中取得提示資料,並提供 SQL 結構定義來設定模型回應格式:

SELECT *
FROM
  AI.GENERATE_TABLE(
    MODEL `mydataset.gemini_model`,
    (
      SELECT
        'John Smith is a 20-year old single man living at 1234 NW 45th St, Kirkland WA, 98033. He has two phone numbers 123-123-1234, and 234-234-2345. He is 200.5 pounds.'
          AS prompt
    ),
    STRUCT("address STRUCT, age INT64, is_married BOOL, name STRING, phone_number ARRAY, weight_in_pounds FLOAT64"
        AS output_schema, 8192 AS max_output_tokens));