Firebase 中的 Vertex AI

要直接从您的应用访问 Gemini API 和 Gemini 模型系列,建议使用适用于 Android 的 Firebase 中的 Vertex AI SDK。此 SDK 是更大的 Firebase 平台 的一部分,可帮助您构建和运行全栈应用。

Vertex AI in Firebase integration architecture
图 1. Firebase 中的 Vertex AI 集成架构。

从 Google AI 客户端 SDK 迁移

Firebase 中的 Vertex AI SDK 与 Google AI 客户端 SDK 类似,但Firebase 中的 Vertex AI SDK 提供了关键的安全选项和其他功能,可用于生产用例。例如,使用 Firebase 中的 Vertex AI 时,您还可以使用以下功能

如果您已将 Google AI 客户端 SDK 集成到您的应用中,则可以 迁移到 Firebase 中的 Vertex AI

入门

在您直接从应用与 Gemini API 交互之前,您需要先执行一些操作,包括熟悉提示以及设置 Firebase 和您的应用以使用 SDK。

试用提示

您可以在 Vertex AI Studio 中试用提示。Vertex AI Studio 是一个用于提示设计和原型设计的 IDE。它允许您上传文件以使用文本和图像测试提示,并将提示保存以供以后重新访问。

为您的用例创建正确的提示更像是艺术而不是科学,因此实验至关重要。您可以在 Firebase 文档 中详细了解提示。

设置 Firebase 项目并将您的应用连接到 Firebase

准备好从您的应用调用 Gemini API 后,请按照 Firebase 中的 Vertex AI 入门指南 中的说明设置 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 URL 在请求中包含大型媒体文件

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

后续步骤