Cloud Functions と Vertex AI でサーバーサイドの Remote Config を使用する

このガイドでは、サーバーサイドの Remote Config を備えた第 2 世代の Cloud Functions を使用して、Vertex AI Gemini API へのサーバー側呼び出しを開始する方法について説明します。

このチュートリアルでは、Remote Config を、Gemini モデルを使用してユーザーの質問に回答する chatbot のような関数に追加します。Remote Config は Gemini API 入力(受信ユーザークエリの先頭に追加するプロンプトを含む)を管理し、Firebase コンソールからオンデマンドでこれらの入力を更新できます。また、Firebase Local Emulator Suite を使用して関数をテストしてデバッグし、動作を確認した後、Google Cloud にデプロイしてテストします。

前提条件

このガイドは、JavaScript を使用したアプリケーション開発に精通していることを前提としています。

Firebase プロジェクトを設定します

Firebase プロジェクトをまだ作成していない場合:

  1. Firebase コンソールにログインします。

  2. [プロジェクトを作成] をクリックし、次のいずれかのオプションを使用します。

    • オプション 1: 「プロジェクトの作成」ワークフローの最初のステップで新しいプロジェクト名を入力して、新しい Firebase プロジェクトを(およびその基盤となる Google Cloud プロジェクトを自動的に)作成します。
    • オプション 2: 「プロジェクトの作成」ワークフローの最初のステップで、ドロップダウン メニューから Google Cloud プロジェクト名を選択して、既存の Google Cloud プロジェクトに「Firebase を追加」します。
  3. プロンプトが表示されても、このソリューションを使用するために Google アナリティクスを設定する必要はありません

  4. 画面上の手順に沿ってプロジェクトを作成します。

Firebase プロジェクトをすでにお持ちの場合:

開発環境を構成するに進みます。

開発環境を構成します

関数を作成するには Node.js 環境が必要です。また、Cloud Functions ランタイムに関数をデプロイするには Firebase CLI が必要です。

  1. Node.jsnpm をインストールします。

    Node.js と npm をインストールする場合は、Node Version Manager を使用することをおすすめします。

  2. 好みの方法で Firebase CLI をインストールします。たとえば、npm を使用して CLI をインストールするには、次のコマンドを実行します。

    npm install -g firebase-tools@latest
    

    これにより、グローバルに使用できる firebase コマンドがインストールされます。このコマンドが失敗した場合は、npm アクセス権の変更が必要になる場合があります。

    firebase-tools を最新バージョンに更新するには、同じコマンドを再実行します。

  3. firebase-functionsfirebase-admin をインストールし、--save を使用して package.json に保存します。

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

これで、このソリューションの実装に進む準備が整いました。

実装

Remote Config と Vertex AI を使用して第 2 世代の Cloud Functions の関数を作成、テスト、デプロイする手順は次のとおりです。

  1. Google Cloud コンソールで Vertex AI の推奨 API を有効にします
  2. プロジェクトを初期化し、ノードの依存関係をインストールします
  3. Admin SDK サービス アカウントの IAM 権限を構成して、キーを保存します
  4. 関数を作成します
  5. サーバー固有の Remote Config テンプレートを作成します
  6. 関数をデプロイして Firebase Local Emulator Suite でテストします。
  7. 関数を Google Cloud にデプロイします。

ステップ 1: Google Cloud コンソールで Vertex AI の推奨 API を有効にする

  1. Google Cloud コンソールを開き、プロンプトが表示されたらプロジェクトを選択します。
  2. コンソールの上部にある [検索] フィールドに、[Vertex AI] を入力し、結果として [Vertex AI] が表示されるまで待ちます。
  3. [Vertex AI] を選択します。Vertex AI ダッシュボードが表示されます。
  4. [すべての推奨 API を有効化] をクリックします。

    API の有効化が完了するまで少し時間がかかることがあります。有効化が完了するまで、このページをアクティブにして開いたままにします。

  5. 課金が有効になっていない場合は、Cloud 請求先アカウントを追加またはリンクするように求められます。請求先アカウントを有効にしたら、Vertex AI ダッシュボードに戻り、推奨 API がすべて有効になっていることを確認します。

ステップ 2: プロジェクトを初期化して Node の依存関係をインストールする

  1. パソコンでターミナルを開き、関数を作成するディレクトリに移動します。
  2. Firebase にログインします。

    firebase login
    
  3. 次のコマンドを実行して、Cloud Functions for Firebase を初期化します。

    firebase init functions
    
  4. [既存のプロジェクトを使用する] を選択し、プロジェクト ID を指定します。

  5. 使用する言語を選択するように求められたら、[JavaScript] を選択して Enter キーを押します。

  6. その他のオプションでは、デフォルトを選択します。

    現在のディレクトリに functions ディレクトリが作成されます。中には、関数の作成に使用する index.js ファイル、関数の依存関係を含む node_modules ディレクトリ、パッケージの依存関係を含む package.json ファイルがあります。

  7. 次のコマンドを実行して Admin SDK と Vertex AI パッケージを追加し、--save を使用して package.json ファイルに保存します。

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

