Android アプリに Gemini の機能を追加する

1. 始める前に

Gemini API を使用すると、Gemini ファミリーの生成 AI モデルにアクセスできます。これまで実現できなかった新しいエクスペリエンスを構築できるようになります。

この Codelab では、JetNews アプリに要約機能を追加するプロセスについて説明します。JetNews は、compose-samples リポジトリの一部である Jetpack Compose で構築されたニュース読み取りアプリです。

JetNews アプリの活用例

この Codelab では、次のことを行います。

  • Vertex AI Studio でニュース記事を要約するためのプロンプトを作成します。
  • Vertex AI in Firebase SDK を JetNews に統合します。
  • 記事ビューの上部に [Gemini による要約] セクションを追加し、下部のバーに「要約」ボタンを追加します。

7eee9f1dcad682c.png

Gemini API を活用した要約機能が搭載された JetNews アプリ。

前提条件

  • Kotlin の基礎知識があること
  • Android Studio の使用方法と Android API レベル 21 以降を搭載したエミュレータまたは実機でアプリをテストする方法に精通していること
  • Firebase にアクセスするための Google アカウント

2. プロンプトを設計する

プロンプトとは、Gemini API を介してアプリから Gemini モデルに送信されるメッセージです。テキスト、画像、音声、動画ファイルを含めることができます。

特定のユースケースにとって理想的なプロンプトを作成することは、科学というよりは芸術に近く、多くの場合、何度か試してみる必要があります。Vertex AI Studio は、プロンプトを作成するための優れたツールです。

この例では、Vertex AI Studio でテキスト プロンプトを作成します。Vertex AI Studio を開き、左側のナビゲーションで [自由形式] をクリックします。

52e11cb6e67d7199.png

この Codelab では、技術的な記事の内容を 4 つの箇条書きに要約します。このプロンプトでの目標は、関連性が高く、マークダウンの書式設定のないプレーン テキストの要約が生成されるようにすることです。

何度か繰り返すうちに、特に効果的なプロンプトが見つかるでしょう。たとえば、次のようになります。

Summarize the core findings of the following article in 4 concise bullet points. Ensure each bullet point is specific, informative and relevant. Return just the bullet points as plain text. Don't use markdown.

[article body]

出力に満足したら、Gemini API を Android アプリに統合できるようになります。

3. コードをチェックアウトする

まず、GitHub からスターター ソースコードをチェックアウトします。

git clone https://github.com/android/codelab-gemini-summary

JetNews アプリは、Android アーキテクチャのベスト プラクティスに準拠し、大小を問わずあらゆるモバイル デバイスに合わせてスケーリングできるようにゼロから設計されています。

詳しくは、大型画面をサポートするための JetNews の実装方法をご覧ください。

JetNews アプリのソースコードが複雑に見えるかもしれませんが、心配はいりません。Gemini を活用した要約機能を追加するには、GeminiRepositoryImpl クラスのコードを変更するだけです。要約機能をトリガーしてアプリに表示するコードは、すでに実装されています。

最終的な実装

次のブランチをチェックアウトすると、ソースコードの最終的な実装に直接アクセスできます。

git clone https://github.com/android/codelab-gemini-summary
git switch final

Firebase プロジェクトを作成して設定するには、この Codelab のステップ 4 で説明されている手順を行う必要があります。

4. Firebase プロジェクトを設定する

Firebase プロジェクトを作成する

Firebase コンソールで Firebase プロジェクトを作成します。[プロジェクトを作成] ワークフローの最初のステップで新しいプロジェクト名を入力して、新しい Firebase プロジェクトを作成します。基盤となる Google Cloud プロジェクトが自動的に作成されます。

プロジェクトで [Gemini を使用した構築] ページに移動し、次の操作を行います。

アプリを Firebase に接続する

Firebase プロジェクトを設定したら、Android アプリをそのプロジェクトに接続する必要があります。

  1. Firebase コンソールで、プロジェクトを選択します。
  2. [アプリを追加] をクリックし、[Android] を選択します。
  3. 画面上の手順に沿って、アプリのパッケージ名を指定してアプリを登録します。
  4. google-services.json ファイルをダウンロードし、アプリのモジュール(アプリレベル)のルート ディレクトリに追加します。
  5. 引き続き画面上の手順に沿って、Google サービスの Gradle プラグインと Firebase 部品構成表(BoM)の Gradle 依存関係をアプリに追加します。

別の方法: Android Studio の Firebase Assistant を使用してアプリを接続する

または、Android Studio の Firebase Assistant を使用すると、ボタンを数回クリックするだけでアプリを Firebase に接続できます。

Firebase Assistant を使用すると、アプリを Firebase プロジェクトに登録し、必要な Firebase ファイル、プラグイン、依存関係を Android プロジェクトに追加できます。これらの操作をすべて Android Studio から行えます。

詳細な手順については、Firebase のドキュメントをご覧ください。

5. Gradle のインポートを更新する

