Vous pouvez créer des applications et des fonctionnalités Android optimisées par l'IA avec l'inférence hybride à l'aide de Firebase AI Logic. L'inférence hybride permet d'exécuter l'inférence à l'aide de modèles sur l'appareil lorsqu'ils sont disponibles et de revenir de manière transparente aux modèles hébergés dans le cloud dans le cas contraire (et vice versa).
Cette page explique comment commencer à utiliser le SDK client, ainsi que des options et des fonctionnalités de configuration supplémentaires, comme la température.
Notez que l'inférence sur l'appareil via Firebase AI Logic est compatible avec les applications Android exécutées sur des appareils spécifiques et est régie par les conditions d'utilisation de ML Kit, ainsi que par les conditions spécifiques aux aspects d'IA générative de ML Kit.
Cas d'utilisation recommandés et fonctionnalités compatibles
Cas d'utilisation recommandés
L'utilisation d'un modèle sur l'appareil pour l'inférence offre les avantages suivants :
- Confidentialité renforcée
- Contexte local
- Inférence sans frais
- Fonctionnalités hors connexion
L'utilisation de la fonctionnalité hybride offre les avantages suivants :
- Toucher davantage d'utilisateurs en tenant compte de la disponibilité du modèle sur l'appareil et de la connectivité Internet
Fonctionnalités compatibles pour l'inférence sur l'appareil
L'inférence sur l'appareil n'est compatible qu'avec la génération de texte en un seul tour (pas le chat), avec une sortie en streaming ou non. Elle est compatible avec les fonctionnalités de génération de texte suivantes :
Générer du texte à partir d'une entrée de texte et d'image, en particulier une seule image bitmap en entrée
Veillez à consulter la liste des fonctionnalités non encore disponibles pour l'inférence sur l'appareil en bas de cette page.
Avant de commencer
Veuillez noter les points suivants :
API compatibles :
L'inférence dans le cloud utilise le fournisseur Gemini API de votre choix (l' Gemini Developer API ou le Vertex AI Gemini API).
L'inférence sur l'appareil utilise l' API Prompt de ML Kit, qui est en version bêta et n'est disponible que sur certains appareils.
Cette page explique comment commencer.
Une fois cette configuration standard terminée, consultez les options et fonctionnalités de configuration supplémentaires (comme la définition de la température).
Appareils Android compatibles et leurs modèles sur l'appareil
Pour l'inférence sur l'appareil (qui utilise l'API Prompt de ML Kit), vous trouverez une liste des appareils compatibles et de leurs modèles sur l'appareil dans la documentation de ML Kit.
Commencer
Ces étapes de démarrage décrivent la configuration générale requise pour toute requête de prompt compatible que vous souhaitez envoyer.
Étape 1 : Configurez un projet Firebase et associez votre application à Firebase
Connectez-vous à la Firebase console, puis sélectionnez votre projet Firebase.
Dans la console Firebase, accédez à Services d'IA > AI Logic.
Cliquez sur Commencer pour lancer un workflow guidé qui vous aidera à configurer les API requises et les ressources pour votre projet.
Configurez votre projet pour utiliser un fournisseur "Gemini API".
Nous vous recommandons de commencer à utiliser le Gemini Developer API. Vous pouvez toujours configurer l'Vertex AI Gemini API (et son exigence de facturation) à tout moment.
Pour le Gemini Developer API, la console activera les API requises et créera une clé API Gemini dans votre projet.
N'ajoutez pas cette clé API Gemini dans la base de code de votre application. En savoir plusSi vous y êtes invité dans le workflow de la console, suivez les instructions à l'écran pour enregistrer votre application et la connecter à Firebase.
Passez à l'étape suivante de ce guide pour ajouter le SDK à votre application.
Étape 2 : Ajoutez les SDK requis
Le Firebase AI Logic SDK pour Android
(firebase-aifirebase-ai-ondevice
Dans le fichier Gradle de votre module (au niveau de l'application)
(par exemple, <project>/<app-module>/build.gradle.kts), ajoutez les dépendances pour les
Firebase AI Logic bibliothèques pour Android :
Kotlin
dependencies { // ... other androidx dependencies // Add the dependencies for the Firebase AI Logic libraries // Note that the on-device SDK is not yet included in the Firebase Android BoM implementation("com.google.firebase:firebase-ai:17.11.0") implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta01") }
Java
Pour Java, vous devez ajouter deux bibliothèques supplémentaires.
dependencies { // ... other androidx dependencies // Add the dependencies for the Firebase AI Logic libraries // Note that the on-device SDK is not yet included in the Firebase Android BoM implementation("com.google.firebase:firebase-ai:17.11.0") implementation("com.google.firebase:firebase-ai-ondevice:16.0.0-beta01") // Required for one-shot operations (to use `ListenableFuture` from Guava Android) implementation("com.google.guava:guava:31.0.1-android") // Required for streaming operations (to use `Publisher` from Reactive Streams) implementation("org.reactivestreams:reactive-streams:1.0.4") }
Étape 3 : Vérifiez si le modèle sur l'appareil est disponible
À l'aide de
FirebaseAIOnDevice,
vérifiez si le modèle sur l'appareil est disponible et téléchargez-le s'il n'est pas
disponible.
Une fois téléchargé, AICore maintiendra automatiquement le modèle à jour. Consultez les notes après l'extrait pour en savoir plus sur AICore et sur la gestion du téléchargement du modèle sur l'appareil.
Kotlin
val status = FirebaseAIOnDevice.checkStatus()
when (status) {
OnDeviceModelStatus.UNAVAILABLE -> {
Log.w(TAG, "On-device model is unavailable")
}
OnDeviceModelStatus.DOWNLOADABLE -> {
FirebaseAIOnDevice.download().collect { status ->
when (status) {
is DownloadStatus.DownloadStarted ->
Log.w(TAG, "Starting download - ${status.bytesToDownload}")
is DownloadStatus.DownloadInProgress ->
Log.w(TAG, "Download in progress ${status.totalBytesDownloaded} bytes downloaded")
is DownloadStatus.DownloadCompleted ->
Log.w(TAG, "On-device model download complete")
is DownloadStatus.DownloadFailed ->
Log.e(TAG, "Download failed ${status}")
}
}
}
OnDeviceModelStatus.DOWNLOADING -> {
Log.w(TAG, "On-device model is being downloaded")
}
OnDeviceModelStatus.AVAILABLE -> {
Log.w(TAG, "On-device model is available")
}
}
Java
Checking for and downloading the model is not yet available for Java.
However, all other APIs and interactions in this guide are available for Java.
Notez les points suivants concernant le téléchargement du modèle sur l'appareil :
Le temps nécessaire au téléchargement du modèle sur l'appareil dépend de nombreux facteurs, y compris de votre réseau.
Si votre code utilise un modèle sur l'appareil pour son inférence principale ou de secours, assurez-vous que le modèle est téléchargé au début du cycle de vie de votre application afin qu'il soit disponible avant que vos utilisateurs finaux ne rencontrent le code dans votre application.
Si le modèle sur l'appareil n'est pas disponible lorsqu'une requête d'inférence sur l'appareil est effectuée, le SDK ne déclenchera pas automatiquement le téléchargement du modèle sur l'appareil. Le SDK reviendra au modèle hébergé dans le cloud ou générera une exception (consultez les détails sur le comportement des modes d'inférence).
AICore (un service système Android) gère pour vous le modèle et la version téléchargés, en maintenant le modèle à jour, etc. Notez que seul un modèle sera téléchargé sur l'appareil. Par conséquent, si une autre application sur l'appareil a déjà téléchargé le modèle sur l'appareil, cette vérification indiquera que le modèle est disponible.
Optimisation de la latence
Pour optimiser le premier appel d'inférence, vous pouvez demander à votre application d'appeler
warmup().
Cela charge le modèle sur l'appareil en mémoire et initialise les composants d'exécution.
Étape 4 : Initialisez le service et créez une instance de modèle
|
Cliquez sur votre fournisseur Gemini API pour afficher le contenu spécifique au fournisseur et le code sur cette page. |
Configurez les éléments suivants avant d'envoyer une requête de prompt au modèle.
Initialisez le service pour le fournisseur d'API de votre choix.
Créez une instance
GenerativeModelet définissez lemodesur l'une des valeurs suivantes. Les descriptions fournies ici sont très générales, mais vous pouvez en savoir plus sur le comportement de ces modes dans Définir un mode d'inférence.PREFER_ON_DEVICE: tente d'utiliser le modèle sur l'appareil ; sinon, revient au modèle hébergé dans le cloud.ONLY_ON_DEVICE: tente d'utiliser le modèle sur l'appareil ; sinon, génère une exception.PREFER_IN_CLOUD: tente d'utiliser le modèle hébergé dans le cloud ; sinon, revient au modèle sur l'appareil.ONLY_IN_CLOUD: tente d'utiliser le modèle hébergé dans le cloud ; sinon, génère une exception.
Kotlin
// Using this SDK to access on-device inference is an Experimental release and requires opt-in
@OptIn(PublicPreviewAPI::class)
// ...
// Initialize the Gemini Developer API backend service
// Create a GenerativeModel instance with a model that supports your use case
// Set the inference mode (like PREFER_ON_DEVICE to use the on-device model if available)
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
.generativeModel(
modelName = "MODEL_NAME",
onDeviceConfig = OnDeviceConfig(mode = InferenceMode.PREFER_ON_DEVICE)
)
Java
// Initialize the Gemini Developer API backend service
// Create a GenerativeModel instance with a model that supports your use case
// Set the inference mode (like PREFER_ON_DEVICE to use the on-device model if available)
GenerativeModel ai = FirebaseAI.getInstance(GenerativeBackend.googleAI())
.generativeModel(
"MODEL_NAME",
new OnDeviceConfig(InferenceMode.PREFER_ON_DEVICE)
);
// Use the GenerativeModelFutures Java compatibility layer which offers
// support for ListenableFuture and Publisher APIs
GenerativeModelFutures model = GenerativeModelFutures.from(ai);
Étape 5 : Envoyez une requête de prompt à un modèle
Cette section vous explique comment envoyer différents types d'entrées pour générer différents types de sorties, y compris :
Générer du texte à partir d'une entrée de texte uniquement
| Avant d'essayer cet exemple, assurez-vous d'avoir suivi les étapes de la section Commencer de ce guide. |
Vous pouvez utiliser
generateContent()
pour générer du texte à partir d'un prompt contenant du texte :
Kotlin
// Imports + initialization of Gemini API backend service + creation of model instance
// Provide a prompt that contains text
val prompt = "Write a story about a magic backpack."
// To generate text output, call generateContent with the text input
val response = model.generateContent(prompt)
print(response.text)
Java
// Imports + initialization of Gemini API backend service + creation of model instance
// Provide a prompt that contains text
Content prompt = new Content.Builder()
.addText("Write a story about a magic backpack.")
.build();
// To generate text output, call generateContent with the text input
ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
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);
Notez que Firebase AI Logic est également compatible avec le streaming des réponses textuelles à l'aide de
generateContentStream
(au lieu de generateContent).
Générer du texte à partir d'une entrée de texte et d'image (multimodale)
| Avant d'essayer cet exemple, assurez-vous d'avoir suivi les étapes de la section Commencer de ce guide. |
Vous pouvez utiliser
generateContent()
pour générer du texte à partir d'un prompt contenant du texte et jusqu'à un fichier image
(bitmap uniquement) en fournissant le mimeType de chaque fichier d'entrée et le fichier lui-même.
Kotlin
// Imports + initialization of Gemini API backend service + creation of model instance
// Loads an image from the app/res/drawable/ directory
val bitmap: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.sparky)
// Provide a prompt that includes the image specified above and text
val prompt = content {
image(bitmap)
text("What developer tool is this mascot from?")
}
// To generate text output, call generateContent with the prompt
val response = model.generateContent(prompt)
print(response.text)
Java
// Imports + initialization of Gemini API backend service + creation of model instance
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sparky);
// Provide a prompt that includes the image specified above and text
Content content = new Content.Builder()
.addImage(bitmap)
.addText("What developer tool is this mascot from?")
.build();
// To generate text output, call generateContent with the prompt
ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
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);
Notez que Firebase AI Logic est également compatible avec le streaming des réponses textuelles à l'aide de
generateContentStream
(au lieu de generateContent).
Qu'est-ce que tu sais faire d'autre ?
Vous pouvez utiliser différentes options et fonctionnalités de configuration supplémentaires pour vos expériences hybrides :
Déterminez si l'inférence sur l'appareil ou dans le cloud a été utilisée.
Utilisez la configuration du modèle pour contrôler les réponses (comme la température).
Fonctionnalités non encore disponibles pour l'inférence sur l'appareil
En tant que version expérimentale, toutes les fonctionnalités des modèles cloud ne sont pas disponibles pour l'inférence sur l'appareil.
Les fonctionnalités listées dans cette section ne sont pas encore disponibles pour l'inférence sur l'appareil. Si vous souhaitez utiliser l'une de ces fonctionnalités, nous vous recommandons d'utiliser le mode d'inférence ONLY_IN_CLOUD pour une expérience plus cohérente.
Générer une sortie structurée (comme JSON ou des enums)
Générer du texte à partir de types d'entrée de fichiers image autres que Bitmap (image chargée en mémoire)
Générer du texte à partir de plusieurs fichiers image
Générer du texte à partir d'entrées audio, vidéo et de documents (comme des PDF)
Générer des images à l'aide des modèles Gemini ou Imagen
Fournir des fichiers à l'aide d'URL dans des requêtes multimodales. Vous devez fournir des fichiers en tant que données intégrées aux modèles sur l'appareil
Envoyer des requêtes dépassant 4 000 jetons (ou environ 3 000 mots en anglais).
Chat multitour
Fournir au modèle des outils pour l'aider à générer sa réponse (comme l'appel de fonction, l'exécution de code, le contexte d'URL et l'ancrage avec la recherche Google)
La surveillance de l'IA dans la console Firebase n'affiche pas de données pour l'inférence sur l'appareil (y compris les journaux sur l'appareil). Toutefois, toute inférence qui utilise un modèle hébergé dans le cloud peut être surveillée comme une autre inférence via Firebase AI Logic.
Autres limites
En plus de ce qui précède, l'inférence sur l'appareil présente les limites suivantes (pour en savoir plus, consultez la documentation de ML Kit) :
L'utilisateur final de votre application doit utiliser un appareil compatible pour l'inférence sur l'appareil.
Votre application ne peut exécuter l'inférence sur l'appareil que lorsqu'elle est au premier plan.
Seuls l'anglais et le coréen ont été validés pour l'inférence sur l'appareil.
La limite maximale de jetons pour l'ensemble de la requête d'inférence sur l'appareil est de 4 000 jetons. Si vos requêtes sont susceptibles de dépasser cette limite, veillez à configurer un mode d'inférence qui peut utiliser un modèle hébergé dans le cloud.
Nous vous recommandons d'éviter les cas d'utilisation d'inférence sur l'appareil qui nécessitent une sortie longue (plus de 256 jetons).
AICore (un service système Android qui gère les modèles sur l'appareil) applique un quota d'inférence par application. Un trop grand nombre de requêtes API envoyées sur une courte période entraînera une réponse
ErrorCode.BUSY. Si vous recevez cette erreur, envisagez d'utiliser un intervalle exponentiel entre les tentatives pour réessayer la requête. De plus,ErrorCode.PER_APP_BATTERY_USE_QUOTA_EXCEEDEDpeut être renvoyé si une application dépasse un quota de longue durée (par exemple, un quota quotidien).
Envoyez des commentaires sur votre expérience avec Firebase AI Logic