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 から移行する

Vertex AI in Firebase SDK は Google AI クライアント SDK に似ていますが、Vertex AI in Firebase SDK には、本番環境のユースケース向けの重要なセキュリティ オプションやその他の機能が用意されています。たとえば、Firebase で Vertex AI を使用する場合は、次のものも使用できます。

  • Firebase App Check: 未承認のクライアントによる Gemini API の不正使用を防ぎます。

  • Firebase Remote Config: アプリの新しいバージョンをリリースしなくても、クラウドでアプリの値(モデル名など)を動的に設定、変更できます。

  • Cloud Storage for Firebase: Gemini API へのリクエストに大容量のメディア ファイルを含める。

Google AI クライアント SDK をアプリに統合済みの場合は、Firebase の Vertex AI に移行できます。

はじめに

アプリから Gemini API を直接操作する前に、プロンプトの使用方法を学び、Firebase とアプリを設定して SDK を使用できるようにする必要があります。

プロンプトで試す

Vertex AI Studio でプロンプトを試すことができます。Vertex AI Studio は、プロンプトの設計とプロトタイピング用の IDE です。ファイルをアップロードしてテキストと画像を含むプロンプトをテストし、プロンプトを保存して後で再利用できます。

ユースケースに適したプロンプトを作成することは、科学というよりは芸術に近く、そのためテストが重要になります。プロンプトについて詳しくは、Firebase のドキュメントをご覧ください。

Firebase プロジェクトを設定してアプリを Firebase に接続する

アプリから Gemini API を呼び出す準備ができたら、Vertex AI in Firebase のスタートガイドの手順に沿って、アプリに Firebase と SDK を設定します。このスタートガイドでは、このガイドの以降のすべてのタスクを行うことができます。

  1. 従量課金制の Blaze 料金プランの使用や必要な API の有効化など、新規または既存の Firebase プロジェクトを設定します。

  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 のドキュメントでは、Vertex AI in Firebase で使用できるモデルの詳細を確認できます。モデル パラメータの構成についても確認してください。

アプリから 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);
  }
});

次のステップ