Sử dụng Cấu hình từ xa phía máy chủ với Hàm trên đám mây và AI Vertex

Hướng dẫn này mô tả cách bắt đầu sử dụng thế hệ thứ 2 Cloud Functions với phía máy chủ Remote Config để thực hiện các lệnh gọi phía máy chủ đến Vertex AI Gemini API.

Trong hướng dẫn này, bạn sẽ thêm Remote Config vào một hàm giống như chatbot sử dụng mô hình Gemini để trả lời câu hỏi của người dùng. Remote Config sẽ quản lý các giá trị đầu vào của Gemini API (bao gồm cả câu lệnh mà bạn sẽ thêm vào trước các truy vấn đến của người dùng) và bạn có thể cập nhật các giá trị đầu vào này theo yêu cầu từ bảng điều khiển của Firebase. Bạn cũng sẽ sử dụng Firebase Local Emulator Suite để kiểm thử và gỡ lỗi hàm, sau đó, sau khi xác minh rằng hàm này hoạt động, bạn sẽ triển khai và kiểm thử hàm đó trên Google Cloud.

Điều kiện tiên quyết

Hướng dẫn này giả định rằng bạn đã quen với việc sử dụng JavaScript để phát triển ứng dụng.

Thiết lập dự án Firebase

Nếu bạn chưa có dự án Firebase:

  1. Đăng nhập vào Firebase bảng điều khiển.

  2. Nhấp vào Tạo dự án, sau đó sử dụng một trong các lựa chọn sau:

    • Lựa chọn 1: Tạo một dự án Firebase mới (và dự án cơ bản của dự án đó một cách tự động) bằng cách nhập tên dự án mới ở bước đầu tiên trong quy trình "Tạo dự án".Google Cloud
    • Lựa chọn 2: "Thêm Firebase" vào một dự án Google Cloud hiện có bằng cách chọn tên dự án Google Cloud của bạn trong trình đơn thả xuống ở bước đầu tiên trong quy trình "Tạo dự án".
  3. Khi được nhắc, bạn không cần thiết lập Google Analytics để sử dụng giải pháp này.

  4. Tiếp tục làm theo hướng dẫn trên màn hình để tạo dự án.

Nếu bạn đã có dự án Firebase:

Chuyển sang phần Định cấu hình môi trường phát triển.

Định cấu hình môi trường phát triển

Bạn cần có môi trường Node.js để viết hàm và cần có CLI Firebase để triển khai hàm vào thời gian chạy Cloud Functions.

  1. Cài đặt Node.jsnpm.

    Để cài đặt Node.js và npm, bạn nên sử dụng Trình quản lý phiên bản nút.

  2. Cài đặt Firebase CLI bằng phương thức bạn muốn. Ví dụ: để cài đặt CLI bằng npm, hãy chạy lệnh sau:

    npm install -g firebase-tools@latest
    

    Lệnh này sẽ cài đặt lệnh firebase có sẵn trên toàn cầu. Nếu lệnh này không thành công, bạn có thể cần thay đổi quyền npm.

    Để cập nhật lên phiên bản firebase-tools mới nhất, hãy chạy lại lệnh tương tự.

    .
  3. Cài đặt firebase-functionsfirebase-admin, đồng thời sử dụng --save để lưu các tệp này vào package.json:

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

Bây giờ, bạn đã sẵn sàng tiếp tục triển khai giải pháp này.

Triển khai

Hãy làm theo các bước sau để tạo, kiểm thử và triển khai thế hệ thứ 2 Cloud Functions bằng Remote ConfigVertex AI:

  1. Bật các API được đề xuất trong bảng điều khiển.Vertex AIGoogle Cloud
  2. Khởi chạy dự án và cài đặt các phần phụ thuộc của Node.
  3. Định cấu hình quyền IAM cho tài khoản dịch vụ Admin SDK và lưu khoá của bạn.
  4. Tạo hàm.
  5. Tạo mẫu Remote Config dành riêng cho máy chủ.
  6. Triển khai hàm và kiểm thử hàm đó trong Firebase Local Emulator Suite.
  7. Triển khai hàm vào Google Cloud.

