Dzięki interfejsowi GenAI Rewriting API w ML Kit możesz automatycznie pomagać użytkownikom w przepisywanie wiadomości na czacie lub krótkich treści w innym stylu lub tonie.
Użytkownicy mogą potrzebować sugestii, jak zmienić treść w tych przypadkach:
- przekształcanie wiadomości w celu nadania jej bardziej profesjonalnego charakteru podczas komunikacji z grupami zainteresowanych;
- Skrócenie wiadomości, aby lepiej pasowała do publikacji w mediach społecznościowych
- Przeformułowanie wiadomości dla osób, dla których językiem ojczystym nie jest język docelowy, aby mogły znaleźć alternatywne sposoby komunikowania się
Najważniejsze funkcje
Interfejs GenAI Rewriting API w ML Kit może przekształcać krótkie treści w jednym z tych stylów:
- Rozwiń twórczo: rozszerza tekst wejściowy o szczegóły i język opisowy.
- Emojify: dodaje odpowiednie emotikony do tekstu wejściowego, dzięki czemu staje się on bardziej wyrazisty i zabawny.
- Skróć: skraca tekst wejściowy do krótszej wersji, zachowując główną treść.
- Przyjazny: przepisuje tekst wejściowy, aby był bardziej swobodny i przystępny, używając języka potocznego.
- Profesjonalny: przepisuje tekst wejściowy, aby był bardziej formalny i biznesowy, używając szacunku.
- Zmodyfikuj: przeformułowuje podany tekst, używając innych słów i struktur zdań, przy zachowaniu pierwotnego znaczenia.
Zapytania zwracają co najmniej 1 sugestię. Jeśli zwrócono wiele sugestii, wyniki zostaną posortowane według malejącej wiarygodności.
Przykładowe wyniki
Wejście | Styl przeredagowania | Dane wyjściowe |
Czy chcesz się spotkać, żeby porozmawiać? | Profesjonalny | Czy chcesz umówić się na kolejne spotkanie, aby omówić tę sprawę? |
Chcielibyśmy zaprosić Cię na spotkanie w przyjemnej atmosferze w naszym domu w nadchodzącą sobotę wieczorem. | Skróć | Czy w sobotę wieczorem masz ochotę na spotkanie u mnie? |
Zdarzenie zostało ukończone | Pokaż więcej | Wydarzenie okazało się wielkim sukcesem, przewyższając nasze oczekiwania. |
Spotkajmy się na kawę | Zamień na emotikony | Spotkajmy się na kawę ☕ w najbliższym czasie. 👋 |
Prześlij raport do końca dnia. | Towarzyski | Czy możesz udostępnić raport do końca dnia? |
Cześć, potrzebuję tego jak najszybciej | Profesjonalny | Prześlij wymagane dokumenty przy najbliższej okazji. |
Projekt jest opóźniony | Sparafrazuj | harmonogram projektu wymaga dostosowania, aby można było dotrzymać pierwotnego terminu; |
Pierwsze kroki
Aby rozpocząć korzystanie z interfejsu API do przekształcania za pomocą generatywnej AI, dodaj tę zależność do pliku kompilacji projektu.
implementation("com.google.mlkit:genai-rewriting:1.0.0-beta1")
Następnie utwórz instancję klienta Rewriter
z wymaganymi opcjami, sprawdź, czy dostępne są wymagane funkcje modelu na urządzeniu (i w razie potrzeby pobierz je), przygotuj tekst wejściowy jako żądanie, uruchom proces przepisywania, aby uzyskać sugestie, i zwolnij zasoby.
Kotlin
val textToRewrite = "The event was successful"
// Define task with selected input and output format
val rewriterOptions = RewriterOptions.builder(context)
// OutputType can be one of the following: ELABORATE, EMOJIFY, SHORTEN,
// FRIENDLY, PROFESSIONAL, REPHRASE
.setOutputType(RewriterOptions.OutputType.ELABORATE)
// Refer to RewriterOptions.Language for available languages
.setLanguage(RewriterOptions.Language.ENGLISH)
.build()
val rewriter = Rewriting.getClient(rewriterOptions)
suspend fun prepareAndStartRewrite() {
// Check feature availability, status will be one of the following:
// UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
val featureStatus = rewriter.checkFeatureStatus().await()
if (featureStatus == FeatureStatus.DOWNLOADABLE) {
// Download feature if necessary.
// If downloadFeature is not called, the first inference request will
// also trigger the feature to be downloaded if it's not already
// downloaded.
rewriter.downloadFeature(object : DownloadCallback {
override fun onDownloadStarted(bytesToDownload: Long) { }
override fun onDownloadFailed(e: GenAiException) { }
override fun onDownloadProgress(totalBytesDownloaded: Long) {}
override fun onDownloadCompleted() {
startRewritingRequest(textToRewrite, rewriter)
}
})
} else if (featureStatus == FeatureStatus.DOWNLOADING) {
// Inference request will automatically run once feature is
// downloaded.
// If Gemini Nano is already downloaded on the device, the
// feature-specific LoRA adapter model will be downloaded
// quickly. However, if Gemini Nano is not already downloaded,
// the download process may take longer.
startRewritingRequest(textToRewrite, rewriter)
} else if (featureStatus == FeatureStatus.AVAILABLE) {
startRewritingRequest(textToRewrite, rewriter)
}
}
suspend fun startRewritingRequest(text: String, rewriter: Rewriter) {
// Create task request
val rewritingRequest = RewritingRequest.builder(text).build()
// Start rewriting request with non-streaming response
// More than 1 result may be returned. If multiple suggestions are
// returned, results will be sorted by descending confidence.
val rewriteResults =
rewriter.runInference(rewritingRequest).await().results
// You can also start a streaming request
// rewriter.runInference(rewritingRequest) { newText ->
// // Show new text in UI
// }
}
// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
rewriter.close()
Java
String textToRewrite = "The event was successful";
// Define task with required input and output format
RewriterOptions rewriterOptions =
RewriterOptions.builder(context)
// OutputType can be one of the following: ELABORATE,
// EMOJIFY, SHORTEN, FRIENDLY, PROFESSIONAL, REPHRASE
.setOutputType(RewriterOptions.OutputType.ELABORATE)
// Refer to RewriterOptions.Language for available
// languages
.setLanguage(RewriterOptions.Language.ENGLISH)
.build();
Rewriter rewriter = Rewriting.getClient(rewriterOptions);
void prepareAndStartRewrite()
throws ExecutionException, InterruptedException {
// Check feature availability, status will be one of the
// following: UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
try {
int featureStatus = rewriter.checkFeatureStatus().get();
if (featureStatus == FeatureStatus.DOWNLOADABLE) {
// Download feature if necessary.
// If downloadFeature is not called, the first inference
// request will also trigger the feature to be downloaded
// if it's not already downloaded.
rewriter.downloadFeature(
new DownloadCallback() {
@Override
public void onDownloadCompleted() {
startRewritingRequest(textToRewrite, rewriter);
}
@Override
public void onDownloadFailed(GenAIException e) {}
@Override
public void onDownloadProgress(
long totalBytesDownloaded) {}
@Override
public void onDownloadStarted(long bytesDownloaded) {}
});
} else if (featureStatus == FeatureStatus.DOWNLOADING) {
// Inference request will automatically run once feature is
// downloaded.
// If Gemini Nano is already downloaded on the device, the
// feature-specific LoRA adapter model will be downloaded
// quickly. However, if Gemini Nano is not already downloaded,
// the download process may take longer.
startRewritingRequest(textToRewrite, rewriter);
} else if (featureStatus == FeatureStatus.AVAILABLE) {
startRewritingRequest(textToRewrite, rewriter);
}
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}
void startRewritingRequest(String text, Rewriter rewriter) {
// Create task request
RewritingRequest rewritingRequest =
RewritingRequest.builder(text).build();
try {
// Start rewriting request with non-streaming response
// More than 1 result may be returned. If multiple
// suggestions are returned, results will be sorted by
// descending confidence.
rewriter.runInference(rewritingRequest).get().getResults();
// You can also start a streaming request
// rewriter.runInference(rewritingRequest, newText -> {
// // Show new text in UI
// });
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}
// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
rewriter.close();
Obsługiwane funkcje i ograniczenia
Interfejs GenAI Rewriting API obsługuje te języki: angielski, francuski, hiszpański, japoński, koreański, niemiecki i włoski. Są one zdefiniowane w RewriterOptions.Language
. Dane wejściowe powinny mieć mniej niż 256 tokenów.
Dostępność konfiguracji danej funkcji (określanej przez RewriterOptions
) może się różnić w zależności od konfiguracji konkretnego urządzenia i modeli pobranych na urządzenie.
Najbardziej niezawodnym sposobem na sprawdzenie przez deweloperów, czy dana funkcja interfejsu API jest obsługiwana na urządzeniu z żądanym RewriterOptions
, jest wywołanie metody checkFeatureStatus()
. Ta metoda zapewnia ostateczny stan dostępności funkcji na urządzeniu w czasie wykonywania.
Typowe problemy z konfiguracją
Interfejsy API ML Kit GenAI korzystają z aplikacji Android AICore, aby uzyskać dostęp do Gemini Nano. Gdy urządzenie zostanie dopiero skonfigurowane (w tym zresetowane) lub aplikacja AICore zostanie dopiero zresetowana (np. przez wyczyszczenie danych, odinstalowanie i ponowne zainstalowanie), może ona nie mieć wystarczająco dużo czasu na zakończenie inicjalizacji (w tym pobrania najnowszych konfiguracji z serwera). W związku z tym interfejsy API ML Kit GenAI mogą nie działać zgodnie z oczekiwaniami. Oto typowe komunikaty o błędach konfiguracji, które mogą się pojawić, oraz sposoby ich rozwiązywania:
Przykładowy komunikat o błędzie | Jak postępować |
Nie udało się uruchomić AICore. Wystąpił błąd typu 4-CONNECTION_ERROR i kod błędu 601-BINDING_FAILURE: nie udało się połączyć usługi AICore. | Może się tak zdarzyć, gdy zainstalujesz aplikację za pomocą interfejsów ML Kit GenAI bezpośrednio po skonfigurowaniu urządzenia lub gdy po zainstalowaniu aplikacji odinstalujesz AICore. Problem powinien rozwiązać zaktualizowanie aplikacji AICore, a następnie ponowne zainstalowanie aplikacji. |
Nie udało się uruchomić AICore. Wystąpił błąd typu 3-PREPARATION_ERROR i kod błędu 606-FEATURE_NOT_FOUND: Funkcja … jest niedostępna. |
Może się tak zdarzyć, gdy AICore nie skończyło pobierania najnowszych konfiguracji. Nie przerywaj połączenia z internetem i zaczekaj kilka minut lub godzin.
Jeśli bootloader urządzenia jest odblokowany, również zobaczysz ten błąd – ten interfejs API nie obsługuje urządzeń ze zwykłym bootloaderem. |
AICore nie powiodło się: błąd typu 1-DOWNLOAD_ERROR i kod błędu 0-UNKNOWN: funkcja ... nie powiodła się ze stanem błędu 0 i błędem esz: UNAVAILABLE: nie można rozpoznać hosta ... | Nie rozłączaj się z siecią, zaczekaj kilka minut i spróbuj ponownie. |