本頁面說明如何使用 Spanner 模擬器,針對 GoogleSQL 方言資料庫和 PostgreSQL 方言資料庫產生 ML 預測結果。
您可以將 Spanner Vertex AI 整合功能與 Spanner 模擬器搭配使用,利用 GoogleSQL 或 PostgreSQL ML 預測函式產生預測結果。模擬器是模擬 Spanner 伺服器的二進位檔,也可以用於單元和整合測試。您可以將模擬器用作開放原始碼專案,也可以使用 Google Cloud CLI 在本機上執行。如要進一步瞭解機器學習預測函式,請參閱「Spanner Vertex AI 整合功能如何運作?」。
您可以使用模擬器搭配任何模型產生預測結果。您也可以使用 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 端點,則必須為這些模型提供 input
和 output
值。
如要進一步瞭解 Spanner Vertex AI 整合功能,請參閱「Spanner Vertex AI 整合功能如何運作?」。
產生預測
您可以使用模擬器,透過 Spanner ML 預測函式產生預測結果。
預設行為
您可以使用任何模型,並透過 Spanner 模擬器將其部署至端點,以產生預測結果。以下範例使用名為 FraudDetection
的模型產生結果。
GoogleSQL
如要進一步瞭解如何使用 ML.PREDICT
函式產生預測結果,請參閱「使用 SQL 產生機器學習預測結果」。
註冊模型
您必須先使用 CREATE MODEL 陳述式註冊模型,並提供 input
和 output
值,才能使用 ML.PREDICT 函式:
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 專案的 IDREGION_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 專案的 IDREGION_ID
:模型所在 Google Cloud 區域的 ID,例如us-central1
ENDPOINT_ID
:模型端點的 ID
這項查詢的預期輸出內容為 TRUE
。
自訂回呼
您可以使用自訂回呼函式實作所選模型行為,並將特定模型輸入內容轉換為輸出內容。以下範例會使用 Vertex AI Model Garden 和 Spanner 模擬器中的 gemini-pro
模型,透過自訂回呼產生預測結果。
為模型使用自訂回呼時,您必須分支 Spanner 模擬器存放區,然後建構並部署該存放區。如要進一步瞭解如何建構及部署 Spanner 模擬器,請參閱 Spanner 模擬器快速入門指南。
GoogleSQL
註冊模型
您必須先使用 CREATE MODEL 陳述式註冊模型,才能使用 ML.PREDICT 函式:
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,因此您必須提供 input
和 output
值。
更改下列內容:
PROJECT_ID
:模型所在 Google Cloud 專案的 IDREGION_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 專案的 IDREGION_ID
:模型所在 Google Cloud 區域的 ID,例如us-central1
這項查詢的預期輸出內容為 "YES"
。