Menggunakan Remote Config sisi server dengan Cloud Functions dan Vertex AI

Panduan ini menjelaskan cara mulai menggunakan Cloud Functions generasi ke-2 dengan Remote Config sisi server untuk membuat panggilan sisi server ke Vertex AI Gemini API.

Dalam tutorial ini, Anda akan menambahkan Remote Config ke fungsi seperti chatbot yang menggunakan model Gemini untuk menjawab pertanyaan pengguna. Remote Config akan mengelola input Gemini API (termasuk prompt yang akan ditambahkan ke kueri pengguna yang masuk), dan Anda dapat memperbarui input ini sesuai permintaan dari Firebase console. Anda juga akan menggunakan Firebase Local Emulator Suite untuk menguji dan men-debug fungsi, dan setelah memverifikasi bahwa fungsi tersebut berfungsi, Anda akan mengujinya di Google Cloud.

Prasyarat

Panduan ini mengasumsikan bahwa Anda sudah terbiasa menggunakan JavaScript untuk mengembangkan aplikasi.

Menyiapkan project Firebase

Jika Anda belum memiliki project Firebase:

  1. Login ke Firebase console.

  2. Klik Create project, lalu gunakan salah satu opsi berikut:

    • Opsi 1: Buat project Firebase baru (dan project Google Cloud yang mendasarinya secara otomatis) dengan memasukkan nama project baru di langkah pertama dalam alur kerja "Create project".
    • Opsi 2: "Tambahkan Firebase" ke project Google Cloud yang ada dengan memilih nama project Google Cloud dari menu drop-down di langkah pertama dalam alur kerja "Create project".
  3. Saat diminta, Anda tidak perlu menyiapkan Google Analytics untuk menggunakan solusi ini.

  4. Lanjutkan mengikuti petunjuk di layar untuk membuat project Anda.

Jika Anda sudah memiliki project Firebase:

Lanjutkan ke Mengonfigurasi lingkungan pengembangan Anda.

Mengonfigurasi lingkungan pengembangan Anda

Anda akan memerlukan lingkungan Node.js untuk menulis fungsi, dan Firebase CLI untuk men-deploy fungsi ke runtime Cloud Functions.

  1. Instal Node.js dan npm.

    Untuk menginstal Node.js dan npm, sebaiknya gunakan Node Version Manager.

  2. Instal Firebase CLI menggunakan metode pilihan Anda. Misalnya, untuk menginstal CLI menggunakan npm, jalankan perintah berikut:

    npm install -g firebase-tools@latest
    

    Perintah ini akan menginstal perintah firebase yang tersedia secara global. Jika perintah gagal, Anda mungkin perlu mengubah izin npm.

    Untuk mengupdate ke versi terbaru firebase-tools, jalankan kembali perintah yang sama.

  3. Instal firebase-functions dan firebase-admin, lalu gunakan --save untuk menyimpan keduanya ke package.json:

    npm install firebase-functions@latest firebase-admin@latest --save
    

Anda kini siap untuk melanjutkan ke penerapan solusi ini.

Penerapan

Ikuti langkah-langkah berikut untuk membuat, menguji, dan men-deploy Cloud Functions generasi ke-2 dengan Remote Config dan Vertex AI:

  1. Aktifkan API yang direkomendasikan Vertex AI di Konsol Google Cloud.
  2. Inisialisasi project Anda dan instal dependensi Node.
  3. Konfigurasikan izin IAM untuk akun layanan Admin SDK dan simpan kunci Anda.
  4. Buat fungsi.
  5. Buat template Remote Config khusus server.
  6. Deploy fungsi dan uji di Firebase Local Emulator Suite.
  7. Deploy fungsi Anda ke Google Cloud.

Langkah 1: Aktifkan API yang direkomendasikan Vertex AI di Konsol Google Cloud

  1. Buka Konsol Google Cloud, dan saat diminta, pilih project Anda.
  2. Pada kolom Search di bagian atas konsol, masukkan Vertex AI dan tunggu hingga Vertex AI muncul.
  3. Pilih Vertex AI. Dasbor Vertex AI akan muncul.
  4. Klik Enable All Recommended APIs.

    Mungkin perlu waktu beberapa saat hingga pengaktifan API selesai. Biarkan halaman tetap aktif dan terbuka hingga pengaktifan selesai.

  5. Jika penagihan tidak diaktifkan, Anda akan diminta untuk menambahkan atau menautkan Akun Penagihan Cloud. Setelah mengaktifkan akun penagihan, kembali ke dasbor Vertex AI dan pastikan semua API yang direkomendasikan sudah aktif.

