Używaj Zdalnej konfiguracji po stronie serwera z Cloud Functions i Vertex AI

Z tego przewodnika dowiesz się, jak zacząć korzystać z 2 generacji Funkcje w Cloud Functions z Zdalna konfiguracja po stronie serwera do wdrożenia po stronie serwera połączenia do Vertex AI Gemini API.

W tym samouczku dodasz Zdalną konfigurację do funkcji przypominającej czatbota, która używa modelu Gemini do odpowiadania na pytania użytkowników. Zdalna konfiguracja będzie i zarządzaj danymi wejściowymi interfejsu Gemini API (w tym promptem, który dodasz na początku przychodzących zapytań użytkowników) i możesz aktualizować te dane wejściowe na żądanie z poziomu konsoli Firebase. Będziesz także używać Pakietu emulatorów lokalnych Firebase do testowania debugować funkcję, a potem, gdy upewnisz się, że działa, wdrożysz przetestujesz ją w Google Cloud.

Wymagania wstępne

W tym przewodniku zakładamy, że umiesz już używać JavaScriptu do programowania aplikacji.

Konfigurowanie projektu Firebase

Jeśli nie masz jeszcze projektu Firebase:

  1. Zaloguj się w konsoli Firebase.

  2. Kliknij Utwórz projekt i użyj jednej z tych opcji:

    • Opcja 1. Utwórz nowy projekt Firebase (i jego bazowy projekt). projektu Google Cloud) przez wpisanie w polu pierwszy krok tworzenia projektu procesu tworzenia kampanii.
    • Opcja 2. „Dodaj Firebase” w istniejącym projekcie Google Cloud przez wybierz nazwę projektu Google Cloud z menu pierwszego kroku tworzenia projektu procesu tworzenia kampanii.
  3. Gdy pojawi się odpowiedni komunikat, nie musisz konfigurować Google Analytics, aby korzystać i poznam nowe rozwiązanie.

  4. Postępuj zgodnie z instrukcjami wyświetlanymi na ekranie, aby utworzyć projekt.

Jeśli masz już projekt Firebase:

Przejdź do sekcji Konfigurowanie środowiska programistycznego.

Skonfiguruj środowisko programistyczne

Do pisania funkcji potrzebujesz środowiska Node.js. potrzebujesz interfejsu wiersza poleceń Firebase do wdrażania funkcji w Cloud Functions w środowisku wykonawczym.

  1. Zainstaluj Node.js i npm.

    Do instalowania Node.js i npm zalecamy użycie Menedżer wersji węzłów.

  2. Zainstaluj interfejs wiersza poleceń Firebase za pomocą preferowanej metody. Aby na przykład zainstalować interfejs wiersza poleceń przy użyciu npm, uruchom to polecenie:

    npm install -g firebase-tools@latest
    

    To polecenie instaluje dostępne globalnie polecenie firebase. Jeśli nie udało się wykonać polecenia, może być konieczne zmień uprawnienia npm.

    Aby zaktualizować aplikację firebase-tools do najnowszej wersji, uruchom to samo polecenie ponownie.

  3. Zainstaluj firebase-functions i firebase-admin, a potem użyj aplikacji --save, by zaoszczędzić je na urządzenie package.json:

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

Możesz teraz przejść do implementacji tego i rozwiązania problemu.

Implementacja

Wykonaj te czynności, aby utworzyć, przetestować i wdrożyć wersję 2 generacji Cloud Functions ze Zdalnej konfiguracji i Vertex AI:

  1. Włącz zalecane interfejsy API Vertex AI w konsoli Google Cloud.
  2. Zainicjuj projekt i zainstaluj zależności węzłów.
  3. Skonfiguruj uprawnienia konta usługi Admin SDK oraz zapisz kluczyk.
  4. Utwórz funkcję.
  5. Utwórz szablon Zdalnej konfiguracji dla konkretnego serwera.
  6. Wdróż funkcję i przetestuj ją Pakiet emulatorów lokalnych Firebase.
  7. Wdróż funkcję w Google Cloud

Krok 1. Włącz zalecane interfejsy API Vertex AI w konsoli Google Cloud

  1. Otwórz aplikację Google Cloud Console, wybierz swój projekt, gdy pojawi się taka prośba.
  2. W polu Szukaj u góry konsoli wpisz Vertex AI i poczekaj, aż pojawi się Vertex AI.
  3. Wybierz Vertex AI. Pojawi się panel Vertex AI.
  4. Kliknij Włącz wszystkie zalecane interfejsy API.

    Włączenie interfejsu API może chwilę potrwać. Zachowaj stronę aktywny i otwarty do momentu zakończenia procesu włączania.

  5. Jeśli ta funkcja nie jest włączona, poprosimy Cię o dodanie lub połączenie konto rozliczeniowe Cloud. Po włączeniu konta rozliczeniowego wróć do Panel Vertex AI i sprawdź, czy wszystkie zalecane interfejsy API są włączone.

