Vertex AI in Firebase

Pour accéder à l'API Gemini et à la famille de modèles Gemini directement depuis votre application, nous vous recommandons d'utiliser le SDK Vertex AI in Firebase pour Android. Ce SDK fait partie de la plus grande plate-forme Firebase, qui vous aide à créer et à exécuter des applications full stack.

Architecture d'intégration Vertex AI in Firebase
Figure 1. Architecture d'intégration de Vertex AI dans Firebase.

Migrer à partir du SDK client Google AI

Vertex AI dans le SDK Firebase est semblable au SDK client Google AI, mais Vertex AI dans le SDK Firebase offre des options de sécurité essentielles et d'autres fonctionnalités pour les cas d'utilisation en production. Par exemple, lorsque vous utilisez Vertex AI dans Firebase, vous pouvez également utiliser les éléments suivants:

  • Firebase App Check pour protéger l'API Gemini des utilisations abusives par des clients non autorisés.

  • Firebase Remote Config pour définir et modifier de manière dynamique les valeurs de votre application dans le cloud (par exemple, les noms de modèles) sans avoir à publier une nouvelle version de votre application.

  • Cloud Storage for Firebase pour inclure de gros fichiers multimédias dans votre requête à l'API Gemini.

Si vous avez déjà intégré le SDK client Google AI à votre application, vous pouvez migrer vers Vertex AI dans Firebase.

Premiers pas

Avant d'interagir avec l'API Gemini directement depuis votre application, vous devez d'abord effectuer quelques opérations, comme vous familiariser avec les requêtes et configurer Firebase et votre application pour utiliser le SDK.

Tester des requêtes

Vous pouvez tester des requêtes dans Vertex AI Studio. Vertex AI Studio est un IDE permettant de concevoir et de prototyper des requêtes. Il vous permet d'importer des fichiers pour tester des requêtes avec du texte et des images, et d'enregistrer une requête pour la consulter plus tard.

Créer la bonne invite pour votre cas d'utilisation est plus un art qu'une science, ce qui rend l'expérimentation essentielle. Pour en savoir plus sur les requêtes, consultez la documentation Firebase.

Configurer un projet Firebase et associer votre application à Firebase

Lorsque vous êtes prêt à appeler l'API Gemini à partir de votre application, suivez les instructions du guide de démarrage Vertex AI in Firebase pour configurer Firebase et le SDK dans votre application. Le guide de démarrage vous aidera à effectuer toutes les tâches suivantes de ce guide.

  1. Configurez un projet Firebase nouveau ou existant, y compris en utilisant le forfait Blaze à l'usage et en activant les API requises.

  2. Associez votre application à Firebase, y compris en l'enregistrant et en ajoutant votre fichier de configuration Firebase (google-services.json) à votre application.

Ajouter la dépendance Gradle

Ajoutez la dépendance Gradle suivante à votre module d'application:

Kotlin

dependencies {
  ...
  implementation("com.google.firebase:firebase-vertexai:16.0.2")
}

Java

dependencies {

   [...]

   implementation("com.google.firebase:firebase-vertexai:16.0.2")

   // Required to use `ListenableFuture` from Guava Android for one-shot generation
   implementation("com.google.guava:guava:31.0.1-android")

   // Required to use `Publisher` from Reactive Streams for streaming operations
   implementation("org.reactivestreams:reactive-streams:1.0.4")
}

Initialiser le service Vertex AI et le modèle génératif

Commencez par instancier un GenerativeModel et spécifiez le nom du modèle:

Kotlin

val generativeModel = Firebase.vertexAI.generativeModel("gemini-1.5-flash")

Java

GenerativeModel gm = FirebaseVertexAI.getInstance().generativeModel("gemini-1.5-flash");

Dans la documentation Firebase, vous pouvez en savoir plus sur les modèles disponibles à utiliser avec Vertex AI dans Firebase. Vous pouvez également découvrir comment configurer les paramètres du modèle.

Interagir avec l'API Gemini depuis votre application

Maintenant que vous avez configuré Firebase et votre application pour utiliser le SDK, vous êtes prêt à interagir avec l'API Gemini depuis votre application.

Générer du texte

Pour générer une réponse textuelle, appelez generateContent() avec votre requête.

Kotlin

// Note: `generateContent()` is a `suspend` function, which integrates well
// with existing Kotlin code.

scope.launch {
  val response = model.generateContent("Write a story about the green robot")
}

