Generar predicciones de aprendizaje automático con el emulador de Spanner

En esta página se describe cómo generar predicciones de aprendizaje automático con el emulador de Spanner para bases de datos con dialecto de GoogleSQL y con dialecto de PostgreSQL.

La integración de Spanner con Vertex AI se puede usar con el emulador de Spanner para generar predicciones mediante las funciones de predicción de aprendizaje automático de GoogleSQL o PostgreSQL. El emulador es un archivo binario que imita un servidor de Spanner y también se puede usar en pruebas unitarias y de integración. Puedes usar el emulador como un proyecto de código abierto o localmente con Google Cloud CLI. Para obtener más información sobre las funciones de predicción de AA, consulta ¿Cómo funciona la integración de Spanner con Vertex AI?

Puedes usar cualquier modelo con el emulador para generar predicciones. También puedes usar un modelo de Model Garden de Vertex AI o un modelo desplegado en tu endpoint de Vertex AI. Como el emulador no se conecta a Vertex AI, no puede verificar el modelo ni su esquema para ningún modelo usado desde Vertex AI Model Garden o desplegado en los endpoints de Vertex AI.

De forma predeterminada, cuando usas una función de predicción con el emulador, la función genera un valor aleatorio basado en las entradas del modelo y el esquema de salida del modelo proporcionados. Puedes usar una función de retrollamada para modificar la entrada y la salida del modelo, así como para generar resultados de predicción basados en comportamientos específicos.

Antes de empezar

Sigue estos pasos antes de usar el emulador de Spanner para generar predicciones de aprendizaje automático.

Instalar el emulador de Spanner

Puedes instalar el emulador de forma local o configurarlo mediante el repositorio de GitHub.

Selecciona un modelo

Cuando usas la función ML.PREDICT (para GoogleSQL) o la función ML_PREDICT_ROW (para PostgreSQL), debes especificar la ubicación del modelo de AA. Puedes usar cualquier modelo entrenado. Si seleccionas un modelo que se esté ejecutando en Model Garden de Vertex AI o un modelo que se haya desplegado en tu endpoint de Vertex AI, debes proporcionar los valores de input y output para esos modelos.

Para obtener más información sobre la integración de Spanner con Vertex AI, consulta ¿Cómo funciona la integración de Spanner con Vertex AI?

Generar predicciones

Puedes usar el emulador para generar predicciones con las funciones predictivas de aprendizaje automático de Spanner.

Comportamiento predeterminado

Puedes usar cualquier modelo desplegado en un endpoint con el emulador de Spanner para generar predicciones. En el siguiente ejemplo se usa un modelo llamado FraudDetection para generar un resultado.

GoogleSQL

Para obtener más información sobre cómo usar la función ML.PREDICT para generar predicciones, consulta el artículo Generar predicciones de aprendizaje automático con SQL.

Registrar el modelo

Para poder usar un modelo con la función ML.PREDICT, debe registrarlo con la instrucción CREATE MODEL y proporcionar los valores input y 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'
);

Haz los cambios siguientes:

  • PROJECT_ID: ID del Google Cloud proyecto en el que se encuentra el modelo

  • REGION_ID: el ID de la Google Cloud región en la que se encuentra el modelo. Por ejemplo, us-central1.

  • ENDPOINT_ID: el ID del endpoint del modelo

Ejecutar la predicción

Usa la función de GoogleSQL ML.PREDICT para generar tu predicción.

SELECT Outcome
FROM ML.PREDICT(
    MODEL FraudDetection,
    (SELECT 1000 AS Amount, "John Smith" AS Name))

El resultado esperado de esta consulta es TRUE.

PostgreSQL

Para obtener más información sobre cómo usar la función spanner.ML_PREDICT_ROW para generar predicciones, consulta Generar predicciones de aprendizaje automático con SQL.

Ejecutar la predicción

Usa la función spanner.ML_PREDICT_ROW PostgreSQL para generar tu predicción.

SELECT (spanner.ml_predict_row(
'projects/`MODEL_ID`/locations/`REGION_ID`/endpoints/`ENDPOINT_ID`',
'{"instances": [{"Amount": "1000", "Name": "John Smith"}]}'
)->'predictions'->0->'Outcome')::boolean

Haz los cambios siguientes:

  • PROJECT_ID: ID del Google Cloud proyecto en el que se encuentra el modelo

  • REGION_ID: el ID de la Google Cloud región en la que se encuentra el modelo. Por ejemplo, us-central1.

  • ENDPOINT_ID: el ID del endpoint del modelo

El resultado esperado de esta consulta es TRUE.

Retrollamada personalizada

Puedes usar una función de retrollamada personalizada para implementar comportamientos de modelos seleccionados y para transformar entradas de modelos específicos en salidas. En el siguiente ejemplo se usa el modelo gemini-prode Vertex AI Model Garden y el emulador de Spanner para generar predicciones con una retrollamada personalizada.

Cuando uses una retrollamada personalizada para un modelo, debes crear una bifurcación del repositorio del emulador de Spanner, y, a continuación, compilarlo e implementarlo. Para obtener más información sobre cómo compilar e implementar el emulador de Spanner, consulta la guía de inicio rápido del emulador de Spanner.

GoogleSQL

Registrar el modelo

Para poder usar un modelo con la función ML.PREDICT, debe registrarlo con la instrucción 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
);

Como el emulador no se conecta a Vertex AI, debes proporcionar los valores input y output.

Haz los cambios siguientes:

  • PROJECT_ID: ID del Google Cloud proyecto en el que se encuentra el modelo

  • REGION_ID: el ID de la Google Cloud región en la que se encuentra el modelo. Por ejemplo, us-central1.

Retrollamada

Usa una retrollamada para añadir lógica personalizada al 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);
}

Ejecutar la predicción

Usa la función de GoogleSQL ML.PREDICT para generar tu predicción.

SELECT content
    FROM ML.PREDICT(MODEL GeminiPro, (SELECT "Is 7 a prime number?" AS prompt))

El resultado esperado de esta consulta es "YES".

PostgreSQL

Usa la función spanner.ML_PREDICT_ROW PostgreSQL para generar tu predicción.

Retrollamada

Usa una retrollamada para añadir lógica personalizada al 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);
}

Ejecutar la predicción

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

Haz los cambios siguientes:

  • PROJECT_ID: ID del Google Cloud proyecto en el que se encuentra el modelo

  • REGION_ID: el ID de la Google Cloud región en la que se encuentra el modelo (por ejemplo, us-central1)

El resultado esperado de esta consulta es "YES".

Siguientes pasos