使用 SQL 產生機器學習預測結果

本頁說明如何從 Spanner 資料庫產生機器學習 (ML) 預測結果。機器學習預測適用於 GoogleSQL 方言資料庫和 PostgreSQL 方言資料庫。

透過 Spanner Vertex AI 整合功能,您可以呼叫 GoogleSQL 的 ML.PREDICT 函式或 PostgreSQL 的 spanner.ML_PREDICT_ROW 函式,使用 SQL 程式碼產生預測結果。如要進一步瞭解 Spanner Vertex AI 整合功能,請參閱 Spanner Vertex AI 整合功能總覽

事前準備

如要從 Spanner 執行個體產生預測結果,請先準備資料庫並選取模型。

設定 Spanner Vertex AI 整合服務的 Vertex AI 端點存取權

Spanner 執行第一個 MODEL DDL 陳述式時,會自動建立服務代理程式並授予必要權限。如果 Spanner 資料庫和 Vertex AI 端點位於同一專案,則不需要進行額外設定。

如果 Spanner 專案沒有 Spanner 服務代理程式帳戶,請執行下列指令建立該帳戶:

gcloud beta services identity create --service=spanner.googleapis.com --project={PROJECT}`

按照「授予單一角色」一文中的步驟,將 Spanner API Service Agent 角色授予 Vertex AI 專案中的 Spanner 服務代理程式帳戶 service-PROJECT_NUMBER@gcp-sa-spanner.iam.gserviceaccount.com

選取型號

使用 ML.PREDICT (適用於 GoogleSQL) 或 spanner.ML_PREDICT_ROW (適用於 PostgreSQL) 函式時,您必須指定機器學習模型的位置。選取的模型可以是下列其中一種:

如要進一步瞭解 Spanner Vertex AI 整合功能,請參閱「Spanner Vertex AI 整合功能的運作方式」。

產生預測

視所選模型類型而定,產生預測的步驟會有所不同。

使用 Vertex AI Model Garden 中的模型

如要使用 Vertex AI Model Garden 中的模型生成預測結果,請從 Model Garden 中選取模型

GoogleSQL

使用 ML.PREDICT() 搭配模型前,請先使用 CREATE MODEL 陳述式註冊模型。

CREATE MODEL 'MODEL_NAME'
INPUT (INPUT_COLUMN_NAME INPUT_COLUMN_TYPE)
OUTPUT (OUTPUT_COLUMN_NAME OUTPUT_COLUMN_TYPE)
REMOTE
OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/publishers/google/models/model_id'
);

更改下列內容:

  • MODEL_NAME:您要為模型指定的名稱

  • INPUT_COLUMN_NAME:輸入資料欄的名稱。舉例來說,如果使用 gemini-pro 模型,輸入資料欄名稱為 prompt

  • INPUT_COLUMN_TYPEINPUT_COLUMN_NAME 的資料類型

  • OUTPUT_COLUMN_NAME:輸出資料欄的名稱。舉例來說,如果使用 gemini-pro 模型,輸出資料欄名稱為 content

  • OUTPUT_COLUMN_TYPEOUTPUT_COLUMN_NAME 的資料類型

  • PROJECT_ID:您的 Google Cloud 專案 ID

  • REGION_ID:模型所在 Google Cloud 區域的 ID,例如 us-central1

  • MODEL_ID:要使用的機器學習模型 ID,例如 gemini-pro

    如要進一步瞭解模型,請參閱生成式 AI 的模型 API 參考資料

從 Model Garden 選取模型,然後使用 ML.PREDICT GoogleSQL 函式產生預測結果。

SELECT * FROM ML.PREDICT(
  MODEL `MODEL_NAME`,
  `INPUT_RELATION`[, `PARAMETERS`])

更改下列內容:

  • MODEL_NAME:您要為模型指定的名稱

    如要進一步瞭解模型,請參閱生成式 AI 的模型 API 參考資料

  • INPUT_RELATIONTABLE table_name 或子查詢,提供資料以執行機器學習預測。

  • PARAMETERS:包含 model_id 支援參數的 STRUCT 值。

您也可以使用 SAFE.ML.PREDICT 傳回 null,而非預測中的錯誤。如果執行大型查詢時,可以容許部分預測失敗,這項功能就非常實用。

PostgreSQL

從 Model Garden 選取模型,然後使用 ML_PREDICT_ROW PostgreSQL 函式產生預測結果。

SELECT spanner.ml_predict_row(
  'projects/PROJECT_ID/locations/REGION_ID/publishers/google/models/MODEL_ID'::text,
  '{
    "instances": [ INSTANCES ],
    "parameters": { PARAMETERS }
   }'::jsonb);

更改下列內容:

  • PROJECT_ID:您的 Google Cloud 專案 ID

  • REGION_ID:模型所在 Google Cloud 區域的 ID,例如 us-central1

  • MODEL_ID:要使用的機器學習模型 ID,例如 gemini-pro

    如要進一步瞭解模型,請參閱生成式 AI 的模型 API 參考資料

  • INSTANCES:預測呼叫的輸入內容,格式為 JSON

  • PARAMETERS:預測呼叫的選用參數,格式為 JSON

這項查詢會產生 JSON 回應。如要進一步瞭解模型的 JSON 回應訊息,請參閱 PredictResponse

使用 Vertex AI 模型端點

如要透過 Spanner Vertex AI 整合服務使用已訓練或下載的模型,請先將模型部署至 Vertex AI。如要進一步瞭解如何在 Vertex AI 中將模型部署至端點,請參閱「將模型部署至端點」。

GoogleSQL

在 Vertex AI 端點中使用模型和 ML.PREDICT GoogleSQL 函式,產生預測結果。如要搭配 ML.PREDICT() 使用模型,請先使用 CREATE MODEL 陳述式註冊模型。每個已部署的模型都有專屬的結構定義。以下是「分類和迴歸總覽」中的結構定義範例:

CREATE MODEL MyClassificationModel
INPUT (
  length FLOAT64,
  material STRING(MAX),
  tag_array ARRAY<STRING(MAX)>
)
OUTPUT (
  scores ARRAY<FLOAT64>,
  classes ARRAY<STRING(MAX)>
)
REMOTE
OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/endpoints/ENDPOINT_ID'
)

更改下列內容:

  • PROJECT_ID:您的 Google Cloud 專案 ID

  • LOCATION:模型所在 Google Cloud 區域的 ID,例如 us-central1

  • ENDPOINT_ID:要使用的機器學習模型 ID,例如 gemini-pro

    如要進一步瞭解模型,請參閱生成式 AI 的模型 API 參考資料

從 Model Garden 選取模型,然後使用 ML.PREDICT GoogleSQL 函式產生預測結果。

SELECT * FROM ML.PREDICT(
  `MODEL_ID`,
  `INPUT_RELATION`[, `PARAMETERS`])

更改下列內容:

  • MODEL_ID:要使用的 ML 模型 ID。

  • INPUT_RELATION:要執行 ML 預測的資料表或子查詢。

  • PARAMETERS:包含 model_name 支援參數的 STRUCT 值。

這項查詢會產生關係,其中包含模型的所有輸出資料欄和輸入關係的所有資料欄。

PostgreSQL

在 Vertex AI 端點中使用模型,並搭配 ML.PREDICT PostgreSQL 函式產生預測結果。

  SELECT spanner.ml_predict_row(
    'projects/PROJECT_ID/locations/REGION_ID/endpoints/ENDPOINT_ID'::text,
    '{
      "instances": [ INSTANCES ],
      "parameters": { PARAMETERS }
      }'::jsonb);
  ```