Bước 1: Bật các API được đề xuất của Vertex AI trong bảng điều khiển Google Cloud

  1. Mở bảng điều khiển Google Cloudrồi chọn dự án của bạn khi được nhắc.
  2. Trong trường Tìm kiếm ở đầu bảng điều khiển, hãy nhập Vertex AI rồi đợi Vertex AI xuất hiện dưới dạng kết quả.
  3. Chọn Vertex AI. Trang tổng quan Vertex AI sẽ xuất hiện.
  4. Nhấp vào Bật tất cả các API được đề xuất.

    Có thể mất vài phút để quá trình bật API hoàn tất. Hãy giữ trang này ở trạng thái hoạt động và mở cho đến khi quá trình bật hoàn tất.

  5. Nếu chưa bật tính năng thanh toán, bạn sẽ được nhắc thêm hoặc liên kết tài khoản Cloud Billing. Sau khi bật tài khoản thanh toán, hãy quay lại trang tổng quan Vertex AI và xác minh rằng tất cả các API được đề xuất đều được bật.

Bước 2: Khởi chạy dự án và cài đặt các phần phụ thuộc của Node

  1. Mở một cửa sổ lệnh trên máy tính rồi chuyển đến thư mục mà bạn dự định tạo hàm.
  2. Đăng nhập vào Firebase:

    firebase login
    
  3. Chạy lệnh sau để khởi chạy Cloud Functions for Firebase:

    firebase init functions
    
  4. Chọn Use an existing project (Sử dụng dự án hiện có) rồi chỉ định mã dự án của bạn.

  5. Khi được nhắc chọn ngôn ngữ để sử dụng, hãy chọn Javascript rồi nhấn phím Enter.

  6. Đối với tất cả các lựa chọn khác, hãy chọn các giá trị mặc định.

    Thư mục functions sẽ được tạo trong thư mục hiện tại. Bên trong, bạn sẽ thấy tệp index.js mà bạn sẽ dùng để xây dựng hàm, thư mục node_modules chứa các phần phụ thuộc cho hàm và tệp package.json chứa các phần phụ thuộc của gói.

  7. Thêm các gói Admin SDKVertex AI bằng cách chạy các lệnh sau, sử dụng --save để đảm bảo rằng các gói này được lưu vào tệp package.json:

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

Tệp functions/package.json của bạn hiện sẽ có dạng như sau, với các phiên bản mới nhất được chỉ định:

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

Xin lưu ý rằng nếu bạn đang sử dụng ESLint, bạn sẽ thấy một đoạn mã bao gồm ESLint. Ngoài ra, hãy đảm bảo rằng phiên bản công cụ nút khớp với phiên bản Node.js mà bạn đã cài đặt và phiên bản mà bạn chạy trên Google Cloud. Ví dụ: nếu đoạn mã engines trong package.json được định cấu hình là phiên bản Node 18 và bạn đang sử dụng Node.js 20, hãy cập nhật tệp để sử dụng phiên bản 20:

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

Bước 3: Định cấu hình quyền IAM cho tài khoản dịch vụ Admin SDK và lưu khoá của bạn

Trong giải pháp này, bạn sẽ sử dụng tài khoản dịch vụ Firebase Admin SDK để chạy hàm.

  1. Trong bảng điều khiển Google Cloud, hãy mở trang IAM và Quản trị, rồi tìm tài khoản dịch vụ Admin SDK (có tên là firebase-adminsdk).
  2. Chọn tài khoản rồi nhấp vào Edit principal (Chỉnh sửa thực thể chính). Trang Chỉnh sửa quyền truy cập sẽ xuất hiện.
  3. Nhấp vào Add another role (Thêm vai trò khác), chọn Remote Config Viewer (Trình xem).
  4. Nhấp vào Add another role (Thêm vai trò khác), chọn AI platform developer (Nhà phát triển nền tảng AI).
  5. Nhấp vào Add another role (Thêm vai trò khác), chọn Vertex AI user (người dùng Vertex AI).
  6. Nhấp vào Add another role (Thêm vai trò khác), chọn Cloud Run Invoker (Trình gọi Cloud Run).
  7. Nhấp vào Lưu.