functions/package.json ファイルは、最新バージョンを指定して次のようにします。

  {
    "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
  }

ESLint を使用している場合は、ESLint を含むスタンザが表示されます。また、ノード エンジンのバージョンが、インストールした Node.js のバージョンと、最終的に Google Cloud で実行するバージョンと一致していることを確認してください。たとえば、package.jsonengines スタンザが Node バージョン 18 として構成されており、Node.js 20 を使用している場合は、20 を使用するようにファイルを更新します。

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

ステップ 3: Admin SDK サービス アカウントの IAM 権限を構成してキーを保存する

このソリューションでは、Firebase Admin SDK サービス アカウントを使用して、関数を実行します。

  1. Google Cloud コンソールで IAM と管理ページを開き、Admin SDK サービス アカウント(firebase-adminsdk)を見つけます。
  2. アカウントを選択し、[プリンシパルの編集] をクリックします。[アクセス権の編集] ページが表示されます。
  3. [別のロールを追加] をクリックし、[Remote Config 閲覧者] を選択します。
  4. [別のロールを追加] をクリックし、[AI プラットフォーム デベロッパー] を選択します。
  5. [別のロールを追加] をクリックし、[Vertex AI ユーザー] を選択します。
  6. [別のロールを追加] をクリックし、[Cloud Run Invoker] を選択します。
  7. [保存] をクリックします。

次に、Admin SDK サービス アカウントの認証情報をエクスポートして、GOOGLE_APPLICATION_CREDENTIALS 環境変数に保存します。

  1. Google Cloud コンソールで クルデンシャル ページを開きます。
  2. Admin SDK サービス アカウントをクリックして、[詳細] ページを開きます。
  3. [キー] をクリックします。
  4. [鍵を追加] > [新しい鍵を作成] をクリックします。
  5. [鍵のタイプ] に [JSON] が選択されていることを確認し、[作成] をクリックします。
  6. 鍵をパソコンの安全な場所にダウンロードします。
  7. ターミナルから、鍵を環境変数としてエクスポートします。

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

ステップ 4: 関数を作成する

このステップでは、ユーザー入力を処理してAI を活用した回答を生成する関数を作成します。複数のコード スニペットを組み合わせて、Admin SDK と Vertex AI Gemini API を初期化し、Remote Config を使用してデフォルトのパラメータを構成し、最新の Remote Config パラメータを取得し、ユーザー入力を処理して、ユーザーにレスポンスをストリーミングする包括的な関数を構築します。

  1. コードベースで、テキスト エディタまたは IDE で functions/index.js を開きます。
  2. 既存のコンテンツを削除し、Admin SDK、Remote Config、Vertex AI SDK を追加して、次のコードをファイルに貼り付けてアプリを初期化します。

    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. Remote Config サーバーに接続できない場合に関数が使用するデフォルト値を構成します。このソリューションでは、textModelgenerationConfigsafetySettingstextPromptlocation を Remote Config パラメータとして構成します。これらのパラメータは、このガイドで後ほど構成する Remote Config パラメータに対応しています。これらのパラメータの詳細については、Vertex AI Node.js クライアントをご覧ください。

    必要に応じて、Vertex AI Gemini API にアクセスするかどうかを制御するパラメータ(この例では vertex_enabled というパラメータ)を構成することもできます。この設定は、関数をテストするときに役立ちます。次のコード スニペットでは、この値は false に設定されており、基本的な関数のデプロイをテストする際に Vertex AI の使用がスキップされます。true に設定すると、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. 関数を作成し、サーバーサイドの Remote Config を設定します。

    // 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. Vertex AI を設定し、チャットとレスポンスのロジックを追加します。

      // 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. ファイルを保存して閉じます。

をご覧ください。

ステップ 5: サーバー固有の Remote Config テンプレートを作成する

