使用 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 会自动创建服务代理并授予必要的权限。如果 Spanner 数据库和 Vertex AI 端点位于同一项目中,则无需进行额外的设置。

如果您的 Spanner 项目没有 Spanner 服务代理账号,请运行以下命令创建一个:

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

按照授予单个角色中所述的步骤,将 Spanner API Service Agent 角色授予 Vertex AI 项目中的 Spanner Service Agent 账号 service-PROJECT_ID@gcp-sa-spanner.iam.gserviceaccount.com

选择模型

使用 ML.PREDICT(适用于 GoogleSQL)或 spanner.ML_PREDICT_ROW(适用于 PostgreSQL)函数时,您必须指定 ML 模型的位置。您选择的模型可以是以下各项之一:

如需详细了解 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 参考文档

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

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

ML.PREDICT GoogleSQL 函数与 Vertex AI 端点中的模型搭配使用,以生成预测结果。在将模型与 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 参考文档

ML.PREDICT GoogleSQL 函数与从模型花园中选择的模型结合使用,以生成预测结果。

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

替换以下内容:

  • MODEL_ID:您要使用的机器学习模型的 ID。

  • INPUT_RELATION:您要对其运行机器学习预测的表或子查询。

  • PARAMETERS:包含 model_name 支持的参数的 STRUCT 值。

此查询会生成一个关系,其中包含模型的所有输出列和输入关系的所有列。

PostgreSQL

ML.PREDICT PostgreSQL 函数与 Vertex AI 端点中的模型搭配使用,以生成预测结果。

  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 模型,根据作为参数提供的简短提示生成文本。此模型在 Spanner 中的 Gemini 中提供。

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"              |
+--------------------+