使用 Spanner 模擬器產生機器學習預測

本頁面說明如何使用 Spanner 模擬器,為 GoogleSQL 方言資料庫和 PostgreSQL 方言資料庫產生 ML 預測。

Spanner Agent Platform 整合服務可搭配 Spanner 模擬器使用,透過 GoogleSQL 或 PostgreSQL ML 預測函式產生預測結果。模擬器是模仿 Spanner 伺服器的二進位檔,也可用於單元和整合測試。您可以將模擬器做為開放原始碼專案使用,也可以使用 Google Cloud CLI 在本機使用。如要進一步瞭解 ML 預測函式,請參閱「Spanner Agent Platform 整合的運作方式為何?」。

您可以使用模擬器搭配任何模型產生預測。 您也可以使用 Vertex AI Model Garden 中的模型,或是部署至 Vertex AI 端點的模型。由於模擬器不會連線至 Vertex AI,因此無法驗證從 Vertex AI Model Garden 使用或部署至 Vertex AI 端點的任何模型或其結構定義。

根據預設,使用模擬器搭配預測函式時,函式會根據提供的模型輸入和模型輸出結構定義,產生隨機值。您可以使用回呼函式修改模型輸入和輸出內容,並根據特定行為產生預測結果。

事前準備

使用 Spanner 模擬器產生 ML 預測結果前,請先完成下列步驟。

安裝 Spanner 模擬器

您可以在本機安裝模擬器,或使用 GitHub 存放區設定模擬器。

選取型號

使用 ML.PREDICT (適用於 GoogleSQL) 或 ML_PREDICT_ROW (適用於 PostgreSQL) 函式時,您必須指定機器學習模型的位置。您可以使用任何訓練過的模型。如果選取在 Vertex AI Model Garden 中執行的模型,或是部署至 Vertex AI 端點的模型,則必須提供這些模型的 inputoutput 值。

如要進一步瞭解 Spanner Agent Platform 整合功能,請參閱「Spanner Agent Platform 整合功能如何運作?」一文。

生成預測

您可以使用模擬器,透過 Spanner ML 預測函式產生預測結果。

預設行為

您可以使用部署至端點的任何模型,透過 Spanner 模擬器產生預測結果。以下範例使用名為 FraudDetection 的模型產生結果。

GoogleSQL

如要進一步瞭解如何使用 ML.PREDICT 函式生成預測結果,請參閱「使用 SQL 生成機器學習預測結果」。

註冊模型

如要使用 ML.PREDICT 函式搭配模型,請先使用 CREATE MODEL 陳述式註冊模型,並提供 inputoutput 值:

CREATE MODEL FraudDetection
INPUT (Amount INT64, Name STRING(MAX))
OUTPUT (Outcome BOOL)
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/PROJECT_ID/locations/REGION_ID/endpoints/ENDPOINT_ID'
);

更改下列內容:

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

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

  • ENDPOINT_ID:模型端點的 ID

執行預測

使用 ML.PREDICT GoogleSQL 函式產生預測結果。

SELECT Outcome
FROM ML.PREDICT(
    MODEL FraudDetection,
    (SELECT 1000 AS Amount, "John Smith" AS Name))

這項查詢的預期輸出內容為 TRUE

PostgreSQL

如要進一步瞭解如何使用 spanner.ML_PREDICT_ROW 函式生成預測結果,請參閱「使用 SQL 生成機器學習預測結果」。

執行預測

使用 spanner.ML_PREDICT_ROW PostgreSQL 函式產生預測結果。

SELECT (spanner.ml_predict_row(
'projects/`MODEL_ID`/locations/`REGION_ID`/endpoints/`ENDPOINT_ID`',
'{"instances": [{"Amount": "1000", "Name": "John Smith"}]}'
)->'predictions'->0->'Outcome')::boolean

更改下列內容:

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

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

  • ENDPOINT_ID:模型端點的 ID

這項查詢的預期輸出內容為 TRUE

自訂回呼

