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. プロジェクトを初期化して Node の依存関係をインストールします
  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: プロジェクトを初期化し、ノードの依存関係をインストールする

  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 Platform デベロッパー] を選択します。
  5. [別のロールを追加] をクリックし、[Vertex AI ユーザー] を選択します。
  6. [別のロールを追加] をクリックし、[Cloud Run 起動元] を選択します。
  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 テンプレートを作成して、パラメータと関数で使用する値を構成します。サーバー固有の Remote Config テンプレートを作成するには:

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

    • 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 サーバー テンプレートに変更を加え、その変更を公開し、さまざまなオプションをテストできるようになりました。

次のステップ