Genera predicciones de AA con el emulador de Spanner

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

La integración de Spanner Agent Platform se puede usar con el emulador de Spanner para generar predicciones con las funciones predictivas de AA de GoogleSQL o PostgreSQL. El emulador es un objeto binario que imita un servidor de Spanner y también se puede usar en pruebas de unidades 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 Agent Platform?.

Puedes usar cualquier modelo con el emulador para generar predicciones. También puedes usar un modelo de Vertex AI Model Garden o un modelo implementado en tu extremo de Vertex AI. Dado que el emulador no se conecta a Vertex AI, no puede verificar el modelo ni su esquema para ningún modelo que se use desde Vertex AI Model Garden o que se implemente en los extremos 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 proporcionadas y el esquema de resultado del modelo. Puedes usar una función de devolución de llamada para modificar la entrada y la salida del modelo, y generar resultados de predicción basados en comportamientos específicos.

Antes de comenzar

Completa los siguientes pasos antes de usar el emulador de Spanner para generar predicciones de AA.

Instala el emulador de Spanner

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

Seleccionar un modelo

Cuando usas la función ML.PREDICT (para GoogleSQL) o 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 ejecuta en Model Garden de Vertex AI o un modelo que se implementó en tu extremo de Vertex AI, debes proporcionar los valores de input y output para estos modelos.

Para obtener más información sobre la integración de Agent Platform en Spanner, consulta ¿Cómo funciona la integración de Agent Platform en Spanner?.

Genere predicciones

Puedes usar el emulador para generar predicciones con las funciones de predicción de AA de Spanner.

Comportamiento predeterminado

Puedes usar cualquier modelo implementado en un extremo 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 Cómo generar predicciones de AA con SQL.

Registra el modelo

Antes de usar un modelo con la función ML.PREDICT, debes registrarlo con la sentencia CREATE MODEL y proporcionar los valores de 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'
);

Reemplaza lo siguiente:

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

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

  • ENDPOINT_ID: Es el ID del extremo del modelo.

Ejecuta 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 búsqueda es TRUE.

PostgreSQL

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

Ejecuta la predicción

Usa la función spanner.ML_PREDICT_ROW de 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

Reemplaza lo siguiente:

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

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

  • ENDPOINT_ID: Es el ID del extremo del modelo.

El resultado esperado de esta búsqueda es TRUE.

Devolución de llamada personalizada

Puedes usar una función de devolución de llamada personalizada para implementar los comportamientos del modelo seleccionados y transformar entradas específicas del modelo en salidas. En el siguiente ejemplo, se usa el modelo gemini-pro de Model Garden de Vertex AI y el emulador de Spanner para generar predicciones con una devolución de llamada personalizada.

Cuando usas una devolución de llamada personalizada para un modelo, debes bifurcar el repositorio del emulador de Spanner y, luego, 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

Registra el modelo

Antes de usar un modelo con la función ML.PREDICT, debes registrarlo con la sentencia 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 de input y output.

Reemplaza lo siguiente:

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

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

Callback

Usa una devolución de llamada para agregar 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);
}

Ejecuta 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 búsqueda es "YES".

PostgreSQL

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

Callback

Usa una devolución de llamada para agregar 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);
}

Ejecuta 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

Reemplaza lo siguiente:

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

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

El resultado esperado de esta búsqueda es "YES".

Próximos pasos