.

Krok 2. Zainicjuj projekt i zainstaluj zależności węzłów

  1. Otwórz terminal na komputerze i przejdź do katalogu, w którym i zaplanuj utworzenie funkcji.
  2. Zaloguj się do Firebase:

    firebase login
    
  3. Uruchom to polecenie, aby zainicjować Cloud Functions dla Firebase:

    firebase init functions
    
  4. Kliknij Użyj istniejącego projektu i podaj identyfikator projektu.

  5. Gdy pojawi się prośba o wybranie języka, wybierz JavaScript i naciśnij Wejdź.

  6. W przypadku pozostałych opcji wybierz wartości domyślne.

    W bieżącym katalogu zostanie utworzony katalog functions. Wewnątrz znajdziesz znajdź plik index.js, którego użyjesz do utworzenia funkcji, katalog node_modules zawierający zależności funkcji, oraz plik package.json, który zawiera zależności pakietów.

  7. Dodaj pakiety Admin SDK i Vertex AI, uruchamiając z tych poleceń, używając --save, aby mieć pewność, że zostaną one zapisane na Plik package.json:

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

Twój plik functions/package.json powinien teraz wyglądać tak, jak pokazano poniżej, z rozszerzeniem określone najnowsze wersje:

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

Jeśli używasz języka ESLint, zobaczysz strofę z nim. W również upewnij się, że wersja silnika węzłów jest zgodna z wersją zainstalowaną środowiska Node.js i wersji, która ostatecznie działa w Google Cloud. Na przykład, jeśli część engines w package.json jest skonfigurowana jako Node w wersji 18, używasz Node.js 20, zaktualizuj plik do 20:

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

Krok 3. Skonfiguruj uprawnienia konta usługi Admin SDK i zapisz klucz

W tym rozwiązaniu do uruchamiania użyjesz konta usługi pakietu Firebase Admin SDK funkcji.

  1. W konsoli Google Cloud otwórz Uprawnienia stronie Administracja, i zlokalizuj konto usługi Admin SDK (o nazwie firebase-adminsdk).
  2. Wybierz konto i kliknij Edytuj podmiot zabezpieczeń. Strona edycji
  3. Kliknij Dodaj kolejną rolę i wybierz Wyświetlający Zdalnej konfiguracji.
  4. Kliknij Dodaj kolejną rolę i wybierz Deweloper platformy AI.
  5. Kliknij Dodaj kolejną rolę i wybierz Użytkownik Vertex AI.
  6. Kliknij Dodaj kolejną rolę i wybierz Wywołujący Cloud Run.
  7. Kliknij Zapisz.

Następnie wyeksportuj i zapisz dane logowania konta usługi Admin SDK. w zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS.

  1. W konsoli Google Cloud otwórz Strona Dane logowania.
  2. Kliknij konto usługi Admin SDK, aby otworzyć stronę Szczegóły.
  3. Kliknij Klucze.
  4. Kliknij Dodaj klucz > Utwórz nowy klucz.
  5. Upewnij się, że jako Typ klucza wybrana jest JSON, a następnie kliknij Utwórz.
  6. Pobierz klucz w bezpieczne miejsce na komputerze.
  7. W terminalu wyeksportuj klucz jako zmienną środowiskową:

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

Krok 4. Utwórz funkcję

W tym kroku utworzysz funkcję, która obsługuje dane wejściowe użytkownika i generuje Odpowiedzi oparte na AI. Musisz połączyć kilka fragmentów kodu, aby utworzyć kompleksową funkcję inicjującą pakiet Admin SDK Vertex AI Gemini API konfiguruje parametry domyślne za pomocą Zdalna konfiguracja, pobiera najnowsze parametry i procesy Zdalnej konfiguracji. i przesyła odpowiedź do użytkownika.

  1. W bazie kodu otwórz functions/index.js w edytorze tekstu lub IDE.
  2. Usuń istniejące treści, a potem dodaj pakiet Admin SDK. Zdalna konfiguracja i pakiet SDK Vertex AI oraz zainicjuj aplikację przez wklejając do pliku ten kod:

    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. Skonfiguruj wartości domyślne, których funkcja będzie używać, gdy nie będzie mogła się z nimi połączyć przy użyciu serwera Zdalnej konfiguracji. To rozwiązanie konfiguruje textModel, generationConfig, safetySettings, textPrompt i location jako Parametry Zdalnej konfiguracji odpowiadające Zdalnej konfiguracji , które skonfigurujesz w dalszej części tego przewodnika. Więcej informacje na temat tych parametrów można znaleźć w artykule Klient Vertex AI Node.js.

    Opcjonalnie możesz też skonfigurować parametr określający, czy uzyskać dostęp do interfejsu Vertex AI Gemini API (w tym przykładzie jest to parametr o nazwie vertex_enabled). Może to być przydatne podczas testowania funkcji. W tych fragmentów kodu, ta wartość jest ustawiona na false, co powoduje pominięcie za pomocą Vertex AI podczas testowania podstawowych funkcji. Ustawiam na Funkcja true wywoła interfejs 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. Utwórz funkcję i skonfiguruj Zdalna konfiguracja po stronie serwera:

    // 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. Skonfiguruj Vertex AI i dodaj logikę czatu oraz odpowiedzi:

      // 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. Zapisz i zamknij plik.