Java

// In Java, create a `GenerativeModelFutures` from the `GenerativeModel`.
// Note that `generateContent()` returns a `ListenableFuture`. Learn more:
// https://developer.android.com/develop/background-work/background-tasks/asynchronous/listenablefuture

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Content prompt = new Content.Builder()
    .addText("Write a story about a green robot.")
    .build();

ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

Générer du texte à partir d'images et d'autres contenus multimédias

Vous pouvez également générer du texte à partir d'une requête qui inclut du texte, des images ou d'autres contenus multimédias. Lorsque vous appelez generateContent(), vous pouvez transmettre le contenu multimédia en tant que données intégrées (comme illustré dans l'exemple ci-dessous). Vous pouvez également inclure de grands fichiers multimédias dans une requête à l'aide d'URL Cloud Storage for Firebase.

Kotlin

scope.launch {
  val response = model.generateContent(
    content {
      image(bitmap)
      text("what is the object in the picture?")
    }
  )
}

Java

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sparky);

Content prompt = new Content.Builder()
        .addImage(bitmap)
        .addText("What developer tool is this mascot from?")
        .build();

ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

Chat multitour

Vous pouvez également prendre en charge les conversations multitours. Initialisez une discussion avec la fonction startChat(). Vous pouvez éventuellement fournir un historique des messages. Appelez ensuite la fonction sendMessage() pour envoyer des messages de chat.

Kotlin

val chat = generativeModel.startChat(
    history = listOf(
        content(role = "user") { text("Hello, I have 2 dogs in my house.") },
        content(role = "model") { text("Great to meet you. What would you like to know?") }
    )
)

scope.launch {
   val response = chat.sendMessage("How many paws are in my house?")
}

Java

// (Optional) create message history
Content.Builder userContentBuilder = new Content.Builder();
userContentBuilder.setRole("user");
userContentBuilder.addText("Hello, I have 2 dogs in my house.");
Content userContent = userContentBuilder.build();

Content.Builder modelContentBuilder = new Content.Builder();
modelContentBuilder.setRole("model");
modelContentBuilder.addText("Great to meet you. What would you like to know?");
Content modelContent = userContentBuilder.build();

List<Content> history = Arrays.asList(userContent, modelContent);

// Initialize the chat
ChatFutures chat = model.startChat(history);

// Create a new user message
Content.Builder messageBuilder = new Content.Builder();
messageBuilder.setRole("user");
messageBuilder.addText("How many paws are in my house?");

Content message = messageBuilder.build();

Publisher<GenerateContentResponse> streamingResponse =
        chat.sendMessageStream(message);

StringBuilder outputContent = new StringBuilder();

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
    @Override
    public void onNext(GenerateContentResponse generateContentResponse) {
        String chunk = generateContentResponse.getText();
        outputContent.append(chunk);
    }

    @Override
    public void onComplete() {
        // ...
    }

    @Override
    public void onError(Throwable t) {
        t.printStackTrace();
    }

    @Override
    public void onSubscribe(Subscription s) {
        s.request(Long.MAX_VALUE);
    }

});

Afficher la réponse de manière progressive

Vous pouvez accélérer les interactions en n'attendant pas le résultat complet de la génération du modèle, et en utilisant plutôt le streaming pour gérer les résultats partiels. Utilisez generateContentStream() pour diffuser une réponse.

Kotlin

scope.launch {
  var outputContent = ""

  generativeModel.generateContentStream(inputContent)
          .collect { response ->
            outputContent += response.text
          }
}

Java

// Note that in Java the method `generateContentStream()` returns a
// Publisher from the Reactive Streams library.
// https://www.reactive-streams.org/

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

// Provide a prompt that contains text
Content prompt = new Content.Builder()
        .addText("Write a story about a green robot.")
        .build();

Publisher<GenerateContentResponse> streamingResponse =
    model.generateContentStream(prompt);

StringBuilder outputContent = new StringBuilder();
streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
  @Override
  public void onNext(GenerateContentResponse generateContentResponse) {
    String chunk = generateContentResponse.getText();
    outputContent.append(chunk);
  }

  @Override
  public void onComplete() {
    // ...
  }

  @Override
  public void onError(Throwable t) {
    t.printStackTrace();
  }

  @Override
  public void onSubscribe(Subscription s) {
    s.request(Long.MAX_VALUE);
  }
});

Étapes suivantes