次に、サーバー側の Remote Config テンプレートを作成して、パラメータと関数で使用する値を構成します。サーバー固有のリモート コンフィグ テンプレートを作成するには:

  1. Firebase コンソールを開き、ナビゲーション メニューで [実行] を展開して、[Remote Config] を選択します。
  2. Remote Config ページの上部にある [Client/Server] セレクタから [Server] を選択します。

    • Remote Config またはサーバー テンプレートを初めて使用する場合は、 [構成を作成] をクリックします。[最初のサーバーサイド パラメータを作成] ペインが表示されます。
    • Remote Config サーバー テンプレートを初めて使用する場合は、 [パラメータを追加] をクリックします。
  3. 次の Remote Config パラメータを定義します。

    パラメータ名 説明 タイプ デフォルト値
    model_name モデル名
    コードで使用するモデル名の最新のリストについては、モデルのバージョンとライフサイクルまたは使用可能なモデル名をご覧ください。
    文字列 gemini-1.5-pro-preview-0514
    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!
    generation_config モデルに送信するパラメータ JSON [{"stopSequences": ["I hope this helps"],"temperature": 0.7,"maxOutputTokens": 512, "topP": 0.1,"topK": 20}]
    safety_settings Vertex AI の安全性設定 JSON [{"category": "HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "HarmBlockThreshold.BLOCK_LOW_AND_ABOVE"}]
    location Vertex AI サービスとモデルを実行するロケーション 文字列 us-central1
    is_vertex_enabled Vertex AI にクエリを送信するかどうかを制御するオプションのパラメータ。 ブール値 true
  4. パラメータの追加が完了したら、パラメータとそのデータ型が正しいことを再度確認し、[変更を公開] をクリックします。

ステップ 6: 関数をデプロイして Firebase Local Emulator Suite でテストする

これで、Firebase Local Emulator Suite を使用して関数をローカルにデプロイしてテストする準備が整いました。

  1. ステップ 3: Admin SDK サービス アカウントの IAM 権限を構成する」の説明に従って、GOOGLE_APPLICATION_CREDENTIALS を環境変数として設定し、キーを保存していることを確認します。次に、functions ディレクトリの親ディレクトリから、関数を Firebase エミュレータにデプロイします。

    firebase emulators:start --project PROJECT_ID --only functions
    
  2. エミュレータのログのページを開きます。関数が読み込まれたことが表示されます。

  3. 次のコマンドを実行して関数にアクセスします。ここで、 PROJECT_ID はプロジェクト ID、LOCATION は関数をデプロイしたリージョン(例: us-central1)です。

    curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex
    
  4. レスポンスが返されるまで待ってから、Firebase Emulator のログページまたはコンソールに戻り、エラーや警告がないか確認します。

  5. ユーザー入力を送信しますが、is_vertex_enabled は Remote Config サーバー テンプレートで構成されているために、Vertex AI Gemini API を介して Gemini にアクセスし、料金が発生する可能性があることに注意してください。

    curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex?prompt=Tell%20me%20everything%20you%20know%20about%20cats
    
  6. Firebase コンソールで Remote Config サーバー テンプレートに変更を加えます。その後、関数に再度アクセスして変更を確認します。

ステップ 7: 関数を Google Cloud にデプロイする

関数をテストして検証したら、Google Cloud にデプロイしてライブ関数をテストする準備が整います。

関数をデプロイする

Firebase CLI を使用して関数をデプロイします。

firebase deploy --only functions

関数への未認証アクセスをブロックする

Firebase を使用して関数をデプロイする場合、組織のポリシーで制限されていない限り、デフォルトで未認証の呼び出しが許可されます。テスト中、および App Check で保護する前に、認証されていないアクセスをブロックすることをおすすめします。

関数への認証されていないアクセスをブロックするには:

  1. Google Cloud コンソールで Cloud Run を開きます。

  2. [generateWithVertex] をクリックし、[セキュリティ] タブをクリックします。

  3. [認証を要求する] を有効にして、[保存] をクリックします。

Admin SDK サービス アカウントの認証情報を使用するようにユーザー アカウントを構成する

Admin SDK サービス アカウントには、関数を実行し、Remote Config と Vertex AI Gemini API を操作するために必要なすべてのロールと権限が付与されているため、このアカウントを使用して関数を実行することをおすすめします。これを行うには、ユーザー アカウントからそのアカウントのトークンを作成できる必要があります。

次の手順では、ユーザー アカウントと、Admin SDK サービス アカウントの権限で実行する関数を構成する方法について説明します。

  1. Google Cloud コンソールで、IAM Service Account Credentials API を有効にします。
  2. ユーザー アカウントにサービス アカウント トークン作成者のロールを付与します。 Google Cloud コンソールで、[IAM と管理] > [IAM] を開き、ユーザー アカウントを選択して、[プリンシパルの編集] > [別のロールを追加] をクリックします。
  3. [サービス アカウント トークン作成者] を選択し、[保存] をクリックします。

    サービス アカウントの権限借用の詳細については、Google Cloud ドキュメントのサービス アカウントの権限借用をご覧ください。

  4. Google Cloud コンソールの [Cloud Functions] ページを開きます。 [関数] リストで [generateWithVertex] 関数をクリックします。

  5. [トリガー] > [編集] を選択し、ランタイム、ビルド、接続、セキュリティ設定を展開します。

  6. [ランタイム] タブで、[ランタイム サービス アカウント] を [Admin SDK アカウント] に変更します。

  7. [次へ]、[デプロイ] の順にクリックします。

gcloud CLI を設定する

コマンドラインから関数を安全に実行してテストするには、Cloud Functions サービスで認証を行い、有効な認証トークンを取得する必要があります。

トークンの生成を有効にするには、gcloud CLI をインストールして構成します。

  1. まだコンピュータにインストールされていない場合は、gcloud CLI をインストールするの手順に沿って gcloud CLI をインストールします。

  2. Google Cloud アカウントのアクセス認証情報を取得します。

    gcloud auth login
    
  3. gcloud でプロジェクト ID を設定します。

    gcloud config set project PROJECT_ID
    

関数をテストする

これで、Google Cloud で関数をテストする準備が整いました。関数をテストするには、次のコマンドを実行します。

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

ユーザー提供のデータでもう一度お試しください。

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"

これで、Remote Config サーバー テンプレートに変更を加え、その変更を公開し、さまざまなオプションをテストできるようになりました。

次のステップ