ML Kit の GenAI Rewriting API を使用すると、チャット メッセージや短いコンテンツを別のスタイルやトーンで自動的に書き換えることができます。
ユーザーは、次のような場合にコンテンツの書き換え方法に関する提案が役立つと感じる可能性があります。
- ステークホルダーとのコミュニケーションで、メッセージをよりプロフェッショナルなものに再構成する
- ソーシャル メディア プラットフォームへの投稿に適したメッセージに短縮する
- メッセージを別の方法で伝えたいと考えている英語を母国語としないユーザー向けにメッセージを言い換える
主な機能
ML Kit の GenAI Rewriting API は、短いコンテンツを次のいずれかのスタイルで書き換えることができます。
- 詳述: 入力テキストに詳細と説明的な表現を追加します。
- Emojify: 入力テキストに関連する絵文字を追加して、より表現豊かで楽しいものにします。
- 短縮: 入力テキストを短縮し、元のメッセージの要点を維持します。
- 親しみやすい: 入力テキストをよりカジュアルで親しみやすい表現に書き換え、会話的なトーンを使用します。
- プロフェッショナル: 敬意を払ったトーンで、入力テキストをよりフォーマルでビジネスライクな表現に書き換えます。
- 言い換え: 元の意味を維持しながら、別の単語や文構造を使用して入力テキストを書き換えます。
リクエストは少なくとも 1 つの提案を返します。複数の候補が返された場合、結果は信頼度の降順で並べ替えられます。
検索結果の例
入力 | 書き換えスタイル | 出力 |
詳細についてお話する機会を設けてもよろしいでしょうか? | プロフェッショナル | この件について、改めてお打ち合わせをさせていただくことは可能でしょうか? |
来週の土曜日の夜に、私の家でカジュアルな集まりを開きたいと考えております。 | 短縮 | 今週の土曜日の夜に、私の家でカジュアルな集まりを開きます。参加しませんか? |
イベントが成功しました | 詳述 | イベントは大成功を収め、すべての期待を上回る結果となりました。 |
近いうちにコーヒーを飲みに行きましょう | 絵文字を追加 | 近いうちにコーヒーを飲みに行きましょう ☕ 👋。 |
本日中にレポートを提出してください | フレンドリー | 本日中にレポートをお送りいただけますか? |
すみません、あの件を早急にお願いします | プロフェッショナル | ご都合のよいときに、求められている書類をご提供いただけますでしょうか。 |
プロジェクトが予定より遅れている | 言い換え | 元の期限を満たすためにプロジェクトのタイムラインの調整が必要 |
スタートガイド
GenAI Rewriting API の使用を開始するには、プロジェクトのビルドファイルにこの依存関係を追加します。
implementation("com.google.mlkit:genai-rewriting:1.0.0-beta1")
次に、必要なオプションを使用して Rewriter
クライアントをインスタンス化し、必要なオンデバイス モデル機能が利用可能かどうかを確認(必要に応じてダウンロード)し、入力テキストをリクエストとして準備し、書き換えプロセスを実行して候補を取得し、リソースを解放します。
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();
サポートされている機能と制限事項
GenAI Rewriting API は、英語、日本語、フランス語、ドイツ語、イタリア語、スペイン語、韓国語をサポートしています。これらの言語は RewriterOptions.Language
で定義されています。入力は 256 トークン未満にする必要があります。
特定の機能構成(RewriterOptions
で指定)の利用可能性は、特定のデバイスの構成と、デバイスにダウンロードされたモデルによって異なる場合があります。
デベロッパーが、リクエストされた RewriterOptions
を備えたデバイスで目的の API 機能がサポートされていることを確認する最も確実な方法は、checkFeatureStatus()
メソッドを呼び出すことです。このメソッドは、実行時のデバイスでの機能の利用可能性に関する最終的なステータスを提供します。
セットアップに関する一般的な問題
ML Kit GenAI API は、Android AICore アプリを使用して Gemini Nano にアクセスします。デバイスのセットアップ直後(リセット後を含む)や、AICore アプリのリセット直後(データの消去、アンインストール後の再インストールなど)は、AICore アプリが初期化(サーバーからの最新の構成のダウンロードなど)を完了するのに十分な時間がないことがあります。そのため、ML Kit GenAI API が想定どおりに機能しない可能性があります。表示される可能性のある一般的な設定エラー メッセージとその対処方法は次のとおりです。
エラー メッセージの例 | 対応方法 |
AICore がエラータイプ 4-CONNECTION_ERROR とエラーコード 601-BINDING_FAILURE で失敗しました。AICore サービスをバインドできませんでした。 | この問題は、デバイスのセットアップ直後に ML Kit GenAI API を使用してアプリをインストールした場合や、アプリのインストール後に AICore がアンインストールされた場合に発生する可能性があります。AICore アプリを更新してからアプリを再インストールすると、問題が解決します。 |
AICore がエラータイプ 3-PREPARATION_ERROR とエラーコード 606-FEATURE_NOT_FOUND で失敗しました。機能 ... は利用できません。 |
これは、AICore が最新の構成のダウンロードを完了していない場合に発生する可能性があります。デバイスがインターネットに接続されている場合、通常は数分から数時間で更新が完了します。デバイスを再起動すると、更新を速めることができます。
デバイスのブートローダーがロック解除されている場合も、このエラーが表示されます。この API は、ブートローダーがロック解除されているデバイスをサポートしていません。 |
AICore がエラータイプ 1(DOWNLOAD_ERROR)とエラーコード 0(UNKNOWN)で失敗しました。機能 ... が失敗ステータス 0 とエラー esz(UNAVAILABLE: Unable to resolve host ...)で失敗しました。 | ネットワーク接続を維持し、数分待ってから再試行します。 |