Langkah 2: Inisialisasi project Anda dan instal dependensi Node

  1. Buka terminal di komputer Anda dan arahkan ke direktori tempat Anda berencana untuk membuat fungsi Anda.
  2. Login ke Firebase:

    firebase login
    
  3. Jalankan perintah berikut untuk menginisialisasi Cloud Functions for Firebase:

    firebase init functions
    
  4. Pilih Use an existing project dan tentukan project ID Anda.

  5. Saat diminta memilih bahasa yang akan digunakan, pilih JavaScript dan tekan Enter.

  6. Untuk opsi lainnya, pilih default.

    Direktori functions dibuat di direktori saat ini. Di dalamnya, Anda akan menemukan file index.js yang akan digunakan untuk membangun fungsi, direktori node_modules yang berisi dependensi untuk fungsi Anda, dan file package.json yang berisi dependensi paket.

  7. Tambahkan paket Admin SDK dan Vertex AI dengan menjalankan perintah berikut, menggunakan --save untuk memastikan bahwa paket tersebut disimpan ke file package.json:

    cd functions
    npm install firebase-admin@latest @google-cloud/vertexai --save
    

File functions/package.json Anda kini akan terlihat seperti berikut, dengan versi terbaru yang ditentukan:

  {
    "name": "functions",
    "description": "Cloud Functions for Firebase",
    "scripts": {
      "serve": "firebase emulators:start --only functions",
      "shell": "firebase functions:shell",
      "start": "npm run shell",
      "deploy": "firebase deploy --only functions",
      "logs": "firebase functions:log"
    },
    "engines": {
      "node": "20"
    },
    "main": "index.js",
    "dependencies": {
      "@google-cloud/vertexai": "^1.1.0",
      "firebase-admin": "^12.1.0",
      "firebase-functions": "^5.0.0"
    },
    "devDependencies": {
      "firebase-functions-test": "^3.1.0"
    },
    "private": true
  }

Perlu diperhatikan bahwa jika Anda menggunakan ESLint, Anda akan melihat stanza yang menyertakannya. Selain itu, pastikan versi engine node cocok dengan versi Node.js yang diinstal dan versi akhirnya Anda jalankan di Google Cloud. Misalnya, jika stanza engines di package.json Anda dikonfigurasi sebagai Node versi 18 dan Anda menggunakan Node.js 20, perbarui file untuk menggunakan versi 20:

  "engines": {
    "node": "20"
  },

Langkah 3: Konfigurasikan izin IAM untuk akun layanan Admin SDK dan simpan kunci Anda

Dalam solusi ini, Anda akan menggunakan akun layanan Firebase Admin SDK untuk menjalankan fungsi Anda.

  1. Di Konsol Google Cloud, buka halaman IAM & Admin, lalu cari akun layanan Admin SDK (yang bernama firebase-adminsdk).
  2. Pilih akun dan klik Edit principal. Halaman Akses edit akan muncul.
  3. Klik Add another role, lalu pilih Remote Config Viewer.
  4. Klik Add another role, lalu pilih AI platform developer.
  5. Klik Add another role, lalu pilih Vertex AI user.
  6. Klik Add another role, lalu pilih Cloud Run Invoker.
  7. Klik Save.

Selanjutnya, ekspor kredensial untuk akun layanan Admin SDK dan simpan di variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS Anda.

  1. Di Konsol Google Cloud, buka halaman Credentials.
  2. Klik akun layanan Admin SDK untuk membuka halaman Details.
  3. Klik Kunci.
  4. Klik Add key > Create new key.
  5. Pastikan JSON dipilih sebagai Key type, lalu klik Create.
  6. Download kunci ke tempat yang aman di komputer.
  7. Dari terminal Anda, ekspor kunci sebagai variabel lingkungan:

    export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-key.json"
    

Langkah 4: Buat fungsi