Tiếp theo, hãy xuất thông tin xác thực cho tài khoản dịch vụ Admin SDK và lưu thông tin đó trong biến môi trường GOOGLE_APPLICATION_CREDENTIALS.

  1. Trong bảng điều khiển Google Cloud, hãy mở trang Thông tin xác thực.
  2. Nhấp vào tài khoản dịch vụ Admin SDK để mở trang Thông tin chi tiết.
  3. Nhấp vào Khoá.
  4. Nhấp vào Add key (Thêm khoá) > Create new key (Tạo khoá mới).
  5. Đảm bảo rằng bạn đã chọn JSON làm Key type (Loại khoá), sau đó nhấp vào Create (Tạo).
  6. Tải khoá xuống một nơi an toàn trên máy tính.
  7. Từ cửa sổ lệnh, hãy xuất khoá dưới dạng biến môi trường:

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

Bước 4: Tạo hàm

Ở bước này, bạn sẽ tạo một hàm xử lý hoạt động đầu vào của người dùng và tạo các câu trả lời dựa trên AI. Bạn sẽ kết hợp nhiều đoạn mã để tạo một hàm toàn diện khởi động Admin SDKVertex AI Gemini API, định cấu hình các tham số mặc định bằng Remote Config, tìm nạp các tham số Remote Config mới nhất, xử lý hoạt động đầu vào của người dùng và hiện câu trả lời theo thời gian thực trở lại cho người dùng.

  1. Trong cơ sở mã, hãy mở functions/index.js trong trình chỉnh sửa văn bản hoặc IDE.
  2. Xoá nội dung hiện có, sau đó thêm Admin SDK, Remote Config, và Vertex AI SDK, đồng thời khởi chạy ứng dụng bằng cách dán mã sau vào tệp:

    const { onRequest } = require("firebase-functions/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. Định cấu hình các giá trị mặc định mà hàm của bạn sẽ sử dụng nếu hàm đó không thể kết nối với máy chủ Remote Config. Giải pháp này định cấu hình textModel, generationConfig, safetySettings, textPrompt, và location làm các tham số Remote Config tương ứng với các tham số Remote Config mà bạn sẽ định cấu hình thêm trong hướng dẫn này. Để biết thêm thông tin về các tham số này, hãy xem Ứng dụng Vertex AI Node.js.

    Bạn cũng có thể định cấu hình một tham số để kiểm soát việc bạn có truy cập vào Vertex AI Gemini API hay không (trong ví dụ này, một tham số có tên là vertex_enabled). Bạn có thể sử dụng chế độ thiết lập này khi kiểm thử hàm. Trong các đoạn mã sau, giá trị này được đặt thành false, giá trị này sẽ bỏ qua việc sử dụng Vertex AI trong khi bạn kiểm thử việc triển khai hàm cơ bản. Việc đặt giá trị này thành true sẽ gọi 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-002",
      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. Tạo hàm và thiết lập phía máy chủ 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. Thiết lập Vertex AI và thêm logic trò chuyện và phản hồi:

      // 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. Lưu và đóng tệp.

Bước 5: Tạo mẫu dành riêng cho máy chủ Remote Config

Tiếp theo, hãy tạo mẫu Remote Config phía máy chủ và định cấu hình các tham số và giá trị để sử dụng trong hàm. Cách tạo mẫu Remote Config dành riêng cho máy chủ:

  1. Trong bảng điều khiển của Firebase, hãy chuyển đến phần DevOps và Tương tác > Cấu hình từ xa.

  2. Trong trình chọn Client/Server (Máy khách/Máy chủ) ở đầu trang, hãy chọn Server (Máy chủ).

    • Nếu đây là lần đầu tiên bạn sử dụng Remote Config hoặc mẫu máy chủ, hãy nhấp vào Create Configuration (Tạo cấu hình). Ngăn Create your first server-side parameter (Tạo tham số phía máy chủ đầu tiên) sẽ xuất hiện.
    • Nếu đây không phải là lần đầu tiên bạn sử dụng mẫu máy chủ Remote Config, hãy nhấp vào Add parameter (Thêm tham số).
  3. Xác định các tham số Remote Config sau:

    Tên tham số Nội dung mô tả Loại Giá trị mặc định
    model_name Tên mô hình
    Để biết danh sách mới nhất về tên mô hình cần sử dụng trong mã của bạn, hãy xem Các phiên bản và vòng đời của mô hình hoặc Tên mô hình có sẵn.
    Chuỗi gemini-2.0-flash
    prompt Câu lệnh để thêm vào trước truy vấn của người dùng. Chuỗi 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 Các tham số cần gửi đến mô hình. JSON [{"stopSequences": ["I hope this helps"],"temperature": 0.7,"maxOutputTokens": 512, "topP": 0.1,"topK": 20}]
    safety_settings Chế độ cài đặt an toàn cho Vertex AI. JSON [{"category": "HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "HarmBlockThreshold.BLOCK_LOW_AND_ABOVE"}]
    location Vị trí để chạy dịch vụ và mô hình.Vertex AI Chuỗi us-central1
    is_vertex_enabled Tham số không bắt buộc kiểm soát việc các truy vấn có được gửi đến Vertex AI hay không. Boolean true
  4. Khi bạn đã thêm xong các tham số, hãy kiểm tra kỹ các tham số và đảm bảo rằng các loại dữ liệu của tham số đó chính xác, sau đó nhấp vào Publish changes (Xuất bản các thay đổi).

Bước 6: Triển khai hàm và kiểm thử hàm đó trong Firebase Local Emulator Suite

Bây giờ, bạn đã sẵn sàng triển khai và kiểm thử hàm của mình ở chế độ cục bộ bằng Firebase Local Emulator Suite.

  1. Đảm bảo rằng bạn đã đặt GOOGLE_APPLICATION_CREDENTIALS làm biến môi trường như mô tả trong Bước 3: Định cấu hình quyền IAM cho tài khoản dịch vụ Admin SDK và lưu khoá. Sau đó, từ thư mục mẹ của thư mục functions, hãy triển khai hàm vào trình mô phỏng Firebase:

    firebase emulators:start --project PROJECT_ID --only functions
    
  2. Mở trang nhật ký của trình mô phỏng. Trang này sẽ cho biết rằng hàm của bạn đã được tải.

  3. Truy cập vào hàm của bạn bằng cách chạy lệnh sau, trong đó PROJECT_ID là mã dự án và LOCATION là khu vực mà bạn đã triển khai hàm (ví dụ: us-central1):

    curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex
    
  4. Đợi phản hồi, sau đó quay lại trang nhật ký của Trình mô phỏng Firebase hoặc bảng điều khiển của bạn rồi kiểm tra xem có lỗi hoặc cảnh báo nào không.

  5. Hãy thử gửi một số hoạt động đầu vào của người dùng, lưu ý rằng vì is_vertex_enabled được định cấu hình trong mẫu máy chủ Remote Config, nên thao tác này sẽ truy cập vào mô hình Gemini thông qua Vertex AI Gemini API và thao tác này có thể phát sinh chi phí:

    curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex?prompt=Tell%20me%20everything%20you%20know%20about%20cats
    
  6. Thay đổi mẫu máy chủ Remote Config trong bảng điều khiển Firebase, sau đó truy cập lại vào hàm của bạn để quan sát các thay đổi.

Bước 7: Triển khai hàm vào Google Cloud

Sau khi kiểm thử và xác minh hàm, bạn đã sẵn sàng triển khai vào Google Cloud và kiểm thử hàm đang hoạt động.

Triển khai hàm

Triển khai hàm bằng Firebase CLI:

firebase deploy --only functions

Chặn quyền truy cập chưa được xác thực vào hàm

Khi các hàm được triển khai bằng Firebase, theo mặc định, các lệnh gọi chưa được xác thực sẽ được cho phép nếu chính sách của tổ chức bạn không hạn chế điều này. Trong quá trình kiểm thử và trước khi bảo mật bằng App Check, chúng tôi khuyên bạn nên chặn quyền truy cập chưa được xác thực.

Cách chặn quyền truy cập chưa được xác thực vào hàm:

  1. Trong bảng điều khiển Google Cloud, hãy mở Cloud Run.

  2. Nhấp vào generateWithVertex, sau đó nhấp vào thẻ Security (Bảo mật).

  3. Bật Require authentication (Yêu cầu xác thực), sau đó nhấp vào Save (Lưu).

Định cấu hình tài khoản người dùng để sử dụng thông tin xác thực tài khoản dịch vụ Admin SDK

Vì tài khoản dịch vụ Admin SDK có tất cả các vai trò và quyền cần thiết để chạy hàm và tương tác với Remote ConfigVertex AI Gemini API, nên bạn sẽ muốn sử dụng tài khoản này để chạy hàm. Để làm việc này, bạn phải có thể tạo mã thông báo cho tài khoản từ tài khoản người dùng của mình.

Các bước sau đây mô tả cách định cấu hình tài khoản người dùng và hàm để chạy với các đặc quyền của tài khoản dịch vụ Admin SDK.

  1. Trong bảng điều khiển Google Cloud, hãy bật IAM Service Account Credentials API.
  2. Cấp cho tài khoản người dùng của bạn vai trò Service Account Token Creator (Trình tạo mã thông báo tài khoản dịch vụ): Từ bảng điều khiển Google Cloud, hãy mở IAM và Quản trị > IAM, chọn tài khoản người dùng của bạn, sau đó nhấp vào Edit principal (Chỉnh sửa thực thể chính) > Add another role (Thêm vai trò khác).
  3. Chọn Service Account Token Creator (Trình tạo mã thông báo tài khoản dịch vụ), sau đó nhấp vào Save (Lưu).

    Để biết thông tin chi tiết hơn về việc mạo danh tài khoản dịch vụ, hãy tham khảo phần Mạo danh tài khoản dịch vụ trong tài liệu Google Cloud.

  4. Mở trang Google Cloud console Cloud Functions page rồi nhấp vào hàm generateWithVertex trong danh sách Functions.

  5. Chọn Trigger (Trình kích hoạt) > Edit (Chỉnh sửa) rồi mở rộng Runtime, build, connections and security settings (Thời gian chạy, bản dựng, kết nối và chế độ cài đặt bảo mật).

  6. Trên thẻ Runtime (Thời gian chạy), hãy thay đổi Runtime service account (Tài khoản dịch vụ thời gian chạy) thành Admin SDK account (Tài khoản Admin SDK).

  7. Nhấp vào Next (Tiếp theo), sau đó nhấp vào Deploy (Triển khai).

Thiết lập gcloud CLI

Để chạy và kiểm thử hàm một cách an toàn qua dòng lệnh, bạn cần xác thực bằng dịch vụ Cloud Functions và lấy mã thông báo xác thực hợp lệ.

Để bật tính năng tạo mã thông báo, hãy cài đặt và định cấu hình gcloud CLI:

  1. Nếu chưa cài đặt trên máy tính, hãy cài đặt gcloud CLI như mô tả trong phần Cài đặt gcloud CLI.

  2. Lấy thông tin xác thực quyền truy cập cho tài khoản Google Cloud của bạn:

    gcloud auth login
    
  3. Đặt mã dự án của bạn trong gcloud:

    gcloud config set project PROJECT_ID
    

Kiểm thử hàm

Bây giờ, bạn đã sẵn sàng kiểm thử hàm của mình trong Google Cloud. Để kiểm thử hàm, hãy chạy lệnh sau:

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

Hãy thử lại với dữ liệu do người dùng cung cấp:

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"

Bây giờ, bạn có thể thay đổi mẫu máy chủ Remote Config, xuất bản các thay đổi đó và kiểm thử các lựa chọn khác.

Các bước tiếp theo