要直接从您的应用访问 Gemini API 和 Gemini 模型系列,建议使用适用于 Android 的 Firebase 中的 Vertex AI SDK。此 SDK 是更大的 Firebase 平台 的一部分,可帮助您构建和运行全栈应用。
从 Google AI 客户端 SDK 迁移
Firebase 中的 Vertex AI SDK 与 Google AI 客户端 SDK 类似,但Firebase 中的 Vertex AI SDK 提供了关键的安全选项和其他功能,可用于生产用例。例如,使用 Firebase 中的 Vertex AI 时,您还可以使用以下功能
Firebase 应用检查 保护 Gemini API 免受未经授权的客户端的滥用。
Firebase 远程配置 在云端动态设置和更改应用的值(例如,模型名称),而无需发布新版本的应用。
适用于 Firebase 的 Cloud Storage 将大型媒体文件包含在您对 Gemini API 的请求中。
如果您已将 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 在您的应用中。入门指南将帮助您完成本指南中的所有以下任务。
设置新的或现有的 Firebase 项目,包括使用 按使用付费的 Blaze 定价计划 并启用所需的 API。
将您的应用连接到 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); } });
后续步骤
- 在 GitHub 上查看 Firebase 中 Vertex AI 的示例应用。
- 开始考虑准备投入生产,包括设置 Firebase 应用检查以保护 Gemini API 免受未经授权的客户端滥用。
- 在Firebase 文档中详细了解 Firebase 中的 Vertex AI。