Pada langkah ini, Anda akan membuat fungsi yang menangani input pengguna dan menghasilkan respons yang didukung teknologi AI. Anda akan menggabungkan beberapa cuplikan kode untuk membangun fungsi komprehensif yang menginisialisasi Admin SDK dan Vertex AI Gemini API, mengonfigurasi parameter default menggunakan Remote Config, mengambil parameter Remote Config terbaru, memproses input pengguna, dan mengalirkan respons kembali ke pengguna.

  1. Di codebase Anda, buka functions/index.js di editor teks atau IDE.
  2. Hapus konten yang ada, lalu tambahkan Admin SDK, Remote Config, dan Vertex AI SDK. Kemudian, lakukan inisialisasi kepada aplikasi dengan menempelkan kode berikut ke dalam file:

    const { onRequest } = require("firebase-functions/v2/https");
    const logger = require("firebase-functions/logger");
    
    const { initializeApp } = require("firebase-admin/app");
    const { VertexAI } = require('@google-cloud/vertexai');
    const { getRemoteConfig } = require("firebase-admin/remote-config");
    
    // Set and check environment variables.
    const project = process.env.GCLOUD_PROJECT;
    
    // Initialize Firebase.
    const app = initializeApp();
    
  3. Konfigurasikan nilai default yang akan digunakan fungsi Anda jika tidak dapat terhubung ke server Remote Config. Solusi ini akan mengonfigurasi textModel, generationConfig, safetySettings, textPrompt, dan location sebagai Parameter Remote Config yang sesuai dengan parameter Remote Config yang akan Anda konfigurasi lebih lanjut dalam panduan ini. Untuk mengetahui informasi selengkapnya tentang parameter ini, lihat Klien Node.js Vertex AI.

    Secara opsional, Anda juga dapat mengonfigurasi parameter untuk mengontrol apakah Anda mengakses Vertex AI Gemini API atau tidak (dalam contoh ini, parameter yang disebut vertex_enabled). Penyiapan ini dapat berguna saat menguji fungsi Anda. Dalam cuplikan kode berikut, nilai ini ditetapkan ke false, yang akan melewati penggunaan Vertex AI saat Anda menguji deployment fungsi dasar. Menyetelnya ke true akan memanggil Vertex AI Gemini API.

    // Define default (fallback) parameter values for Remote Config.
    const defaultConfig = {
    
      // Default values for Vertex AI.
      model_name: "gemini-1.5-flash-preview-0514",
      generation_config: [{
        "stopSequences": [], "temperature": 0.7,
        "maxOutputTokens": 64, "topP": 0.1, "topK": 20
      }],
      prompt: "I'm a developer who wants to learn about Firebase and you are a \
        helpful assistant who knows everything there is to know about Firebase!",
      safety_settings: [{
        "category":
          "HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT",
        "threshold": "HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE"
      }],
      location: 'us-central1',
    
      // Disable Vertex AI Gemini API access for testing.
      vertex_enabled: false
    };
    
  4. Membuat fungsi dan menyiapkan Remote Config sisi server:

    // Export the function.
    exports.generateWithVertex = onRequest(async (request, response) => {
    
      try {
    
        // Set up Remote Config.
        const rc = getRemoteConfig(app);
    
        // Get the Remote Config template and assign default values.
        const template = await rc.getServerTemplate({
          defaultConfig: defaultConfig
        });
    
        // Add the template evaluation to a constant.
        const config = template.evaluate();
    
        // Obtain values from Remote Config.
        const textModel = config.getString("model_name") ||
            defaultConfig.model_name;
        const textPrompt = config.getString("prompt") || defaultConfig.prompt;
        const generationConfig = config.getString("generation_config") ||
            defaultConfig.generation_config;
        const safetySettings = config.getString("safety_settings") ||
            defaultConfig.safety_settings;
        const location = config.getString("location") ||
            defaultConfig.location;
        const vertexEnabled = config.getBoolean("is_vertex_enabled") ||
            defaultConfig.vertex_enabled;
    
  5. Siapkan Vertex AI dan tambahkan logika chat dan respons:

      // Allow user input.
      const userInput = request.query.prompt || '';
    
      // Instantiate Vertex AI.
        const vertex_ai = new VertexAI({ project: project, location: location });
        const generativeModel = vertex_ai.getGenerativeModel({
          model: textModel,
          safety_settings: safetySettings,
          generation_config: generationConfig,
        });
    
        // Combine prompt from Remote Config with optional user input.
        const chatInput = textPrompt + " " + userInput;
    
        if (!chatInput) {
          return res.status(400).send('Missing text prompt');
        }
        // If vertexEnabled isn't true, do not send queries to Vertex AI.
        if (vertexEnabled !== true) {
          response.status(200).send({
            message: "Vertex AI call skipped. Vertex is not enabled."
          });
          return;
        }
    
        logger.log("\nRunning with model ", textModel, ", prompt: ", textPrompt,
          ", generationConfig: ", generationConfig, ", safetySettings: ",
          safetySettings, " in ", location, "\n");
    
        const result = await generativeModel.generateContentStream(chatInput); 
        response.writeHead(200, { 'Content-Type': 'text/plain' });
    
        for await (const item of result.stream) {
          const chunk = item.candidates[0].content.parts[0].text;
          logger.log("Received chunk:", chunk);
          response.write(chunk);
        }
    
        response.end();
    
      } catch (error) {
        logger.error(error);
        response.status(500).send('Internal server error');
      }
    });
    
  6. Simpan dan tutup file tersebut.