Replace the following:
  • PROJECT_ID:模型所在 Google Cloud 專案的 ID

  • REGION_ID:模型所在 Google Cloud 區域的 ID,例如 us-central1

  • ENDPOINT_ID:模型端點的 ID

  • INSTANCES:預測呼叫的輸入內容,採用 JSON 格式

  • PARAMETERS:預測呼叫的選用參數,格式為 JSON

這項查詢會產生 JSON 回應。如要進一步瞭解模型的 JSON 回應訊息,請參閱 PredictResponse

使用機器學習函式產生預測的範例

以下範例使用 Model Garden 中的 gemini-pro 模型,根據以引數形式提供的簡短提示生成文字。這個模型是 Gemini in Spanner 的一部分。

GoogleSQL

註冊 gemini-pro 模型

CREATE MODEL GeminiPro
INPUT (prompt STRING(MAX))
OUTPUT (content STRING(MAX))
REMOTE
OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/gemini-pro',
  default_batch_size = 1
);

更改下列內容:

  • PROJECT:專案 ID
  • LOCATION:您使用 Vertex AI 的區域

執行模型

SELECT content
FROM ML.PREDICT(
  MODEL GeminiPro,
  (SELECT "Is 7 a prime number?" AS prompt),
  STRUCT(256 AS maxOutputTokens, 0.2 AS temperature, 40 as topK, 0.95 AS topP)
);

預期輸出內容

預期的輸出內容如下:

+--------------------+
| content            |
+--------------------+
| "Yes"              |
+--------------------+

PostgreSQL

執行模型

select spanner.ml_predict_row(
  '{
    "endpoint": "projects/PROJECT_ID/locations/us-central1/publishers/google/models/gemini-pro",
    "default_batch_size": 1
   }'::jsonb,
  '{
    "instances":[{"prompt": "Is 7 a prime number?"}],
    "parameters":{"maxOutputTokens":256, "topK": 40, "topP":0.96, "temperature":0.2}
    }'
);

預期輸出內容

預期輸出內容如下:

+--------------------+
| content            |
+--------------------+
| "Yes"              |
+--------------------+