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

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

このチュートリアルでは、Gemini モデルを使用してユーザーの質問に答える chatbot のような関数に Remote Config を追加します。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: プロジェクトを初期化し、ノードの依存関係をインストールする

  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. --save を使用して次のコマンドを実行して、Admin SDK パッケージと Vertex AI パッケージを追加します。パッケージが 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 起動元] を選択します。
  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. [Next]、[Deploy] の順にクリックします。

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

次のステップ