如要直接從應用程式存取 Gemini API 和 Gemini 系列模型,建議您在 Android 版 Firebase SDK 中使用 Vertex AI。這個 SDK 是更大型 Firebase 平台的一部分,可協助您建構及執行完整堆疊應用程式。
從 Google AI 用戶端 SDK 遷移
Firebase SDK 中的 Vertex AI 與 Google AI 用戶端 SDK 類似,但 Firebase SDK 中的 Vertex AI 提供重要的安全選項和其他用於實際用途的功能。舉例來說,在 Firebase 中使用 Vertex AI 時,您也可以使用下列項目:
Firebase App Check:保護 Gemini API 免於遭到未授權用戶端濫用。
Firebase 遠端設定:可在雲端動態設定及變更應用程式的值 (例如模型名稱),而無須發布新版應用程式。
Cloud Storage for Firebase,以便在 Gemini API 要求中加入大型媒體檔案。
如果您已將 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。入門指南可協助您完成本指南中的所有後續工作。
設定新的或現有的 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 網址,在要求中納入大型媒體檔案。
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 App Check,以免 Gemini API 遭到未授權用戶端濫用。
- 如要進一步瞭解 Firebase 中的 Vertex AI,請參閱 Firebase 說明文件。