Esta página descreve como gerar previsões de ML usando o emulador do Spanner para bancos de dados com dialeto do GoogleSQL e do PostgreSQL.
A integração da plataforma de agentes do Spanner pode ser usada com o emulador do Spanner para gerar previsões usando as funções de previsão de ML do GoogleSQL ou do PostgreSQL. O emulador é um binário que imita um servidor do Spanner e também pode ser usado em testes de unidade e integração. É possível usar o emulador como um projeto de código aberto ou localmente usando a Google Cloud CLI. Para saber mais sobre as funções de previsão de ML, consulte Como funciona a integração da plataforma de agentes do Spanner ?.
É possível usar qualquer modelo com o emulador para gerar previsões. Você também pode usar um modelo do Vertex AI Model Garden ou um modelo implantado no endpoint da Vertex AI. Como o emulador não se conecta à Vertex AI, ele não pode verificar o modelo ou o esquema de qualquer modelo usado no Vertex AI Model Garden ou implantado nos endpoints da Vertex AI.
Por padrão, quando você usa uma função de previsão com o emulador, a função gera um valor aleatório com base nas entradas e no esquema de saída do modelo fornecidos. É possível usar uma função de callback 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 as etapas a seguir antes de usar o emulador do Spanner para gerar previsões de ML.
Instalar o emulador do Spanner
É possível instalar o emulador localmente ou configurá-lo usando o repositório do GitHub.
Selecionar um modelo
Ao usar a função ML.PREDICT (para GoogleSQL) ou ML_PREDICT_ROW (para PostgreSQL), é necessário especificar o local do modelo de ML. É possível usar qualquer modelo treinado. Se você selecionar um modelo em execução no Vertex AI Model Garden ou um modelo implantado no endpoint da Vertex AI, será necessário fornecer os valores input e output para esses modelos.
Para saber mais sobre a integração da plataforma de agentes do Spanner, consulte Como funciona a integração da plataforma de agentes do Spanner?.
Gerar previsões
É possível usar o emulador para gerar previsões usando as funções de previsão de ML do Spanner.
Comportamento padrão
É possível usar qualquer modelo implantado em um endpoint com o emulador do Spanner para gerar previsões. O exemplo a seguir usa um modelo chamado FraudDetection para gerar um resultado.
GoogleSQL
Para saber mais sobre como usar a função ML.PREDICT para gerar
previsões, consulte Gerar previsões de ML usando SQL.
Registrar o modelo
Antes de usar um modelo com a
ML.PREDICT
função, é necessário registrar o modelo usando a
CREATE MODEL
instrução 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:
PROJECT_ID: o ID do projeto em que o modelo está localizado Google CloudREGION_ID: o ID da Google Cloud região em que o modelo está localizado, por exemplo,us-central1ENDPOINT_ID: o ID do endpoint do modelo
Executar a previsão
Use a função
ML.PREDICT
GoogleSQL para gerar sua previsão.
SELECT Outcome
FROM ML.PREDICT(
MODEL FraudDetection,
(SELECT 1000 AS Amount, "John Smith" AS Name))
A saída esperada dessa consulta é TRUE.
PostgreSQL
Para saber mais sobre como usar a função spanner.ML_PREDICT_ROW para
gerar previsões, consulte Gerar previsões de ML usando SQL.
Executar a previsão
Use a função spanner.ML_PREDICT_ROW do PostgreSQL para gerar 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:
PROJECT_ID: o ID do projeto em que o modelo está localizado Google CloudREGION_ID: o ID da Google Cloud região em que o modelo está localizado, por exemplo,us-central1ENDPOINT_ID: o ID do endpoint do modelo
A saída esperada dessa consulta é TRUE.
Callback personalizado
É possível usar uma função de callback personalizada para implementar comportamentos de modelo selecionados e transformar entradas específicas do modelo em saídas. O exemplo a seguir usa o modelo gemini-pro do Vertex AI Model Garden e o emulador do Spanner para gerar previsões usando um callback personalizado.
Ao usar um callback personalizado para um modelo, é necessário fazer um fork do repositório do emulador do Spanner, e, em seguida, criar e implantá-lo. Para mais informações sobre como criar e implantar o emulador do Spanner, consulte o início rápido do emulador do Spanner.
GoogleSQL
Registrar o modelo
Antes de usar um modelo com a ML.PREDICT função, é necessário registrar o modelo usando a CREATE MODEL instrução:
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
);
Como o emulador não se conecta à Vertex AI, é necessário fornecer os valores input e output.
Substitua:
PROJECT_ID: o ID do projeto em que o modelo está localizado Google CloudREGION_ID: o ID da Google Cloud região em que o modelo está localizado, por exemplo,us-central1
Callback
Use um callback 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);
}
Executar a previsão
Use a função
ML.PREDICT
GoogleSQL para gerar sua previsão.
SELECT content
FROM ML.PREDICT(MODEL GeminiPro, (SELECT "Is 7 a prime number?" AS prompt))
A saída esperada dessa consulta é "YES".
PostgreSQL
Use a função spanner.ML_PREDICT_ROW do PostgreSQL para gerar sua previsão.
Callback
Use um callback 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);
}
Executar 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:
PROJECT_ID: o ID do projeto em que o modelo está localizado Google CloudREGION_ID: o ID da Google Cloud região em que o modelo está localizado, por exemplo,us-central1
A saída esperada dessa consulta é "YES".