Langkah 5: Buat template Remote Config khusus server

Selanjutnya, buat template Remote Config sisi server serta konfigurasikan parameter dan nilai untuk digunakan dalam fungsi Anda. Untuk membuat template Remote Config khusus server:

  1. Buka Firebase console, dan dari menu navigasi, luaskan Run, lalu pilih Remote Config.
  2. Pilih Server dari pemilih Client/Server di bagian atas halaman Remote Config.

    • Jika ini pertama kalinya Anda menggunakan template Remote Config atau server, klik Create Configuration. Panel Create your first server-side parameter akan muncul.
    • Jika ini bukan pertama kalinya Anda menggunakan template server Remote Config, klik Add parameter.
  3. Tentukan parameter Remote Config berikut:

    Nama parameter Deskripsi Type Nilai default
    model_name Nama model
    Untuk daftar terbaru nama model yang akan digunakan dalam kode Anda, lihat Versi dan siklus proses model atau Nama model yang tersedia.
    String gemini-1.5-pro-preview-0514
    prompt Prompt untuk menambahkan permintaan pengguna. String I'm a developer who wants to learn about Firebase and you are a helpful assistant who knows everything there is to know about Firebase!
    generation_config Parameter yang akan dikirim ke model. JSON [{"stopSequences": ["I hope this helps"],"temperature": 0.7,"maxOutputTokens": 512, "topP": 0.1,"topK": 20}]
    safety_settings Setelan keamanan untuk Vertex AI. JSON [{"category": "HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "HarmBlockThreshold.BLOCK_LOW_AND_ABOVE"}]
    location Lokasi untuk menjalankan layanan dan model Vertex AI. String us-central1
    is_vertex_enabled Parameter opsional yang mengontrol apakah kueri dikirim ke Vertex AI. Boolean true
  4. Setelah selesai menambahkan parameter, periksa kembali parameter Anda dan pastikan jenis datanya sudah benar, lalu klik Publish changes.

Langkah 6: Deploy fungsi dan uji di Firebase Local Emulator Suite

Anda kini siap untuk men-deploy dan menguji fungsi secara lokal dengan Firebase Local Emulator Suite.

  1. Pastikan Anda telah menetapkan GOOGLE_APPLICATION_CREDENTIALS sebagai variabel lingkungan seperti yang dijelaskan di Langkah 3: Konfigurasikan izin IAM untuk akun layanan Admin SDK dan simpan kunci Anda . Kemudian, dari direktori induk direktori functions Anda, deploy fungsi ke emulator Firebase:

    firebase emulators:start --project PROJECT_ID --only functions
    
  2. Buka halaman log emulator . Tindakan ini akan menunjukkan bahwa fungsi Anda telah dimuat.

  3. Akses fungsi Anda dengan menjalankan perintah berikut, dengan PROJECT_ID adalah project ID Anda dan LOCATION adalah region tempat Anda men-deploy fungsi tersebut (misalnya, us-central1):

    curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex
    
  4. Tunggu respons, lalu kembali ke halaman log Firebase Emulator atau konsol Anda dan periksa apakah terdapat error atau peringatan.

  5. Coba kirimkan beberapa input pengguna, yang menandai bahwa karena is_vertex_enabled dikonfigurasi di template server Remote Config Anda, ini seharusnya mengakses Gemini melalui Vertex AI Gemini API dan mungkin dikenakan biaya:

    curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex?prompt=Tell%20me%20everything%20you%20know%20about%20cats
    
  6. Buat perubahan pada template server Remote Config Anda di Firebase console, lalu akses ulang fungsi Anda untuk mengamati perubahan.

Langkah 7: Deploy fungsi Anda ke Google Cloud

Setelah menguji dan memverifikasi fungsi, Anda kini siap untuk men-deploy ke Google Cloud dan menguji fungsi langsung.

Men-deploy function

Deploy fungsi Anda menggunakan Firebase CLI:

firebase deploy --only functions

Memblokir akses yang tidak diautentikasi ke fungsi

Ketika fungsi di-deploy menggunakan Firebase, pemanggilan yang tidak diautentikasi diperbolehkan secara default jika kebijakan organisasi Anda tidak membatasinya. Selama pengujian dan sebelum mengamankan dengan App Check, sebaiknya blokir akses yang tidak diautentikasi.

Untuk memblokir akses yang tidak diautentikasi ke fungsi:

  1. Di Konsol Google Cloud, buka Cloud Run.

  2. Klik generateWithVertex, lalu klik tab Security.

  3. Aktifkan Require authentication, lalu klik Save.

Mengonfigurasi akun pengguna Anda untuk menggunakan kredensial akun layanan Admin SDK

Karena akun layanan Admin SDK memiliki semua peran dan izin yang dibutuhkan untuk menjalankan fungsi serta berinteraksi dengan Remote Config dan Vertex AI Gemini API, Anda dapat menggunakannya untuk menjalankan fungsi. Untuk melakukannya, Anda harus dapat membuat token untuk akun tersebut dari akun pengguna Anda.

Langkah-langkah berikut menjelaskan cara mengonfigurasi akun pengguna dan fungsi yang akan dijalankan dengan hak istimewa akun layanan Admin SDK.

  1. Di Konsol Google Cloud, aktifkan IAM Service Account Credentials API.
  2. Berikan peran Service Account Token Creator ke akun pengguna Anda: Dari Konsol Google Cloud, buka IAM & Admin > IAM, pilih akun pengguna Anda, lalu klik Edit principal > Add another role.
  3. Pilih Service Account Token Creator, lalu klik Save.

    Untuk mengetahui informasi selengkapnya tentang peniruan akun layanan, lihat Peniruan akun layanan dalam dokumentasi Google Cloud.

  4. Buka halaman Cloud Functions Konsol Google Cloud, lalu klik fungsi generateWithVertex dalam daftar Functions.

  5. Pilih Trigger > Edit dan luaskan Runtime, build, connections, and security settings.

  6. Dari tab Runtime, ubah Runtime service account menjadi Admin SDK account.

  7. Klik Next, lalu klik Deploy.

Menyiapkan gcloud CLI

Untuk menjalankan dan menguji fungsi dengan aman dari command line, Anda harus melakukan autentikasi dengan layanan Cloud Functions dan mendapatkan token otentikasi yang valid.

Untuk mengaktifkan pembuatan token, instal dan konfigurasikan gcloud CLI:

  1. Jika belum terinstal di komputer Anda, instal gcloud CLI seperti yang dijelaskan dalam Menginstal gcloud CLI.

  2. Dapatkan kredensial akses untuk akun Google Cloud Anda:

    gcloud auth login
    
  3. Tetapkan project ID Anda di gcloud:

    gcloud config set project PROJECT_ID
    

Menguji fungsi

Anda kini siap menguji fungsi di Google Cloud. Untuk menguji fungsi, jalankan perintah berikut:

curl -X POST https://LOCATION-PROJECT_ID.cloudfunctions.net/generateWithVertex \
  -H "Authorization: bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json"

Coba lagi dengan data yang disediakan pengguna:

curl -X POST https://LOCATION-PROJECT_ID.cloudfunctions.net/generateWithVertex?prompt=Tell%20me%20everything%20you%20know%20about%20dogs \
 -H "Authorization: bearer $(gcloud auth print-identity-token)" \
 -H "Content-Type: application/json"

Anda kini dapat membuat perubahan pada template server Remote Config, memublikasikan perubahan tersebut, dan menguji opsi yang berbeda.

Langkah berikutnya