搭配使用伺服器端遠端設定搭配 Cloud Functions 和 Vertex AI

本指南說明如何開始使用第 2 代 Cloud Functions伺服器端遠端設定,向 Vertex AI Gemini API 在伺服器端發出呼叫。

在本教學課程中,您會將遠端設定新增至類似聊天機器人的函式,並使用 Gemini 模型回答使用者問題。遠端設定會管理 Gemini API 輸入內容 (包括您在傳入使用者查詢前準備的提示),您也可以透過 Firebase 主控台視需求更新這些輸入內容。您也將使用 Firebase 本機模擬器套件來測試及偵錯函式,並在驗證函式正常運作後,在 Google Cloud 上部署及測試函式。

事前準備

本指南假設您已熟悉如何使用 JavaScript 開發應用程式。

設定 Firebase 專案

如果您還沒有 Firebase 專案:

  1. 登入 Firebase 控制台

  2. 按一下「建立專案」,然後使用下列任一選項:

    • 選項 1:在「建立專案」工作流程的第一步中輸入新的專案名稱,以建立新的 Firebase 專案 (並自動定義其基礎 Google Cloud 專案)。
    • 選項 2:從「建立專案」工作流程的第一個步驟中,從下拉式選單選取 Google Cloud 專案名稱,藉此將 Firebase 新增至現有的 Google Cloud 專案。
  3. 系統提示時,您不需要設定 Google Analytics (分析) 即可使用這項解決方案。

  4. 繼續按照畫面上的指示建立專案。

如果您已有 Firebase 專案:

繼續「設定開發環境」。

設定開發環境

您需要有 Node.js 環境才能編寫函式,而且您需要 Firebase CLI 才能將函式部署至 Cloud Functions 執行階段。

  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
    

您可以開始實作這項解決方案。

導入作業

請按照下列步驟,透過遠端設定和 Vertex AI 建立、測試及部署第 2 代 Cloud Functions:

  1. 在 Google Cloud 控制台中啟用 Vertex AI 建議的 API
  2. 初始化專案並安裝節點依附元件
  3. 為 Admin SDK 服務帳戶設定 IAM 權限,並儲存金鑰
  4. 建立函式
  5. 建立伺服器專屬的遠端設定範本
  6. 部署函式並在 Firebase 本機模擬器套件中進行測試
  7. 將函式部署至 Google Cloud

步驟 1:在 Google Cloud 控制台中啟用 Vertex AI 建議的 API

  1. 開啟 Google Cloud 控制台,然後在系統提示時選取您的專案。
  2. 在控制台頂端的「Search」欄位中輸入 Vertex AI,然後等待 Vertex AI 顯示結果。
  3. 選取「Vertex AI」。Vertex AI 資訊主頁會隨即顯示。
  4. 點選「Enable All Recommended APIs」

    API 啟用作業可能需要一些時間才能完成。保持啟用頁面並保持開啟狀態,直到啟用完成為止。

  5. 如未啟用計費功能,系統會提示您新增或連結 Cloud Billing 帳戶。啟用帳單帳戶後,請返回 Vertex AI 資訊主頁,並確認已啟用所有建議的 API。

步驟 2:初始化專案並安裝節點依附元件

  1. 在電腦上開啟終端機,前往您要建立函式的目錄。
  2. 登入 Firebase:

    firebase login
    
  3. 執行下列指令,初始化 Cloud Functions for Firebase:

    firebase init functions
    
  4. 選取「Use an existing project」,並指定專案 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.json 中的 engines Stanza 設定為 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. 按一下「Add another role」(新增其他角色),然後選取「Remote Config Viewer」(遠端設定檢視者)
  4. 按一下「Add another role」(新增其他角色),然後選取「AI Platform developer」
  5. 按一下「Add another role」(新增其他角色),然後選取「Vertex AI user」
  6. 按一下「Add another role」(新增其他角色),然後選取「Cloud Run Invoker」(Cloud Run 叫用者)
  7. 點選「Save」

