Auf dieser Seite wird beschrieben, wie Sie ML-Vorhersagen mit dem Spanner-Emulator generieren.
Die Einbindung von Spanner Vertex AI kann mit dem Spanner-Emulator verwendet werden, um Vorhersagen mithilfe der ML-Vorhersagefunktionen von GoogleSQL oder PostgreSQL zu generieren. Der Emulator ist ein Binärprogramm, das einen Spanner-Server nachahmt und auch für Einheiten- und Integrationstests verwendet werden kann. Sie können den Emulator als Open-Source-Projekt oder lokal über die Google Cloud CLI verwenden. Weitere Informationen zu ML-Vorhersagefunktionen finden Sie unter Wie funktioniert die Einbindung von Spanner Vertex AI?.
Sie können jedes Modell mit dem Emulator verwenden, um Vorhersagen zu generieren. Sie können auch ein Modell aus Vertex AI Model Garden oder ein Modell verwenden, das auf Ihrem Vertex AI-Endpunkt bereitgestellt wird. Da der Emulator keine Verbindung zu Vertex AI herstellt, kann er das Modell oder sein Schema für kein Modell prüfen, das aus dem Vertex AI Model Garden verwendet oder auf den Vertex AI-Endpunkten bereitgestellt wird.
Wenn Sie eine Vorhersagefunktion mit dem Emulator verwenden, liefert die Funktion standardmäßig einen Zufallswert basierend auf den bereitgestellten Modelleingaben und dem Modellausgabeschema. Sie können eine Callback-Funktion verwenden, um die Modelleingabe und -ausgabe zu ändern und Vorhersageergebnisse anhand von bestimmten Verhaltensweisen zu generieren.
Hinweise
Spanner-Emulator installieren
Sie können den Emulator lokal installieren oder mit dem GitHub-Repository einrichten.
Modell auswählen
Wenn Sie die Funktion ML.PREDICT
(für GoogleSQL) oder die Funktion ML_PREDICT_ROW
(für PostgreSQL) verwenden, müssen Sie den Speicherort des ML-Modells angeben. Sie können ein beliebiges trainiertes Modell verwenden. Wenn Sie ein Modell auswählen, das in Vertex AI Model Garden ausgeführt wird, oder ein Modell, das auf Ihrem Vertex AI-Endpunkt bereitgestellt wird, müssen Sie die Werte input
und output
für diese Modelle angeben.
Weitere Informationen zur Einbindung von Spanner Vertex AI finden Sie unter Wie funktioniert die Einbindung von Spanner Vertex AI?.
Vorhersagen generieren
Sie können den Emulator verwenden, um mithilfe der Spanner ML-Vorhersagefunktionen Vorhersagen zu generieren.
Standardverhalten
Sie können jedes Modell, das auf einem Endpunkt bereitgestellt ist, mit dem Spanner-Emulator verwenden, um Vorhersagen zu generieren. Im folgenden Beispiel wird ein Modell mit dem Namen FraudDetection
verwendet, um ein Ergebnis zu generieren.
GoogleSQL
Weitere Informationen zum Generieren von Vorhersagen mit der ML.PREDICT
-Funktion finden Sie unter ML-Vorhersagen mit SQL generieren.
Modell registrieren
Bevor Sie ein Modell mit der Funktion ML.PREDICT verwenden können, müssen Sie es mit der Anweisung CREATE MODEL registrieren und die Werte input
und output
angeben:
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'
);
Ersetzen Sie Folgendes:
PROJECT_ID
: die ID des Google Cloud-Projekts, in dem sich das Modell befindetREGION_ID
: die ID der Google Cloud-Region, in der sich das Modell befindet, z. B.us-central1
.ENDPOINT_ID
: die ID des Modellendpunkts
Vorhersage ausführen
Verwenden Sie die GoogleSQL-Funktion ML.PREDICT
, um die Vorhersage zu generieren.
SELECT Outcome
FROM ML.PREDICT(
MODEL FraudDetection,
(SELECT 1000 AS Amount, "John Smith" AS Name))
Die erwartete Ausgabe dieser Abfrage ist TRUE
.
PostgreSQL
Weitere Informationen zum Generieren von Vorhersagen mit der spanner.ML_PREDICT_ROW
-Funktion finden Sie unter ML-Vorhersagen mit SQL generieren.
Vorhersage ausführen
Verwenden Sie die PostgreSQL-Funktion spanner.ML_PREDICT_ROW
, um die Vorhersage zu generieren.
SELECT (spanner.ml_predict_row(
'projects/`MODEL_ID`/locations/`REGION_ID`/endpoints/`ENDPOINT_ID`',
'{"instances": [{"Amount": "1000", "Name": "John Smith"}]}'
)->'predictions'->0->'Outcome')::boolean
Ersetzen Sie Folgendes:
PROJECT_ID
: die ID des Google Cloud-Projekts, in dem sich das Modell befindetREGION_ID
: die ID der Google Cloud-Region, in der sich das Modell befindet, z. B.us-central1
.ENDPOINT_ID
: die ID des Modellendpunkts
Die erwartete Ausgabe dieser Abfrage ist TRUE
.
Benutzerdefinierter Callback
Sie können eine benutzerdefinierte Callback-Funktion verwenden, um ausgewählte Modellverhalten zu implementieren und bestimmte Modelleingaben in Ausgaben zu transformieren. Im folgenden Beispiel werden das Modell gemini-pro
aus dem Vertex AI Model Garden und der Spanner-Emulator verwendet, um Vorhersagen mit einem benutzerdefinierten Callback zu generieren.
Wenn Sie einen benutzerdefinierten Callback für ein Modell verwenden, müssen Sie das Spanner Emulator-Repository verzweigen, dann erstellen und bereitstellen. Weitere Informationen zum Erstellen und Bereitstellen des Spanner-Emulators finden Sie in der Kurzanleitung für Spanner Emulator.
GoogleSQL
Modell registrieren
Bevor Sie ein Modell mit der Funktion ML.PREDICT verwenden können, müssen Sie es mit der Anweisung CREATE MODEL registrieren:
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
);
Da der Emulator keine Verbindung zu Vertex AI herstellt, müssen Sie die Werte input
und output
angeben.
Ersetzen Sie Folgendes:
PROJECT_ID
: die ID des Google Cloud-Projekts, in dem sich das Modell befindetREGION_ID
: die ID der Google Cloud-Region, in der sich das Modell befindet, z. B.us-central1
.
Rückruf
Verwenden Sie einen Callback, um dem Modell GeminiPro
benutzerdefinierte Logik hinzuzufügen.
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);
}
Vorhersage ausführen
Verwenden Sie die GoogleSQL-Funktion ML.PREDICT
, um die Vorhersage zu generieren.
SELECT content
FROM ML.PREDICT(MODEL GeminiPro, (SELECT "Is 7 a prime number?" AS prompt))
Die erwartete Ausgabe dieser Abfrage ist "YES"
.
PostgreSQL
Verwenden Sie die PostgreSQL-Funktion spanner.ML_PREDICT_ROW
, um die Vorhersage zu generieren.
Rückruf
Verwenden Sie einen Callback, um dem Modell GeminiPro
benutzerdefinierte Logik hinzuzufügen.
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);
}
Vorhersage ausführen
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
Ersetzen Sie Folgendes:
PROJECT_ID
: die ID des Google Cloud-Projekts, in dem sich das Modell befindetREGION_ID
: die ID der Google Cloud-Region, in der sich das Modell befindet, z. B.us-central1
.
Die erwartete Ausgabe dieser Abfrage ist "YES"
.