Generare previsioni ML utilizzando l'emulatore Spanner

Questa pagina descrive come generare previsioni ML utilizzando l'emulatore Spanner per i database con dialetto Google SQL e PostgreSQL.

L'integrazione di Spanner Vertex AI può essere utilizzata con l'emulatore Spanner per generare predizioni utilizzando le funzioni di previsione ML di GoogleSQL o PostgreSQL. L'emulatore è un file binario che simula un server Spanner e può essere utilizzato anche nei test di unità e di integrazione. Puoi utilizzare l'emulatore come progetto open source o localmente utilizzando Google Cloud CLI. Per saperne di più sulle funzioni di previsione ML, consulta Come funziona l'integrazione di Spanner Vertex AI?.

Puoi utilizzare qualsiasi modello con l'emulatore per generare previsioni. Puoi anche utilizzare un modello del Model Garden di Vertex AI o un modello di cui è stato eseguito il deployment nel tuo endpoint Vertex AI. Poiché l'emulatore non si connette a Vertex AI, non può verificare il modello o il relativo schema per qualsiasi modello utilizzato da Vertex AI Model Garden o di cui è stato eseguito il deployment negli endpoint Vertex AI.

Per impostazione predefinita, quando utilizzi una funzione di previsione con l'emulatore, la funzione restituisce un valore casuale in base agli input del modello forniti e allo schema di output del modello. Puoi utilizzare una funzione di callback per modificare l'input e l'output del modello e generare risultati di previsione in base a comportamenti specifici.

Prima di iniziare

Completa i seguenti passaggi prima di utilizzare l'emulatore Spanner per generare previsioni ML.

Installa l'emulatore Spanner

Puoi installare l'emulatore localmente o configurarlo utilizzando il repository GitHub.

Seleziona un modello

Quando utilizzi la funzione ML.PREDICT (per GoogleSQL) o ML_PREDICT_ROW (per PostgreSQL), devi specificare la posizione del modello di ML. Puoi utilizzare qualsiasi modello addestrato. Se selezioni un modello in esecuzione in Model Garden di Vertex AI o un modello implementato nel tuo endpoint Vertex AI, devi fornire i valori input e output per questi modelli.

Per scoprire di più sull'integrazione di Spanner Vertex AI, consulta Come funziona l'integrazione di Spanner Vertex AI?.

elabora le previsioni

Puoi utilizzare l'emulatore per generare previsioni utilizzando le funzioni di previsione di Spanner ML.

Comportamento predefinito

Puoi utilizzare qualsiasi modello di cui è stato eseguito il deployment in un endpoint con l'emulatore Spanner per generare previsioni. L'esempio seguente utilizza un modello chiamato FraudDetection per generare un risultato.

GoogleSQL

Per scoprire di più su come utilizzare la funzione ML.PREDICT per generare predizioni, consulta Generare previsioni ML utilizzando SQL.

Registra il modello

Prima di poter utilizzare un modello con la funzione ML.PREDICT, devi registrarlo utilizzando l'istruzione CREATE MODEL e fornire i valori 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'
);

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto Google Cloud in cui si trova il modello

  • REGION_ID: l'ID della Google Cloud regione in cui si trova il modello, ad esempio us-central1

  • ENDPOINT_ID: l'ID dell'endpoint del modello

Esegui la previsione

Utilizza la funzione ML.PREDICT GoogleSQL per generare la previsione.

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

L'output previsto di questa query è TRUE.

PostgreSQL

Per scoprire di più su come utilizzare la funzione spanner.ML_PREDICT_ROW per generare le previsioni, consulta Generare previsioni ML utilizzando SQL.

Esegui la previsione

Utilizza la funzione spanner.ML_PREDICT_ROW PostgreSQL per generare la previsione.

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto Google Cloud in cui si trova il modello

  • REGION_ID: l'ID della Google Cloud regione in cui si trova il modello, ad esempio us-central1

  • ENDPOINT_ID: l'ID dell'endpoint del modello

L'output previsto di questa query è TRUE.

Callback personalizzato

Puoi utilizzare una funzione di callback personalizzata per implementare i comportamenti selezionati del modello e per trasformare gli input specifici del modello in output. L'esempio seguente utilizza il gemini-pro modello del Model Garden di Vertex AI e l'emulatore Spanner per generare previsioni utilizzando un callback personalizzato.

Quando utilizzi un callback personalizzato per un modello, devi eseguire il fork del repository dell'emulatore Spanner, quindi compilarlo ed eseguirlo. Per ulteriori informazioni su come compilare ed eseguire il deployment dell'emulatore Spanner, consulta la guida rapida all'emulatore Spanner.

GoogleSQL

Registra il modello

Prima di poter utilizzare un modello con la funzione ML.PREDICT, devi registrarlo utilizzando l'istruzione 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
);

Poiché l'emulatore non si connette a Vertex AI, devi fornire i valori input e output.

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto Google Cloud in cui si trova il modello

  • REGION_ID: l'ID della Google Cloud regione in cui si trova il modello, ad esempio us-central1

Richiamata

Utilizza un callback per aggiungere logica personalizzata al modello 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);
}

Esegui la previsione

Utilizza la funzione ML.PREDICT GoogleSQL per generare la previsione.

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

L'output previsto di questa query è "YES".

PostgreSQL

Utilizza la funzione spanner.ML_PREDICT_ROW PostgreSQL per generare la previsione.

Richiamata

Utilizza un callback per aggiungere logica personalizzata al modello 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);
}

Esegui la previsione

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

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto Google Cloud in cui si trova il modello

  • REGION_ID: l'ID della Google Cloud regione in cui si trova il modello, ad esempio us-central1

L'output previsto di questa query è "YES".

Passaggi successivi