接著,匯出 Admin SDK 服務帳戶的憑證,並儲存在 GOOGLE_APPLICATION_CREDENTIALS 環境變數中。

  1. 在 Google Cloud 控制台中,開啟「Credentials」(憑證) 頁面
  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、使用遠端設定設定預設參數、擷取最新的遠端設定參數、處理使用者輸入內容,以及將回應串流傳回給使用者。

  1. 在程式碼集內,使用文字編輯器或 IDE 開啟 functions/index.js
  2. 刪除現有內容,然後新增 Admin SDK、遠端設定和 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. 設定函式在無法連線至遠端設定伺服器時會使用的預設值。這項解決方案會將 textModelgenerationConfigsafetySettingstextPromptlocation 設為遠端設定參數,對應於您將在本指南中進一步調整的遠端設定參數。如要進一步瞭解這些參數,請參閱 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. 建立函式並設定伺服器端遠端設定

    // 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:建立伺服器專屬的遠端設定範本

接下來,建立伺服器端遠端設定範本,並設定要在函式中使用的參數和值。如何建立伺服器專屬的遠端設定範本:

  1. 開啟 Firebase 控制台,在導覽選單中展開「Run」,然後選取「Remote Config」
  2. 從「遠端設定」頁面頂端的「用戶端/伺服器」選取器中,選取「伺服器」

    • 如果您是第一次使用遠端設定或伺服器範本,請按一下「Create Configuration」。系統隨即會顯示「建立第一個伺服器端參數」窗格。
    • 如果這不是您第一次使用遠端設定伺服器範本,請按一下「Add parameters」
  3. 定義下列遠端設定參數:

    參數名稱 說明 類型 預設值
    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. 新增參數後,請仔細檢查參數及其資料類型是否正確,然後按一下「Publish changes」

步驟 6:在 Firebase 本機模擬器套件中部署函式並進行測試

您現在可以使用 Firebase 本機模擬器套件在本機部署及測試函式。

  1. 請務必將 GOOGLE_APPLICATION_CREDENTIALS 設為環境變數,如「步驟 3:設定 Admin SDK 服務帳戶的 IAM 權限」說明,並儲存金鑰。接著,從 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 已在遠端設定伺服器範本中進行設定,因此應透過 Vertex AI Gemini API 存取 Genmini,因此可能會產生費用:

    curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex?prompt=Tell%20me%20everything%20you%20know%20about%20cats
    
  6. 在 Firebase 主控台變更遠端設定伺服器範本,然後重新存取函式觀察變更。

步驟 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 服務帳戶具備執行函式,並與遠端設定和 Vertex AI Gemini API 互動的所有必要角色和權限,因此您必須使用這個帳戶來執行函式。如要這麼做,您必須能夠透過使用者帳戶為帳戶建立權杖。

下列步驟說明如何設定使用者帳戶,以及以 Admin SDK 服務帳戶權限執行的功能。

  1. 在 Google Cloud 控制台中,啟用 IAM Service Account Credentials API
  2. 將「服務帳戶憑證建立者」角色指派給使用者帳戶:在 Google Cloud 控制台中開啟「IAM 與管理」>「IAM」,選取您的使用者帳戶,然後按一下「編輯主體」>「新增其他角色」
  3. 選取「Service Account Token Creator」,然後按一下「Save」

    如要進一步瞭解服務帳戶模擬功能,請參閱 Google Cloud 說明文件中的模擬服務帳戶一節。

  4. 開啟 Google Cloud 控制台的 Cloud Functions 頁面,然後在「Functions」清單中按一下「generateWithVertex」函式。

  5. 依序選取「Trigger」 >「Edit」,然後展開「Runtime, build, connection and security settings」

  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"

您現在可以變更遠端設定伺服器範本、發布變更及測試不同的選項。

後續步驟