GenAI Rewriting API

借助机器学习套件的 GenAI Rewriting API,您可以自动帮助用户以不同的风格或语气改写聊天消息或短篇内容。

在以下情况下,为用户提供有关如何重写内容的建议可能会很有帮助:

  • 重构消息,以便在与利益相关方沟通时更专业
  • 缩短消息,使其更适合在社交媒体平台上发布
  • 为非母语人士重述消息,寻找其他方式传达消息

主要功能

机器学习套件的 GenAI 重写 API 可以采用以下任一风格重写短篇幅的内容:

  • 详细说明:使用更多详细信息和描述性语言来扩展输入文本。
  • 转换为表情符号:向输入文本添加相关表情符号,使其更具表现力和趣味性。
  • 精简:将输入文本浓缩为更短的版本,同时保留核心信息。
  • 友好:使用对话口气重写输入文本,使其更随意、更平易近人。
  • 专业:使用尊重他人的语气,重写输入文本,使其更正式、更商务化。
  • 改写:使用不同的字词和句子结构重写输入文本,同时保持原始含义。

请求将返回至少一条建议。如果系统返回多个建议,结果会按置信度从高到低排序。

示例结果

输入 重写样式 输出
您是否希望见面详谈? 专业 您是否有兴趣再次见面,进一步讨论此事宜?
我诚邀您参加我下周六晚在住处举办的轻松聚会 精简 您想来我家参加这个星期六晚上的休闲聚会吗?
活动已成功 详细阐述 此次活动取得了巨大成功,超出了我们的所有预期,最终取得了辉煌的胜利。
我们近期见面喝杯咖啡吧 转换为表情符号 我们改日一起喝杯咖啡吧 ☕ 👋。
在当天结束前提供报告 友谊赛 能否请您在今天结束前分享该报告?
您好,我需要尽快处理此事 专业 您能否尽快提供所需的文件?
项目进度滞后 改写 项目时间表需要调整才能满足原始截止期限

使用入门

如需开始使用 GenAI Rewriting API,请将此依赖项添加到项目的 build 文件中。

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 重写 API 支持以下语言:英语、日语、法语、德语、意大利语、西班牙语和韩语,这些语言在 RewriterOptions.Language 中定义。输入应少于 256 个令牌。

特定功能配置(由 RewriterOptions 指定)的可用性可能会因具体设备的配置以及已下载到设备的模型而异。

如需确保设备支持请求的 RewriterOptions 所对应的 API 功能,开发者最可靠的方式是调用 checkFeatureStatus() 方法。此方法可在运行时提供设备上功能可用性的确切状态。

常见的设置问题

机器学习套件 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:无法解析主机 ... 保持网络连接,等待几分钟后重试。