Vertex AI in Firebase SDK を使用してアプリから Gemini API を呼び出すと、生成 AI のレスポンスを制御するパラメータがリクエストに含まれます。通常、これらにはモデル名、モデル生成構成(最大トークン数、温度など)、安全性設定、システム インストラクション、プロンプト データが含まれます。
ほとんどの場合、オンデマンドで、またはいくつかのシナリオで必要に応じて変更します。
- 新しいアプリをリリースせずに生成 AI モデルを更新します。以前のバージョンが廃止される前に新しい安定したモデル バージョンにアップグレードできます。また、ユーザーのニーズと属性に基づいて低コストまたは高パフォーマンスのモデルにドロップすることも、特定のユーザー セグメント(ベータ版テスターなど)に条件付きで最新かつ最高のモデルをデプロイすることもできます。
- モデルにアクセスするロケーションを、ユーザーに近い場所に設定します。
- さまざまなシステム インストラクションとプロンプトを A/B テストし、勝ち組のテスト値をユーザーに段階的にロールアウトします。
- フィーチャー トグルを使用すると、アプリ内の生成 AI 機能をすばやく表示または非表示にできます。
Firebase Remote Config は、このすべてに加えて、アプリの新しいバージョンをリリースすることなく、Firebase コンソールで設定した特性に一致するアプリ インスタンスに対して、必要に応じてパラメータ値を条件付きで更新できます。
このソリューション ガイドでは、推奨される具体的なユースケースを示し、生成 AI アプリに Remote Config を追加する方法について説明します。
アプリで Firebase Remote Config を使用する理由
Firebase Remote Config を使用すると、アプリのアップデートを必要とせずにアプリの動作を動的に調整できます。これは、生成 AI を使用するアプリで特に強力です。この場合、迅速な反復処理と微調整が重要になります。
生成 AI アプリでの Remote Config の重要なユースケース
次の重要なユースケースでは、Remote Config と Vertex AI in Firebase を使用することをおすすめします。
- アプリを更新せずに最新のモデル バージョンにアップグレードする: Remote Config パラメータを使用して必要に応じてモデル名を変更し、利用可能になり次第、優先する Gemini モデルの最新バージョンにアップグレードできるようにします。
- アプリのアップデートなしでシステム指示と安全設定を更新する: システム指示と安全設定を Remote Config パラメータ内に保存し、デプロイ後に問題が見つかった場合にオンデマンドで変更できるようにします。
- リスクを軽減し、AI の安全性を強化する: Remote Configロールアウトを使用して、生成 AI の変更を iOS ユーザーと Android ユーザーに安全かつ段階的にリリースします。
生成 AI アプリでの Remote Config の高度なユースケースと推奨されるユースケース
Remote Config と Google Analytics でアプリを計測したら、高度なユースケースを検討できます。
- クライアントの位置情報に基づいて位置情報を設定する: Remote Config 条件を使用して、クライアントの検出された位置情報に基づいてモデルの位置情報を設定します。
- さまざまなモデルを試す: さまざまな生成 AI モデルをすばやくテストして切り替えたり、さまざまなモデルをさまざまなユーザー セグメントにデプロイしたりして、特定のユースケースに最適なモデルを見つけることができます。
- モデルのパフォーマンスを最適化する: システム プロンプト、最大出力トークン、温度などのモデル パラメータを微調整します。
クライアント属性に基づいて異なるシステム指示、プロンプト、モデル構成を使用する: Remote Config と Google Analytics を使用すると、クライアント属性またはカスタム オーディエンスに基づいて条件を作成し、これらの属性に基づいて異なるパラメータを設定できます。
たとえば、生成 AI を使用してアプリでテクニカル サポートを提供している場合は、アプリ プラットフォームに固有のシステム手順を設定して、Android、iOS、ウェブ プラットフォームのユーザーに正確な手順を提供できます。
ユーザーごとにエクスペリエンスをパーソナライズする: Remote Config パーソナライズを使用して、各ユーザーに最適な生成 AI 設定を自動的に決定します。
費用を管理する: 呼び出される生成 AI モデルとその使用頻度をリモートで調整し、ユーザー オーディエンスに基づいて出力トークンの最大値を動的に構成して、不要な費用を削減します。
アプリのエクスペリエンスと結果を最適化する: iOS、Android、Flutter アプリで A/B Testing と Remote Config を使用して、さまざまなユーザー セグメントで生成 AI パラメータの変更をテストし、維持率や収益などの主要な指標に与える影響を把握します。
Firebase Remote Config で生成 AI アプリを計測することで、ユーザーに優れたエクスペリエンスを提供しながら、柔軟で安全、かつ費用対効果の高い AI 搭載アプリケーションを構築できます。
Firebase Remote Config をアプリに追加します。
このソリューション ガイドでは、Firebase Remote Config を使用して、Vertex AI in Firebase SDK を使用する Android アプリのパラメータを動的に更新します。ここでは以下について学びます。
- Firebase Remote Config からモデル名やシステム指示などのパラメータを取得して有効にします。
- 動的に取得されたパラメータを使用するように Gemini API 呼び出しを更新すると、アプリを更新しなくても、さまざまなモデルを切り替えたり、システム インストラクションを変更したりできます。
- パラメータをリモートで制御し、必要に応じてモデルの動作と機能を調整します。
前提条件
このガイドは、読者が Android Studio を使用して Android プラットフォーム向けアプリを開発する方法に精通していることを前提としています。始める前に、以下の準備が整っていることを確認します。
Vertex AI in Firebase SDK のスタートガイドの手順を完了していること。以下の手順をすべて完了していることを確認します。
- Blaze お支払いプランの使用や必要な API の有効化など、新規または既存の Firebase プロジェクトを設定します。
- アプリを Firebase に接続します。アプリの登録や Firebase 構成のアプリへの追加などを行います。
- SDK を追加し、アプリで Vertex AI サービスと生成モデルを初期化します。
プロジェクトで Google Analytics を有効にして、その SDK をアプリに追加します(クライアント デバイスの位置情報に基づいてサービスとモデルのロケーションを設定するなどの条件付きターゲティングに必要です)。
ステップ 1: Firebase コンソールでパラメータ値を設定する
クライアント Remote Config テンプレートを作成し、アプリでフェッチして使用するパラメータと値を構成します。
- Firebase コンソールで Firebase プロジェクトを開き、ナビゲーション メニューから [実行] を展開して、Remote Config を選択します。
- Remote Config ページの上部にある [クライアント/サーバー] セレクタで [クライアント] が選択されていることを確認します。
- Remote Config クライアント テンプレートを初めて使用する場合は、[構成を作成] をクリックします。[最初のパラメータの作成] ペインが表示されます。
- Remote Config テンプレートを初めて使用する場合は、[パラメータを追加] をクリックします。
次の Remote Config パラメータを定義します。
パラメータ名 説明 型 デフォルト値 model_name
モデル名。コードで使用するモデル名の最新リストについては、使用可能なモデル名をご覧ください。 文字列 gemini-1.5-flash
system_instructions
システム指示は、特定のニーズやユースケースに基づいてモデルの動作に影響を与えるエンドユーザーからの詳細な手順を示すために追加する「前文」のようなものです。 文字列 You are a helpful assistant who knows everything there is to know about Firebase!
prompt
生成 AI 機能で使用するデフォルトのプロンプト。 文字列 I am a developer who wants to know more about Firebase!
vertex_location
必要に応じてロケーションを制御して、Vertex AI サービスを実行し、モデルにアクセスします。Google Analytics によって検出されたクライアントの位置情報に基づいて、このオプションを構成する条件を設定できます。 文字列 us-central1
パラメータの追加が完了したら、[変更を公開] をクリックします。新しい Remote Config テンプレートでない場合は、変更内容を確認し、もう一度 [変更を公開] をクリックします。
ステップ 2: アプリに Remote Config SDK を追加して初期化する
Remote Config の依存関係を追加し、アプリ内で Remote Config を設定します。
モジュール(アプリレベル)の Gradle ファイル(通常は
app/build.gradle.kts
またはapp/build.gradle
)に Remote Config 依存関係を追加します。dependencies { implementation(platform("com.google.firebase:firebase-bom:33.6.0")) implementation("com.google.firebase:firebase-vertexai") implementation("com.google.firebase:firebase-config") // ... other dependencies }
Remote Config をメインのアプリケーション ロジックに追加します。ここでは、Remote Config を初期化し、最小フェッチ間隔を追加します。
Kotlin+KTX
val remoteConfig: FirebaseRemoteConfig = Firebase.remoteConfig val configSettings = remoteConfigSettings { minimumFetchIntervalInSeconds = 3600 } remoteConfig.setConfigSettingsAsync(configSettings)
Java
FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance(); FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder() .setMinimumFetchIntervalInSeconds(3600) .build(); mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);
この例では、デフォルトのフェッチ間隔は 3,600 秒ですが、開発中はコード内で比較的短い最小フェッチ間隔を設定することをおすすめします。
ステップ 3: アプリ内パラメータ値を設定する
アプリ内デフォルト パラメータ値は Remote Config オブジェクトに設定する必要があります。これにより、Remote Config サービスから値をフェッチできない場合でも、アプリが想定どおりに動作するようになります。
- Firebase コンソールで Remote Config を開きます。
- [Parameters] タブでメニューを開き、[Download default values] を選択します。
- プロンプトが表示されたら、[.xml(Android 用)] を有効にして、[ファイルをダウンロード] をクリックします。
- ファイルをアプリの XML リソース ディレクトリに保存します。
メイン アクティビティ ファイルを更新して、前に追加した
configSettings
の後にデフォルトを追加します。Kotlin+KTX
// Set default values. remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults)
Java
// Set default values. mFirebaseRemoteConfig.setDefaultsAsync(R.xml.remote_config_defaults);
ステップ 4: 値をフェッチして有効にする
デフォルトを設定したら、次のコードを追加して値をフェッチして有効にします。
Kotlin+KTX
// Fetch and activate Remote Config values
remoteConfig.fetchAndActivate()
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
val updated = task.result
Log.d(TAG, "Remote Config values fetched and activated: $updated")
} else {
Log.e(TAG, "Error fetching Remote Config", task.exception)
}
Java
// Fetch and activate Remote Config values
mFirebaseRemoteConfig.fetchAndActivate()
.addOnCompleteListener(this, new OnCompleteListener<Boolean>() {
@Override
public void onComplete(@NonNull Task<Boolean> task) {
if (task.isSuccessful()) {
boolean updated = task.getResult();
Log.d(TAG, "Config params updated: " + updated);
} else {
Log.e(TAG, "Error fetching Remote Config", task.exception)
}
}
});
ステップ 5: リアルタイムの Remote Config リスナーを追加する
リアルタイム Remote Config リスナーをアプリに追加して、Remote Config テンプレートに加えた変更が更新後すぐにクライアントに反映されるようにします。
次のコードは、パラメータ値が変更されるたびに Remote Config オブジェクトを更新します。必要に応じて、addOnCompleteListener
の有効化内でアクションを構成することもできます。
Kotlin+KTX
// Add a real-time Remote Config listener
remoteConfig.addOnConfigUpdateListener(object : ConfigUpdateListener {
override fun onUpdate(configUpdate : ConfigUpdate) {
Log.d(ContentValues.TAG, "Updated keys: " + configUpdate.updatedKeys);
remoteConfig.activate().addOnCompleteListener {
// Optionally, add an action to perform on update here.
}
}
override fun onError(error : FirebaseRemoteConfigException) {
Log.w(ContentValues.TAG, "Config update error with code: " + error.code, error)
}
}
Java
// Add a real-time Remote Config listener
remoteConfig.addOnConfigUpdateListener(new ConfigUpdateListener() {
@Override
public void onUpdate(ConfigUpdate configUpdate) {
Log.d(ContentValues.TAG, "Updated keys: " + configUpdate.getUpdatedKeys());
remoteConfig.activate().addOnCompleteListener(new OnCompleteListener<Boolean>() {
@Override
public void onComplete(@NonNull Task<Boolean> task) {
// Optionally, add an action to perform on update here.
}
});
}
@Override
public void onError(FirebaseRemoteConfigException error) {
Log.w(ContentValues.TAG, "Config update error with code: " + error.getCode(), error);
}
});
ステップ 6: Remote Config 値を Vertex AI 変数に割り当てる
Remote Config が完全に構成されたので、コードを更新して、ハードコードされた値を Remote Config から取得した値に置き換えます。
ロケーション、モデル名、システム指示、ユーザー プロンプトのハードコードされた値を、Remote Config から取得した値に置き換えます。
Kotlin+KTX
// Initialize FirebaseVertexAI instance
// Optionally specify a location in which to run the service and access the model
val vertexAI = Firebase.vertexAI(location = remoteConfig.getString("vertex_location"))
// Initialize the Vertex AI service and the generative model
// Specify a model that supports system instructions, like a Gemini 1.5 model
val generativeModel = Firebase.vertexAI.generativeModel(
modelName = remoteConfig.getString("model_name"),
systemInstruction = content { text(remoteConfig.getString("system_instructions")) }
)
// To generate text output, call generateContent with the text input
val response = generativeModel.generateContent(remoteConfig.getString("prompt"))
print(response.text)
Java
// Initialize FirebaseVertexAI instance
// Optionally specify a location in which to run the service and access the model
FirebaseVertexAI vertexAI = FirebaseVertexAI.getInstance(remoteConfig.getString("vertex_location"));
// Initialize the Vertex AI service and the generative model
// Specify a model that supports system instructions, like a Gemini 1.5 model
GenerativeModel gm = FirebaseVertexAI.getInstance().generativeModel(
/* modelName */ remoteConfig.getString("model_name"),
/* generationConfig (optional) */ null,
/* safetySettings (optional) */ null,
/* requestOptions (optional) */ new RequestOptions(),
/* tools (optional) */ null,
/* toolsConfig (optional) */ null,
/* systemInstruction (optional) */ new Content.Builder().addText(remoteConfig.getString("system_instructions")).build()
);
GenerativeModelFutures model = GenerativeModelFutures.from(gm);
// Provide a prompt that contains text
Content userPrompt = new Content.Builder()
addText(remoteConfig.getString("prompt"))
build();
// To generate text output, call generateContent with the text input
ListenableFuture<GenerateContentResponse> response = model.generateContent(userPrompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
@Override
public void onSuccess(GenerateContentResponse result) {
String resultText = result.getText();
System.out.println(resultText);
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
}, executor);
ステップ 7: アプリを実行する
アプリをビルドして実行し、動作することを確認します。Firebase コンソールの Remote Config ページで構成を変更し、変更を公開して結果を確認します。
次のステップ
- 詳細については、Remote Config についてをご覧ください。
- Remote Config と A/B テストを使用して、さまざまなモデル設定をテストします。
- Remote Config ロールアウトを使用して、モデル パラメータの変更を段階的にリリースします。
- Remote Config パーソナライズを使用して、機械学習で個々のユーザーに最適な設定を決定します。