您可以透過自訂回呼函式實作所選模型行為,並將特定模型輸入內容轉換為輸出內容。下列範例使用 Vertex AI Model Garden 的 gemini-pro 模型和 Spanner 模擬器,透過自訂回呼產生預測結果。

為模型使用自訂回呼時,您必須分支 Spanner 模擬器存放區,然後建構並部署。如要進一步瞭解如何建構及部署 Spanner 模擬器,請參閱 Spanner 模擬器快速入門導覽課程

GoogleSQL

註冊模型

如要使用 ML.PREDICT 函式搭配模型,請先使用 CREATE MODEL 陳述式註冊模型:

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

由於模擬器不會連線至 Vertex AI,因此您必須提供 inputoutput 值。

更改下列內容:

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

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

回撥

使用回呼將自訂邏輯新增至 GeminiPro 模型。

absl::Status ModelEvaluator::Predict(
    const googlesql::Model* model,
    const CaseInsensitiveStringMap<const ModelColumn>& model_inputs,
    CaseInsensitiveStringMap<ModelColumn>& model_outputs) {
  // Custom logic for GeminiPro.
  if (model->Name() == "GeminiPro") {
    RET_CHECK(model_inputs.contains("prompt"));
    RET_CHECK(model_inputs.find("prompt")->second.value->type()->IsString());
    RET_CHECK(model_outputs.contains("content"));
    std::string content;

    // Process prompts used in tests.
    int64_t number;
    static LazyRE2 is_prime_prompt = {R"(Is (\d+) a prime number\?)"};
    if (RE2::FullMatch(
            model_inputs.find("prompt")->second.value->string_value(),
            *is_prime_prompt, &number)) {
        content = IsPrime(number) ? "Yes" : "No";
    } else {
        // Default response.
        content = "Sorry, I don't understand";
    }
    *model_outputs["content"].value = googlesql::values::String(content);
    return absl::OkStatus();
  }
  // Custom model prediction logic can be added here.
  return DefaultPredict(model, model_inputs, model_outputs);
}

執行預測

使用 ML.PREDICT GoogleSQL 函式產生預測結果。

SELECT content
    FROM ML.PREDICT(MODEL GeminiPro, (SELECT "Is 7 a prime number?" AS prompt))

這項查詢的預期輸出內容為 "YES"

PostgreSQL

使用 spanner.ML_PREDICT_ROW PostgreSQL 函式產生預測結果。

回撥

使用回呼將自訂邏輯新增至 GeminiPro 模型。

absl::Status ModelEvaluator::PgPredict(
    absl::string_view endpoint, const googlesql::JSONValueConstRef& instance,
    const googlesql::JSONValueConstRef& parameters,
    lesql::JSONValueRef prediction) {
  if (endpoint.ends_with("publishers/google/models/gemini-pro")) {
    RET_CHECK(instance.IsObject());
    RET_CHECK(instance.HasMember("prompt"));
    std::string content;

    // Process prompts used in tests.
    int64_t number;
    static LazyRE2 is_prime_prompt = {R"(Is (\d+) a prime number\?)"};
    if (RE2::FullMatch(instance.GetMember("prompt").GetString(),
                        *is_prime_prompt, &number)) {
        content = IsPrime(number) ? "Yes" : "No";
    } else {
        // Default response.
        content = "Sorry, I don't understand";
    }
    prediction.SetToEmptyObject();
    prediction.GetMember("content").SetString(content);
    return absl::OkStatus();
  }

  // Custom model prediction logic can be added here.
  return DefaultPgPredict(endpoint, instance, parameters, prediction);
}

執行預測

SELECT (spanner.ml_predict_row(
'projects/`PROJECT_ID`/locations/`REGION_ID`/publishers/google/models/gemini-pro',
'{"instances": [{"prompt": "Is 7 a prime number?"}]}'
)->'predictions'->0->'content')::text

更改下列內容:

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

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

這項查詢的預期輸出內容為 "YES"

後續步驟