Gere previsões de AA com o emulador do Spanner

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 encontra

  • REGION_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 encontra

  • REGION_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 encontra

  • REGION_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 encontra

  • REGION_ID: o ID da Google Cloud região em que o modelo está localizado, por exemplo, us-central1

O resultado esperado desta consulta é "YES".

O que se segue?