Esta página descreve como gerar previsões de ML usando o emulador do Spanner para bases de dados com dialeto GoogleSQL e bases de dados com dialeto PostgreSQL.
A integração do Spanner Vertex AI pode ser usada com o emulador do Spanner para gerar previsões através das funções de previsão de ML do GoogleSQL ou PostgreSQL. O emulador é um ficheiro binário que imita um servidor do Spanner e também pode ser usado em testes de unidades e de integração. Pode usar o emulador como um projeto de código aberto ou localmente através da Google Cloud CLI. Para saber mais acerca das funções ML predict, consulte o artigo Como funciona a integração do Spanner com o Vertex AI?.
Pode usar qualquer modelo com o emulador para gerar previsões. Também pode usar um modelo do Vertex AI Model Garden ou um modelo implementado no seu ponto final do Vertex AI. Uma vez que o emulador não se liga ao Vertex AI, não pode validar o modelo nem o respetivo esquema para nenhum modelo usado a partir do Vertex AI Model Garden ou implementado nos endpoints do Vertex AI.
Por predefinição, quando usa uma função de previsão com o emulador, a função produz um valor aleatório com base nas entradas do modelo fornecidas e no esquema de saída do modelo. Pode usar uma função de retorno de chamada para modificar a entrada e a saída do modelo e gerar resultados de previsão com base em comportamentos específicos.
Antes de começar
Conclua os passos seguintes antes de usar o emulador do Spanner para gerar previsões de ML.
Instale o emulador do Spanner
Pode instalar o emulador localmente ou configurá-lo através do repositório do GitHub.
Selecione um modelo
Quando usa a função ML.PREDICT
(para GoogleSQL) ou ML_PREDICT_ROW
(para PostgreSQL), tem de especificar a localização do modelo de ML. Pode usar qualquer modelo preparado. Se selecionar um modelo que esteja a ser executado no Vertex AI Model Garden ou um modelo que esteja implementado no seu ponto final da Vertex AI, tem de fornecer os valores input
e output
para estes modelos.
Para saber mais sobre a integração do Spanner com a Vertex AI, consulte o artigo Como funciona a integração do Spanner com a Vertex AI?.
Gere previsões
Pode usar o emulador para gerar previsões com as funções predict do Spanner ML.
Comportamento predefinido
Pode usar qualquer modelo implementado num ponto final com o emulador do Spanner para gerar previsões. O exemplo seguinte usa um modelo denominado FraudDetection
para gerar um resultado.
GoogleSQL
Para saber como usar a função ML.PREDICT
para gerar
previsões, consulte o artigo Gere previsões de ML com SQL.
Registe o modelo
Antes de poder usar um modelo com a função
ML.PREDICT, tem de registar o modelo através da declaração
CREATE MODEL
e fornecer os valores input
e output
:
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'
);
Substitua o seguinte:
PROJECT_ID
: o ID do Google Cloud projeto no qual o modelo se encontraREGION_ID
: o ID da Google Cloud região onde o modelo está localizado, por exemplo,us-central1
ENDPOINT_ID
: o ID do ponto final do modelo
Execute a previsão
Use a função
ML.PREDICT
GoogleSQL para gerar a sua previsão.
SELECT Outcome
FROM ML.PREDICT(
MODEL FraudDetection,
(SELECT 1000 AS Amount, "John Smith" AS Name))
O resultado esperado desta consulta é TRUE
.
PostgreSQL
Para saber como usar a função spanner.ML_PREDICT_ROW
para gerar previsões, consulte o artigo Gere previsões de ML com SQL.
Execute a previsão
Use a função spanner.ML_PREDICT_ROW
do PostgreSQL para gerar a sua previsão.
SELECT (spanner.ml_predict_row(
'projects/`MODEL_ID`/locations/`REGION_ID`/endpoints/`ENDPOINT_ID`',
'{"instances": [{"Amount": "1000", "Name": "John Smith"}]}'
)->'predictions'->0->'Outcome')::boolean
Substitua o seguinte:
PROJECT_ID
: o ID do Google Cloud projeto no qual o modelo se encontraREGION_ID
: o ID da Google Cloud região onde o modelo está localizado, por exemplo,us-central1
ENDPOINT_ID
: o ID do ponto final do modelo
O resultado esperado desta consulta é TRUE
.
Chamada de resposta personalizada
Pode usar uma função de callback personalizada para implementar comportamentos de modelos selecionados e transformar entradas específicas de modelos em saídas. O exemplo seguinte usa o
modelo gemini-pro
do Vertex AI Model Garden
e o emulador do Spanner para gerar previsões através de um
callback personalizado.
Quando usar um callback personalizado para um modelo, tem de criar uma ramificação do repositório do emulador do Spanner e, em seguida, criá-lo e implementá-lo. Para mais informações sobre como criar e implementar o emulador do Spanner, consulte o início rápido do emulador do Spanner.
GoogleSQL
Registe o modelo
Antes de poder usar um modelo com a função ML.PREDICT, tem de registar o modelo através da declaração 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
);
Uma vez que o emulador não se liga ao Vertex AI, tem de fornecer os valores input
e output
.
Substitua o seguinte:
PROJECT_ID
: o ID do projeto Google Cloud no qual o modelo se encontraREGION_ID
: o ID da Google Cloud região onde o modelo está localizado, por exemplo,us-central1
Chamada de retorno
Use uma função de retorno de chamada para adicionar lógica personalizada ao modelo 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);
}
Execute a previsão
Use a função
ML.PREDICT
GoogleSQL para gerar a sua previsão.
SELECT content
FROM ML.PREDICT(MODEL GeminiPro, (SELECT "Is 7 a prime number?" AS prompt))
O resultado esperado desta consulta é "YES"
.
PostgreSQL
Use a função spanner.ML_PREDICT_ROW
do PostgreSQL para gerar a sua previsão.
Chamada de retorno
Use uma função de retorno de chamada para adicionar lógica personalizada ao modelo 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);
}
Execute a previsão
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
Substitua o seguinte:
PROJECT_ID
: o ID do Google Cloud projeto no qual o modelo se encontraREGION_ID
: o ID da Google Cloud região em que o modelo está localizado, por exemplo,us-central1
O resultado esperado desta consulta é "YES"
.