Membuat prediksi ML menggunakan emulator Spanner

Halaman ini menjelaskan cara membuat prediksi ML menggunakan emulator Spanner untuk database dialek GoogleSQL dan database dialek PostgreSQL.

Integrasi Spanner Vertex AI dapat digunakan dengan emulator Spanner untuk menghasilkan prediksi menggunakan fungsi prediksi GoogleSQL atau PostgreSQL ML. Emulator adalah biner yang meniru server Spanner, dan juga dapat digunakan dalam pengujian unit dan integrasi. Anda dapat menggunakan emulator sebagai project open source atau secara lokal menggunakan Google Cloud CLI. Untuk mempelajari fungsi prediksi ML lebih lanjut, lihat Bagaimana cara kerja integrasi Spanner Vertex AI?.

Anda dapat menggunakan model apa pun dengan emulator untuk menghasilkan prediksi. Anda juga dapat menggunakan model dari Vertex AI Model Garden atau model yang di-deploy ke endpoint Vertex AI. Karena emulator tidak terhubung ke Vertex AI, emulator tidak dapat memverifikasi model atau skemanya untuk model apa pun yang digunakan dari Vertex AI Model Garden atau di-deploy ke endpoint Vertex AI.

Secara default, saat Anda menggunakan fungsi prediksi dengan emulator, fungsi akan menghasilkan nilai acak berdasarkan input model yang diberikan dan skema output model. Anda dapat menggunakan fungsi callback untuk mengubah input dan output model, serta menghasilkan hasil prediksi berdasarkan perilaku tertentu.

Sebelum memulai

Selesaikan langkah-langkah berikut sebelum Anda menggunakan emulator Spanner untuk menghasilkan prediksi ML.

Menginstal emulator Spanner

Anda dapat menginstal emulator secara lokal atau menyiapkannya menggunakan repositori GitHub.

Pilih model

Saat menggunakan fungsi ML.PREDICT (untuk GoogleSQL) atau ML_PREDICT_ROW (untuk PostgreSQL), Anda harus menentukan lokasi model ML. Anda dapat menggunakan model terlatih apa pun. Jika memilih model yang berjalan di Model Garden Vertex AI atau model yang di-deploy ke endpoint Vertex AI, Anda harus memberikan nilai input dan output untuk model ini.

Untuk mempelajari integrasi Vertex AI Spanner lebih lanjut, lihat Bagaimana cara kerja integrasi Vertex AI Spanner?.

Membuat prediksi

Anda dapat menggunakan emulator untuk membuat prediksi menggunakan fungsi prediksi Spanner ML.

Perilaku default

Anda dapat menggunakan model apa pun yang di-deploy ke endpoint dengan emulator Spanner untuk membuat prediksi. Contoh berikut menggunakan model yang disebut FraudDetection untuk menghasilkan hasil.

GoogleSQL

Untuk mempelajari lebih lanjut cara menggunakan fungsi ML.PREDICT guna membuat prediksi, lihat Membuat prediksi ML menggunakan SQL.

Mendaftarkan model

Sebelum dapat menggunakan model dengan fungsi ML.PREDICT, Anda harus mendaftarkan model menggunakan pernyataan CREATE MODEL dan memberikan nilai input dan 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'
);

Ganti kode berikut:

  • PROJECT_ID: ID project Google Cloud tempat model berada

  • REGION_ID: ID Google Cloud region tempat model berada—misalnya, us-central1

  • ENDPOINT_ID: ID endpoint model

Menjalankan prediksi

Gunakan fungsi GoogleSQL ML.PREDICT untuk membuat prediksi.

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

Output yang diharapkan dari kueri ini adalah TRUE.

PostgreSQL

Untuk mempelajari lebih lanjut cara menggunakan fungsi spanner.ML_PREDICT_ROW untuk membuat prediksi, lihat Membuat prediksi ML menggunakan SQL.

Menjalankan prediksi

Gunakan fungsi PostgreSQL spanner.ML_PREDICT_ROW untuk menghasilkan prediksi Anda.

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

Ganti kode berikut:

  • PROJECT_ID: ID project Google Cloud tempat model berada

  • REGION_ID: ID Google Cloud region tempat model berada—misalnya, us-central1

  • ENDPOINT_ID: ID endpoint model

Output yang diharapkan dari kueri ini adalah TRUE.

Callback Kustom

Anda dapat menggunakan fungsi callback kustom untuk menerapkan perilaku model yang dipilih, dan untuk mengubah input model tertentu menjadi output. Contoh berikut menggunakan model gemini-pro dari Vertex AI Model Garden dan emulator Spanner untuk membuat prediksi menggunakan callback kustom.

Saat menggunakan callback kustom untuk model, Anda harus membuat fork repositori emulator Spanner, lalu mem-build dan men-deploy-nya. Untuk informasi selengkapnya tentang cara mem-build dan men-deploy emulator Spanner, lihat panduan memulai emulator Spanner.

GoogleSQL

Mendaftarkan model

Sebelum dapat menggunakan model dengan fungsi ML.PREDICT, Anda harus mendaftarkan model menggunakan pernyataan 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
);

Karena emulator tidak terhubung ke Vertex AI, Anda harus memberikan nilai input dan output.

Ganti kode berikut:

  • PROJECT_ID: ID project Google Cloud tempat model berada

  • REGION_ID: ID Google Cloud region tempat model berada—misalnya, us-central1

Callback

Gunakan callback untuk menambahkan logika kustom ke model 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);
}

Menjalankan prediksi

Gunakan fungsi GoogleSQL ML.PREDICT untuk membuat prediksi.

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

Output yang diharapkan dari kueri ini adalah "YES".

PostgreSQL

Gunakan fungsi PostgreSQL spanner.ML_PREDICT_ROW untuk menghasilkan prediksi Anda.

Callback

Gunakan callback untuk menambahkan logika kustom ke model 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);
}

Menjalankan prediksi

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

Ganti kode berikut:

  • PROJECT_ID: ID project Google Cloud tempat model berada

  • REGION_ID: ID Google Cloud region tempat model berada, misalnya, us-central1

Output yang diharapkan dari kueri ini adalah "YES".

Apa langkah selanjutnya?