このガイドでは、サーバーサイドの Remote Config を備えた第 2 世代の Cloud Functions を使用して、Vertex AI Gemini API へのサーバー側呼び出しを開始する方法について説明します。
このチュートリアルでは、Gemini モデルを使用してユーザーの質問に回答する chatbot のような関数に Remote Config を追加します。Remote Config は Gemini API 入力(受信ユーザークエリの先頭に追加するプロンプトを含む)を管理し、Firebase コンソールからオンデマンドでこれらの入力を更新できます。また、Firebase Local Emulator Suite を使用して関数をテストしてデバッグし、動作することを確認したら、Google Cloud にデプロイしてテストします。
前提条件
このガイドは、JavaScript を使用したアプリケーション開発に精通していることを前提としています。
Firebase プロジェクトを設定します
Firebase プロジェクトをまだ作成していない場合:
Firebase コンソールにログインする
[プロジェクトを作成] をクリックし、次のいずれかのオプションを使用します。
- オプション 1: 「プロジェクトの作成」ワークフローの最初のステップで新しいプロジェクト名を入力して、新しい Firebase プロジェクトを(およびその基盤となる Google Cloud プロジェクトを自動的に)作成します。
- オプション 2: 「プロジェクトの作成」ワークフローの最初のステップで、ドロップダウン メニューから Google Cloud プロジェクト名を選択して、既存の Google Cloud プロジェクトに「Firebase を追加」します。
プロンプトが表示されたら、このソリューションを使用するように Google Analytics を設定する必要はありません。
画面上の手順に沿ってプロジェクトを作成します。
Firebase プロジェクトをすでに作成している場合:
開発環境を構成するに進みます。
開発環境を構成します
関数を作成するには Node.js 環境が必要です。また、Cloud Functions ランタイムに関数をデプロイするには Firebase CLI が必要です。
-
Node.js と npm をインストールする場合は、Node Version Manager を使用することをおすすめします。
任意の方法で Firebase CLI をインストールします。たとえば、npm を使用して CLI をインストールするには、次のコマンドを実行します。
npm install -g firebase-tools@latest
これにより、グローバルに使用できる
firebase
コマンドがインストールされます。このコマンドが失敗した場合は、npm アクセス権の変更が必要になる場合があります。firebase-tools
を最新バージョンに更新するには、同じコマンドを再実行します。firebase-functions
とfirebase-admin
をインストールし、--save
を使用してpackage.json
に保存します。npm install firebase-functions@latest firebase-admin@latest --save
これで、このソリューションの実装に進むことができます。
実装
Remote Config と Vertex AI を使用して第 2 世代の Cloud Functions を作成、テスト、デプロイする手順は次のとおりです。
- Google Cloud コンソールで Vertex AI 推奨 API を有効にします。
- プロジェクトを初期化して Node の依存関係をインストールします。
- Admin SDK サービス アカウントの IAM 権限を構成して、キーを保存します。
- 関数を作成します。
- サーバー固有の Remote Config テンプレートを作成する。
- 関数をデプロイして Firebase Local Emulator Suite でテストします。
- 関数を Google Cloud にデプロイします。
ステップ 1: Google Cloud コンソールで Vertex AI 推奨 API を有効にする
- Google Cloud コンソールを開き、プロンプトが表示されたらプロジェクトを選択します。
- コンソールの上部にある [検索] フィールドに「Vertex AI」と入力し、結果として「Vertex AI」が表示されるまで待ちます。
- Vertex AI を選択します。Vertex AI ダッシュボードが表示されます。
[すべての推奨 API を有効化] をクリックします。
API の有効化が完了するまで少し時間がかかることがあります。有効化が完了するまで、ページをアクティブで開いたままにします。
課金が有効になっていない場合は、Cloud Billing アカウントを追加またはリンクするように求められます。課金アカウントを有効にしたら、Vertex AI ダッシュボードに戻り、推奨 API がすべて有効になっていることを確認します。
ステップ 2: プロジェクトを初期化して Node の依存関係をインストールする
- コンピュータでターミナルを開き、関数を作成するディレクトリに移動します。
Firebase にログインします。
firebase login
次のコマンドを実行して Cloud Functions for Firebase を初期化します。
firebase init functions
[既存のプロジェクトを使用する] を選択し、プロジェクト ID を指定します。
使用する言語を選択するように求められたら、[JavaScript] を選択して Enter キーを押します。
その他のすべてのオプションに対してデフォルトを選択します。
現在のディレクトリに
functions
ディレクトリが作成されます。中には、関数の作成に使用するindex.js
ファイル、関数の依存関係を含むnode_modules
ディレクトリ、パッケージの依存関係を含むpackage.json
ファイルがあります。次のコマンドを実行して 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.json
の engines
スタンザは Node バージョン 18 として構成されており、Node.js 20 を使用している場合は、20 を使用するようにファイルを更新します。
"engines": {
"node": "20"
},
ステップ 3: Admin SDK サービス アカウントの IAM 権限を構成してキーを保存する
このソリューションでは、Firebase Admin SDK サービス アカウントを使用して関数を実行します。
- Google Cloud コンソールで、[IAM と管理] ページを開き、Admin SDK サービス アカウント(
firebase-adminsdk
という名前)を見つけます。 - アカウントを選択して、[プリンシパルの編集] をクリックします。[アクセス権を編集] ページが表示されます。
- [別のロールを追加] をクリックし、[Remote Config 閲覧者] を選択します。
- [別のロールを追加] をクリックし、[AI Platform デベロッパー] を選択します。
- [別のロールを追加] をクリックし、[Vertex AI ユーザー] を選択します。
- [別のロールを追加] をクリックし、[Cloud Run 起動元] を選択します。
- [保存] をクリックします。
次に、Admin SDK サービス アカウントの認証情報をエクスポートして、GOOGLE_APPLICATION_CREDENTIALS
環境変数に保存します。
- Google Cloud コンソールで、認証情報ページを開きます。
- サービス アカウントの Admin SDK をクリックして、[詳細] ページを開きます。
- [キー] をクリックします。
- [鍵を追加] > [新しい鍵を作成] をクリックします。
- [キーのタイプ] として [JSON] が選択されていることを確認し、[作成] をクリックします。
- キーをコンピュータ上の安全な場所にダウンロードします。
ターミナルから、キーを環境変数としてエクスポートします。
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-key.json"
ステップ 4: 関数を作成する
このステップでは、ユーザー入力を処理してAI を活用した回答を生成する関数を作成します。複数のコード スニペットを組み合わせて、Admin SDK と Vertex AI Gemini API を初期化し、Remote Config を使用してデフォルトのパラメータを構成し、最新の Remote Config パラメータを取得し、ユーザー入力を処理して、ユーザーにレスポンスをストリーミングする包括的な関数を構築します。
- コードベースで、テキスト エディタまたは IDE に
functions/index.js
を開きます。 既存のコンテンツを削除し、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();
Remote Config サーバーに接続できない場合に関数が使用するデフォルト値を構成します。このソリューションでは、
textModel
、generationConfig
、safetySettings
、textPrompt
、location
を 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 };
関数を作成して、サーバーサイドの 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;
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'); } });
ファイルを保存して閉じます。
ステップ 5: サーバー固有の Remote Config テンプレートを作成する
次に、サーバーサイドの Remote Config テンプレートを作成して、関数で使用するパラメータと値を構成します。サーバー固有の Remote Config テンプレートを作成するには:
- Firebase コンソールを開き、ナビゲーション メニューから [実行] を展開して、Remote Config を選択します。
Remote Config ページの上部にある [クライアント/サーバー] セレクタから [サーバー] を選択します。
- Remote Config またはサーバー テンプレートを初めて使用する場合は、[構成を作成] をクリックします。[最初のサーバーサイド パラメータの作成] ペインが表示されます。
- Remote Config サーバー テンプレートを初めて使用する場合は、[パラメータを追加] をクリックします。
次の 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
パラメータの追加が完了したら、パラメータとそのデータ型が正しいことをダブルチェックして、[変更を公開] をクリックします。
ステップ 6: 関数をデプロイして Firebase Local Emulator Suite でテストする
これで、Firebase Local Emulator Suite を使用して関数をローカルにデプロイしてテストする準備が整いました。
「ステップ 3: Admin SDK サービス アカウントの IAM 権限を構成する」の説明に従って、
GOOGLE_APPLICATION_CREDENTIALS
を環境変数として設定し、キーを保存していることを確認します。次に、functions
ディレクトリの親ディレクトリから、関数を Firebase エミュレータにデプロイします。firebase emulators:start --project PROJECT_ID --only functions
エミュレータのログのページを開きます。これにより、関数が読み込まれたことを確認できます。
次のコマンドを実行して関数にアクセスします。ここで、 PROJECT_ID はプロジェクト ID、LOCATION は関数をデプロイしたリージョン(例:
us-central1
)です。curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex
レスポンスが返されたら、Firebase Emulator のログページまたはコンソールに移動して、エラーや警告がないか確認します。
ユーザー入力を送信します。
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
Firebase コンソールで Remote Config サーバー テンプレートに変更を加えます。その後、関数に再度アクセスして変更を確認します。
ステップ 7: 関数を Google Cloud にデプロイする
関数をテストして検証したら、Google Cloud にデプロイしてライブ関数をテストする準備が整います。
関数をデプロイする
Firebase CLI を使用して関数をデプロイします。
firebase deploy --only functions
関数への認証されていないアクセスをブロックする
Firebase を使用して関数をデプロイする場合、組織のポリシーで制限されていない限り、デフォルトで認証されていない呼び出しが許可されます。テスト中、および App Check で保護する前に、認証されていないアクセスをブロックすることを推奨します。
関数への認証されていないアクセスをブロックするには:
Google Cloud コンソールで Cloud Run を開きます。
generateWithVertex
をクリックし、[セキュリティ] タブをクリックします。[認証を要求する] を有効にして、[保存] をクリックします。
Admin SDK サービス アカウントの認証情報を使用するようにユーザー アカウントを構成する
Admin SDK サービス アカウントには、関数を実行し、Remote Config と Vertex AI Gemini API を操作するために必要なすべてのロールと権限があり、これを使用して関数を実行します。これを行うには、ユーザー アカウントからそのアカウントのトークンを作成できる必要があります。
次の手順では、Admin SDK サービス アカウントの権限で実行するようにユーザー アカウントと関数を構成する方法について説明します。
- Google Cloud コンソールで、IAM Service Account Credentials API を有効にします。
- ユーザー アカウントにサービス アカウント トークン作成者のロールを付与します。 Google Cloud コンソールで、[IAM と管理] > [IAM] を開き、ユーザー アカウントを選択して、[プリンシパルの編集] > [別のロールを追加] をクリックします。
[サービス アカウント トークン作成者] を選択し、[保存] をクリックします。
サービス アカウントの権限借用について詳しくは、Google Cloud ドキュメントの サービス アカウントの権限借用をご覧ください。
Google Cloud コンソールの Cloud Functions ページを開き、[generateWithVertex] リストで generateWithVertex 関数をクリックします。
[トリガー] > [編集] を選択し、ランタイム、ビルド、接続、セキュリティ設定を展開します。
[ランタイム] タブで、[ランタイム サービス アカウント] を [Admin SDK アカウント] に変更します。
[次へ]、[デプロイ] の順にクリックします。
gcloud CLI を設定する
コマンドラインから関数を安全に実行してテストするには、Cloud Functions サービスで認証を行い、有効な認証トークンを取得する必要があります。
トークン生成を有効にするには、gcloud CLI をインストールして構成します。
コンピュータにまだインストールされていない場合は、gcloud CLI をインストールするで説明されているように gcloud CLI をインストールします。
Google Cloud アカウントのアクセス認証情報を取得します。
gcloud auth login
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 サーバー テンプレートに変更を加え、その変更を公開し、さまざまなオプションをテストできるようになりました。
次のステップ
- Firebase では、App Check を使用して Cloud Functions を保護することをおすすめします。App Check を使用して関数を保護する方法の詳細については、Cloud Functions の App Check 適用を有効にするをご覧ください。
- Remote Config と App Check を使用して Vertex AI Gemini API を呼び出すで、サーバーサイドの Remote Config と App Check を使用したサンプルの呼び出し可能関数を試してください。
- 詳しくは、Firebase の Cloud Functions をご覧ください。
- 詳しくは、サーバー環境での Remote Config の使用をご覧ください。