JetNews アプリは、依存関係のバージョンを一元的に管理できる Gradle バージョン カタログ機能を使用しています。

  1. Vertex AI in Firebase SDK の Gradle インポートを追加するには、libs.versions.toml に次のように追加します。
    [versions]
    ...
    vertexai = "16.0.0"
    
    [libraries]
    ...
    firebase-vertexai = { module = "com.google.firebase:firebase-vertexai", version.ref = "vertexai"}
    
  2. build.gradle.kts を更新します。
    implementation(libs.firebase.vertexai)
    
  3. [今すぐ同期] をクリックして Gradle アーティファクトを取得します。

Gradle バージョン カタログを使用したくない場合は、build.gradle.kts でインポートを直接追加できます。

// Import the Firebase BoM
implementation(platform("com.google.firebase:firebase-bom:33.5.1"))
implementation("com.google.firebase:firebase-vertexai")

6. Kotlin の統合

適切な依存関係が追加されたので、Kotlin コードを更新します。

GeminiRepositoryImpl クラスを開きます。このクラスには、Gemini API を操作するすべてのコードがホストされます。

Gemini モデルの初期化

GenerativeModel をインスタンス化します。

private val generativeModel = Firebase.vertexAI.generativeModel(
   "gemini-1.5-flash",
   generationConfig = generationConfig {
      temperature = 0f
   },
      safetySettings = listOf(
         SafetySetting(HarmCategory.HARASSMENT, HarmBlockThreshold.LOW_AND_ABOVE),
                SafetySetting(HarmCategory.HATE_SPEECH, HarmBlockThreshold.LOW_AND_ABOVE),
                SafetySetting(HarmCategory.SEXUALLY_EXPLICIT, HarmBlockThreshold.LOW_AND_ABOVE),
                SafetySetting(HarmCategory.DANGEROUS_CONTENT, HarmBlockThreshold.LOW_AND_ABOVE),
       )
    )

この例では、Gemini 1.5 Flash モデルにアクセスします。このモデルは、この例のテキスト要約のユースケースを処理でき、Gemini 1.5 Pro よりもコスト効率が優れています。使用可能な Gemini モデルの詳細については、Vertex AI in Firebase のドキュメントをご覧ください。

また、この例では温度値を 0 に設定しています。これにより、一貫性を保ちながら要約を生成できます。モデル構成パラメータの詳細については、Vertex AI in Firebase のドキュメントをご覧ください。

最後に、この例では、モデルが回答で適切な言語を生成するように、安全性設定を定義します。安全性設定機能の詳細については、Vertex AI in Firebase のドキュメントをご覧ください。

Gemini を使用した要約

次に、summarizePost() 関数を更新して、パラメータとして渡された投稿を要約します。

まず、投稿からテキストを抽出してモデルに渡します。

val postString = StringBuilder()
for (paragraph in post.paragraphs) {
  postString.append(paragraph.text)
}

この Codelab のステップ 2 で設計したプロンプトに基づいて prompt を作成し、投稿を渡します。

val prompt =
            "Summarize the following article in 4 concise bullet points. " +
                    "Ensure each bullet point is specific, informative and relevant. " +
                    "Return just the bullet points as plain text. " +
                    "Use plain text, don't use markdown. \n $postString"

最後に、プロンプトをモデルに渡して、回答を返します。

return generativeModel.generateContent(prompt).text

実装をテストする

実装をテストするには、Android Studio で [Run app] をクリックし、エミュレータまたは実機に JetNews アプリをインストールします。

ホームページでいずれかの記事を開き、下部のバーにある要約ボタンをクリックします。

Gemini の要約をトリガーするボタン

記事の上部で、記事のイラストの下に [Gemini による要約] セクションが表示されます。

記事の上部に表示される [Gemini による要約] セクション

JetNews アプリのアーキテクチャ

JetNews は、Jetpack Compose の現在の UI 機能を紹介するために作成されました。さまざまな画面サイズをサポートするように実装されています(詳しくは、こちらのブログ投稿をご覧ください)。

この Codelab の目的は、JetNews アプリのアーキテクチャの詳細を説明することではありません。Gemini の統合の大部分が GeminiRepositoryImpl クラスで行われています。

ただし、ボタンが要約をトリガーする仕組みを確認したい場合は、JetnewsIcons.ktSummaryButton() をご覧ください。PostContent.ktSummarySection() 関数で、要約 UI の UI 実装を確認することもできます。

7. まとめ

この Codelab では、以下の方法を学習しました。

  • Vertex AI Studio でプロンプトを作成してテストする。
  • Vertex AI in Firebase と Gemini API を使用するために、Firebase でプロジェクトを設定する。
  • Android アプリで Vertex AI in Firebase を使用するように Gradle 依存関係を構成する。
  • Gemini API を呼び出して、Kotlin コードから Gemini 1.5 Flash モデルにアクセスする。

Android アプリ向けの Vertex AI in Firebase の詳細については、Android コードサンプルドキュメントをご確認ください。