Vertex AI in Firebase

如要直接從應用程式存取 Gemini API 和 Gemini 系列模型,建議您在 Android 版 Firebase SDK 中使用 Vertex AI。這個 SDK 是更大型 Firebase 平台的一部分,可協助您建構及執行完整堆疊應用程式。

Vertex AI in Firebase 整合架構
圖 1. Vertex AI in Firebase 整合架構。

從 Google AI 用戶端 SDK 遷移

Firebase SDK 中的 Vertex AI 與 Google AI 用戶端 SDK 類似,但 Firebase SDK 中的 Vertex AI 提供重要的安全選項和其他用於實際用途的功能。舉例來說,在 Firebase 中使用 Vertex AI 時,您也可以使用下列項目:

如果您已將 Google AI 用戶端 SDK 整合到應用程式中,可以在 Firebase 中遷移至 Vertex AI

開始使用

您必須先完成幾項操作,包括熟悉提示功能,以及設定 Firebase 和應用程式以使用 SDK,才能直接從應用程式與 Gemini API 互動。

測試提示

您可以在 Vertex AI Studio 中試驗提示。Vertex AI Studio 是用於設計提示和原型設計的 IDE。您可以上傳檔案,以文字和圖片測試提示,並儲存提示,以便日後查看。

為您的用途建立正確提示,更像是藝術而非科學,因此實驗至關重要。如要進一步瞭解提示,請參閱 Firebase 說明文件

設定 Firebase 專案,並將應用程式連結至 Firebase

準備好從應用程式呼叫 Gemini API 後,請按照 Vertex AI in Firebase 入門指南中的操作說明,在應用程式中設定 Firebase 和 SDK。入門指南可協助您完成本指南中的所有後續工作。

  1. 設定新的或現有的 Firebase 專案,包括使用即付即用 Blaze 定價方案,以及啟用必要的 API。

  2. 將應用程式連結至 Firebase,包括註冊應用程式,以及將 Firebase 設定檔 (google-services.json) 新增至應用程式。

新增 Gradle 依附元件

將下列 Gradle 依附元件新增至應用程式模組:

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

初始化 Vertex AI 服務和生成式模型

首先,請將 GenerativeModel 例項化並指定模型名稱:

Kotlin

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

Java

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

您可以在 Firebase 說明文件中進一步瞭解 Firebase 中可用於 Vertex AI 的模型。您也可以瞭解如何設定模型參數

透過應用程式與 Gemini API 互動

您已設定 Firebase 和應用程式,以便使用 SDK,現在可以透過應用程式與 Gemini API 互動了。

產生文字

如要產生文字回應,請使用提示呼叫 generateContent()

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);

使用圖片和其他媒體生成文字

您也可以根據包含文字和圖片或其他媒體的提示產生文字。呼叫 generateContent() 時,您可以將媒體做為內嵌資料傳遞 (如以下範例所示)。或者,您也可以使用 Firebase 專用 Cloud Storage 網址,在要求中納入大型媒體檔案

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);

多輪對話

您也可以支援多輪對話。使用 startChat() 函式初始化即時通訊。您可以選擇提供訊息記錄。接著呼叫 sendMessage() 函式,傳送即時通訊訊息。

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);
    }

});

逐句顯示回應

您可以不等待模型產生的完整結果,改用串流處理部分結果,以便加快互動速度。使用 generateContentStream() 串流回應。

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);
  }
});

後續步驟