.

Krok 5. Utwórz szablon Zdalnej konfiguracji dla danego serwera

Następnie utwórz szablon Zdalnej konfiguracji po stronie serwera i skonfiguruj parametry. i wartości, które mają być używane w Twojej funkcji. Aby utworzyć specyficzny dla serwera Szablon Zdalnej konfiguracji:

  1. Otwórz konsolę Firebase i w menu nawigacyjnym rozwiń Uruchom i wybierz Zdalna konfiguracja.
  2. W selektorze Klient/serwer u góry okna przeglądarki wybierz Serwer Zdalna konfiguracja.

    • Jeśli po raz pierwszy używasz Zdalnej konfiguracji lub szablonów serwera, kliknij Utwórz konfigurację. Narzędzie Utwórz pierwszą stronę po stronie serwera parametr.
    • Jeśli nie korzystasz z szablonów serwera Zdalnej konfiguracji po raz pierwszy, kliknij Dodaj parametr.
  3. Zdefiniuj te parametry Zdalnej konfiguracji:

    Nazwa parametru Opis Typ Wartość domyślna
    model_name Nazwa modelu
    Aktualne listy nazw modeli, które można wykorzystać w kodzie, znajdziesz w artykule Model wersje i cykle życia lub Dostępne nazwy modeli.
    Ciąg znaków gemini-1.5-pro-preview-0514
    prompt Prompt, aby dodać do zapytania użytkownika. Ciąg znaków 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 Parametry który można wysłać do modelu. JSON [{"stopSequences": ["I hope this helps"],"temperature": 0.7,"maxOutputTokens": 512, "topP": 0.1,"topK": 20}]
    safety_settings Bezpieczeństwo dla Vertex AI. JSON [{"category": "HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "HarmBlockThreshold.BLOCK_LOW_AND_ABOVE"}]
    location Lokalizacja aby uruchomić usługę i model Vertex AI. Ciąg znaków us-central1
    is_vertex_enabled Parametr opcjonalny, który określa, czy zapytania są wysyłane do Vertex AI. Wartość logiczna true
  4. Po dodaniu parametrów sprawdź je dokładnie, sprawdź, czy typy danych są prawidłowe, a potem kliknij Opublikuj zmiany.

Krok 6. Wdróż funkcję i przetestuj ją w Pakiecie emulatorów lokalnych Firebase.

Teraz możesz wdrożyć i przetestować swoją funkcję lokalnie za pomocą Pakiet emulatorów lokalnych Firebase.

  1. Ustaw GOOGLE_APPLICATION_CREDENTIALS jako środowisko zgodnie z opisem w sekcji Krok 3. Skonfiguruj uprawnienia dla swojej konto usługi Admin SDK i zapisz . Następnie z poziomu katalog nadrzędny Twojego katalogu functions, wdróż swoją funkcję w Emulator Firebase:

    firebase emulators:start --project PROJECT_ID --only functions
    
  2. Otwórz logi emulatora . Powinno to pokazać, że funkcja została wczytana.

  3. Uzyskaj dostęp do funkcji, uruchamiając następujące polecenie, gdzie: PROJECT_ID to identyfikator projektu i LOCATION to region, który został przez Ciebie wdrożony funkcję do (na przykład us-central1):

    curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex
    
  4. Poczekaj na odpowiedź, a potem wróć na stronę z dziennikami emulatora Firebase lub konsoli i sprawdź, czy są jakieś błędy lub ostrzeżenia.

  5. Spróbuj wysłać dane wejściowe użytkownika, zwracając uwagę, że ponieważ is_vertex_enabled to skonfigurowany w szablonie serwera Zdalnej konfiguracji, powinien uzyskać dostęp Gemini za pomocą interfejsu Vertex AI Gemini API. wiąże się z opłatami:

    curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex?prompt=Tell%20me%20everything%20you%20know%20about%20cats
    
  6. Wprowadź zmiany w szablonie serwera Zdalnej konfiguracji w konsoli Firebase, a następnie ponownie otwórz funkcję, aby obserwować zmiany.

.

Krok 7. Wdróż funkcję w Google Cloud

Po przetestowaniu i zweryfikowaniu funkcji możesz zacząć ją wdrażać Google Cloud i przetestowanie aktywnej funkcji.

Wdrażanie funkcji

Wdróż funkcję za pomocą interfejsu wiersza poleceń Firebase:

firebase deploy --only functions

Blokuj nieuwierzytelniony dostęp do funkcji

Gdy funkcje są wdrażane za pomocą Firebase, nieuwierzytelnione wywołania są domyślnie dozwolone, o ile zasady organizacji nie ograniczają ich stosowania. Podczas testów i przed udostępnieniem funkcji Sprawdzanie aplikacji zalecamy blokowanie nieuwierzytelnionego dostępu.

Aby zablokować nieuwierzytelniony dostęp do funkcji:

  1. W konsoli Google Cloud otwórz Cloud Run.

  2. Kliknij generateWithVertex, a następnie wybierz kartę Bezpieczeństwo.

  3. Włącz Wymagaj uwierzytelniania i kliknij Zapisz.

Skonfiguruj konto użytkownika, aby korzystać z danych logowania do konta usługi Admin SDK

Ponieważ konto usługi Admin SDK ma wszystkie niezbędne role i do uruchamiania funkcji i korzystania ze Zdalnej konfiguracji oraz interfejsu Vertex AI Gemini API, użyj go do uruchomienia funkcji. Do zrobienia musisz mieć możliwość tworzenia tokenów dla konta z poziomu swojego konta użytkownika.

Poniższe kroki opisują, jak skonfigurować konto użytkownika i funkcję który należy uruchamiać z uprawnieniami konta usługi Admin SDK.

  1. W konsoli Google Cloud włącz IAM Service Account Credentials API.
  2. Przypisz do konta użytkownika rolę twórcy tokenów konta usługi: z poziomu Konsola Google Cloud, otwórz Uprawnienia Administracja > Uprawnienia, wybierz użytkownika. a następnie kliknij Edytuj podmiot zabezpieczeń > Dodaj kolejną rolę.
  3. Wybierz Service Account Token Creator (Twórca tokenów konta usługi), a następnie kliknij Zapisz.

    Szczegółowe informacje o przejmowaniu tożsamości konta usługi znajdziesz w dokumentacji, która zawiera Konto usługi podszywanie się pod inne osoby znajdziesz w dokumentacji Google Cloud.

  4. Otwórz stronę Cloud Functions w konsoli Google Cloud. i kliknij funkcję generateWithVertex na liście Funkcje.

  5. Wybierz Wyzwalacz > Edytuj i rozwiń sekcję Środowisko wykonawcze, kompilacja, połączenia i ustawieniach zabezpieczeń.

  6. Na karcie Środowisko wykonawcze zmień Konto usługi środowiska wykonawczego na Konto Admin SDK.

  7. Kliknij kolejno Dalej i Wdróż.

Konfigurowanie interfejsu wiersza poleceń gcloud

Aby bezpiecznie uruchomić i przetestować funkcję z poziomu wiersza poleceń, musisz wykonać te czynności: uwierzytelnić się w usłudze Cloud Functions i uzyskać prawidłowy token uwierzytelniania.

Aby włączyć generowanie tokenów, zainstaluj i skonfiguruj interfejs wiersza poleceń gcloud:

  1. Jeśli interfejs wiersza poleceń gcloud nie jest jeszcze zainstalowany na Twoim komputerze, zainstaluj go jako opisane w artykule Instalowanie gcloud interfejsu wiersza poleceń.

  2. Uzyskaj dane logowania do konta Google Cloud:

    gcloud auth login
    
  3. Ustaw identyfikator projektu w gcloud:

    gcloud config set project PROJECT_ID
    

Testowanie funkcji

Teraz możesz przetestować swoją funkcję w Google Cloud. Aby przetestować tę funkcję, uruchom następujące polecenie:

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

Spróbuj ponownie, używając danych przekazywanych przez użytkowników:

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"

Możesz teraz wprowadzać zmiany w szablonie serwera Zdalnej konfiguracji, publikować tych zmian i testować różne opcje.

Dalsze kroki