Auf dieser Seite wird Folgendes beschrieben:
- Projekt für die Verwendung der Prompt API konfigurieren
- Nur-Text-Eingabe bereitstellen und Antwort erhalten
- Bildeingaben mit zugehöriger Texteingabe bereitstellen und eine Antwort erhalten
Weitere Informationen zur Prompt API finden Sie in der Referenzdokumentation für Kotlin (com.google.mlkit.genai.prompt) und Java (com.google.mlkit.genai.prompt.java, com.google.mlkit.genai.prompt).
Projekt konfigurieren
Fügen Sie die ML Kit Prompt API als Abhängigkeit in Ihrer build.gradle-Konfiguration hinzu:
implementation("com.google.mlkit:genai-prompt:1.0.0-beta4")
Wenn Sie Ihre Antworten in einem bestimmten Format über die Structured Output API benötigen, müssen Sie KSP konfigurieren und zusätzliche Abhängigkeiten hinzufügen. Weitere Informationen finden Sie unter Strukturierte Ausgabe generieren.
Generatives Modell implementieren
So implementieren Sie den Code in Ihrem Projekt:
Erstellen Sie ein
generativeModel-Objekt:Kotlin
// Get a GenerativeModel instance val generativeModel = Generation.getClient()Java
// Get a GenerativeModel instance GenerativeModelFutures generativeModelFutures = GenerativeModelFutures .from(Generation.INSTANCE.getClient());Prüfen Sie, ob Gemini Nano
AVAILABLE,,DOWNLOADABLEoderUNAVAILABLEist. Laden Sie dann das Feature herunter, falls es herunterladbar ist:Kotlin
val status = generativeModel.checkStatus() when (status) { FeatureStatus.UNAVAILABLE -> { // Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it } FeatureStatus.DOWNLOADABLE -> { // Gemini Nano can be downloaded on this device, but is not currently downloaded generativeModel.download().collect { status -> when (status) { is DownloadStatus.DownloadStarted -> Log.d(TAG, "starting download for Gemini Nano") is DownloadStatus.DownloadProgress -> Log.d(TAG, "Nano ${status.totalBytesDownloaded} bytes downloaded") DownloadStatus.DownloadCompleted -> { Log.d(TAG, "Gemini Nano download complete") modelDownloaded = true } is DownloadStatus.DownloadFailed -> { Log.e(TAG, "Nano download failed ${status.e.message}") } } } } FeatureStatus.DOWNLOADING -> { // Gemini Nano currently being downloaded } FeatureStatus.AVAILABLE -> { // Gemini Nano currently downloaded and available to use on this device } }Java
ListenableFuture<Integer> status = generativeModelFutures.checkStatus(); Futures.addCallback(generativeModelFutures.checkStatus(), new FutureCallback<>() { @Override public void onSuccess(Integer featureStatus) { switch (featureStatus) { case FeatureStatus.AVAILABLE - > { // Gemini Nano currently downloaded and available to use on this device } case FeatureStatus.UNAVAILABLE - > { // Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it } case FeatureStatus.DOWNLOADING - > { // Gemini Nano currently being downloaded } case FeatureStatus.DOWNLOADABLE - > { generativeModelFutures.download(new DownloadCallback() { @Override public void onDownloadStarted(long l) { Log.d(TAG, "starting download for Gemini Nano"); } @Override public void onDownloadProgress(long l) { Log.d(TAG, "Nano " + l + " bytes downloaded"); } @Override public void onDownloadCompleted() { Log.d(TAG, "Gemini Nano download complete"); } @Override public void onDownloadFailed(@NonNull GenAiException e) { Log.e(TAG, "Nano download failed: " + e.getMessage()); } }); } } } @Override public void onFailure(@NonNull Throwable t) { // Failed to check status } }, ContextCompat.getMainExecutor(context));
Nur-Text-Eingabe bereitstellen
Kotlin
val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog.")
Java
GenerateContentResponse response = generativeModelFutures.generateContent(
new GenerateContentRequest.Builder(
new TextPart("Write a 3 sentence story about a magical dog."))
.build())
.get();
Alternativ können Sie optionale Parameter hinzufügen:
Kotlin
val response = generativeModel.generateContent(
generateContentRequest(
TextPart("Write a 3 sentence story about a magical dog."),
) {
// Optional parameters
temperature = 0.2f
topK = 10
candidateCount = 3
},
)
Java
GenerateContentRequest.Builder requestBuilder =
new GenerateContentRequest.Builder(
new TextPart("Write a 3 sentence story about a magical dog."));
requestBuilder.setTemperature(.2f);
requestBuilder.setTopK(10);
requestBuilder.setCandidateCount(3);
GenerateContentResponse response =
generativeModelFutures.generateContent(requestBuilder.build()).get();
Weitere Informationen zu den optionalen Parametern finden Sie unter Optionale Konfigurationen.
Multimodale Eingabe (Bild und Text) bereitstellen
Bündeln Sie mehrere Bilder und eine Texteingabe in der Funktion generateContentRequest(). Der Text-Prompt sollte eine Frage oder ein Befehl im Zusammenhang mit dem Bild sein. Sie können bis zu 10 Bilder in einer Anfrage bündeln.
Kotlin
val response = generativeModel.generateContent(
generateContentRequest(ImagePart(bitmap1), ImagePart(bitmap2), TextPart(textPrompt)) {
// optional parameters
...
},
)
Java
GenerateContentResponse response = generativeModelFutures.generateContent(
new GenerateContentRequest.Builder(
new Content.Builder()
.addPart(new ImagePart(bitmap1))
.addPart(new ImagePart(bitmap2))
.addPart(new TextPart("textPrompt"))
.build())
// optional parameters
.build())
.get();
Inferenzergebnis verarbeiten
Führen Sie die Inferenz aus und rufen Sie das Ergebnis ab. Sie können entweder auf das vollständige Ergebnis warten oder die Antwort streamen, während sie generiert wird. Dies gilt sowohl für Nur-Text- als auch für multimodale Prompts.
Dabei wird eine Nicht-Streaming-Inferenz verwendet, bei der das gesamte Ergebnis vom KI-Modell abgerufen wird, bevor es zurückgegeben wird:
Kotlin
// Call the AI model to generate content and store the complete // in a new variable named 'response' once it's finished val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog")Java
GenerateContentResponse response = generativeModelFutures.generateContent( new GenerateContentRequest.Builder( new TextPart("Write a 3 sentence story about a magical dog.")) .build()) .get();Die folgenden Snippets sind Beispiele für die Verwendung der Streaming-Inferenz, bei der das Ergebnis in Blöcken abgerufen wird, während es generiert wird:
Kotlin
// Streaming inference var fullResponse = "" generativeModel.generateContentStream("Write a 3 sentence story about a magical dog").collect { chunk -> val newChunkReceived = chunk.candidates[0].text print(newChunkReceived) fullResponse += newChunkReceived }Java
// Streaming inference StringBuilder fullResponse = new StringBuilder(); generativeModelFutures.generateContent(new GenerateContentRequest.Builder( (new TextPart("Write a 3 sentence story about a magical dog"))).build(), chunk -> { Log.d(TAG, chunk); fullResponse.append(chunk); });
Weitere Informationen zu Streaming- und Nicht-Streaming-Inferenz finden Sie unter Streaming im Vergleich zu Nicht-Streaming.
Latenzoptimierung
Zur Optimierung des ersten Inferenzaufrufs kann Ihre Anwendung optional warmup() aufrufen. Dadurch wird Gemini Nano in den Arbeitsspeicher geladen und die Laufzeitkomponenten werden initialisiert.
Optionale Konfigurationen
Im Rahmen jeder GenerateContentRequest können Sie die folgenden optionalen Parameter festlegen:
temperature: Bestimmt den Grad der Zufälligkeit bei der Tokenauswahl.seed: Ermöglicht das Generieren stabiler und deterministischer Ergebnisse.topK: Steuert die Zufälligkeit und Vielfalt der Ergebnisse.candidateCount: Fordert die Anzahl der zurückgegebenen eindeutigen Antworten an. Die genaue Anzahl der Antworten entspricht möglicherweise nichtcandidateCount, da doppelte Antworten automatisch entfernt werden.maxOutputTokens: Definiert die maximale Anzahl an Tokens, die in der Antwort generiert werden können.
Weitere Informationen zum Festlegen optionaler Konfigurationen finden Sie unter GenerateContentRequest.
Unterstützte Funktionen und Einschränkungen
- Die Eingabe muss weniger als 4.000 Tokens (oder etwa 3.000 englische Wörter) umfassen. Weitere Informationen finden Sie in der Referenz zu
countTokens. - Anwendungsfälle, die eine lange Ausgabe (mehr als 4.000 Tokens) erfordern, sollten vermieden werden.
- AICore erzwingt ein Inferenzkontingent pro App. Weitere Informationen finden Sie unter Kontingent pro Anwendung.
Häufig auftretende Probleme bei der Einrichtung
Die GenAI APIs des ML Kit greifen über die Android AICore-App auf Gemini Nano zu. Wenn ein Gerät gerade erst eingerichtet (oder zurückgesetzt) wurde oder die AICore App gerade zurückgesetzt wurde (z.B. durch Löschen von Daten, Deinstallieren und Neuinstallieren), hat die AICore App möglicherweise nicht genügend Zeit, um die Initialisierung abzuschließen (einschließlich des Herunterladens der neuesten Konfigurationen vom Server). Daher funktionieren die ML Kit GenAI APIs möglicherweise nicht wie erwartet. Hier sind die häufigsten Fehlermeldungen bei der Einrichtung und wie du sie beheben kannst:
| Beispiel für Fehlermeldung | Vorgehensweise |
| AICore ist mit dem Fehlertyp 4-CONNECTION_ERROR und dem Fehlercode 601-BINDING_FAILURE fehlgeschlagen: Der AICore-Dienst konnte nicht gebunden werden. | Das kann passieren, wenn Sie die App mit ML Kit GenAI APIs direkt nach der Geräteeinrichtung installieren oder wenn AICore nach der Installation Ihrer App deinstalliert wird. Das Problem sollte behoben sein, wenn du die AICore App aktualisierst und deine App dann neu installierst. |
| AICore ist mit dem Fehlertyp 3-PREPARATION_ERROR und dem Fehlercode 606-FEATURE_NOT_FOUND fehlgeschlagen: Die Funktion ... ist nicht verfügbar. |
Das kann passieren, wenn AICore die neuesten Konfigurationen noch nicht heruntergeladen hat. Wenn das Gerät mit dem Internet verbunden ist, dauert die Aktualisierung in der Regel einige Minuten bis einige Stunden. Ein Neustart des Geräts kann das Update beschleunigen.
Wenn der Bootloader des Geräts entsperrt ist, wird dieser Fehler ebenfalls angezeigt. Diese API unterstützt keine Geräte mit entsperrten Bootloadern. |
| AICore ist mit dem Fehlertyp 1-DOWNLOAD_ERROR und dem Fehlercode 0-UNKNOWN fehlgeschlagen: Die Funktion ... ist mit dem Fehlerstatus 0 und dem Fehler esz: UNAVAILABLE: Unable to resolve host ... fehlgeschlagen. | Behalte die Netzwerkverbindung bei, warte einige Minuten und versuche es dann noch einmal. |