API Viết lại GenAI

Với API Viết lại GenAI của Bộ công cụ học máy, bạn có thể tự động giúp người dùng viết lại tin nhắn trò chuyện hoặc nội dung ngắn theo phong cách hoặc giọng điệu khác.

Người dùng có thể thấy hữu ích khi được cung cấp các đề xuất về cách viết lại nội dung trong các trường hợp sau:

  • Tái cấu trúc thông báo để chuyên nghiệp hơn khi giao tiếp với các bên liên quan
  • Rút ngắn tin nhắn để phù hợp hơn khi đăng trên các nền tảng mạng xã hội
  • Viết lại thông điệp cho những người không phải là người bản địa đang tìm kiếm cách khác để truyền tải thông điệp

Các chức năng chính

API Viết lại GenAI của Bộ công cụ học máy có thể viết lại các đoạn nội dung ngắn theo một trong các kiểu sau:

  • Thêm chi tiết: Mở rộng văn bản đầu vào bằng nhiều thông tin chi tiết và ngôn ngữ mô tả hơn.
  • Emojify (Chuyển đổi sang biểu tượng cảm xúc): Thêm biểu tượng cảm xúc phù hợp vào văn bản nhập, giúp văn bản trở nên sống động và thú vị hơn.
  • Rút ngắn: Rút gọn văn bản đầu vào thành một phiên bản ngắn hơn, giữ nguyên thông điệp cốt lõi.
  • Thân thiện: Viết lại văn bản đầu vào để trở nên thân mật và dễ tiếp cận hơn, sử dụng giọng điệu trò chuyện.
  • Chuyên nghiệp: Viết lại văn bản đầu vào để văn bản đó trang trọng và mang tính kinh doanh hơn, sử dụng giọng điệu tôn trọng.
  • Diễn đạt lại: Viết lại văn bản đầu vào bằng các từ và cấu trúc câu khác, trong khi vẫn giữ nguyên ý nghĩa ban đầu.

Yêu cầu sẽ trả về ít nhất một đề xuất. Nếu trả về nhiều đề xuất, kết quả sẽ được sắp xếp theo mức độ tin cậy giảm dần.

Kết quả mẫu

Input Kiểu viết lại Kết quả
Bạn có muốn gặp mặt để trao đổi thêm không? Chuyên nghiệp Bạn có muốn gặp lại để trao đổi thêm về vấn đề này không?
Tôi rất mong bạn có thể tham gia buổi họp mặt thân mật tại nhà tôi vào tối thứ Bảy tới Rút ngắn Bạn có muốn cùng tôi gặp gỡ bạn bè tại nhà tôi vào tối thứ Bảy này không?
Sự kiện đã thành công Giải thích chi tiết Sự kiện này đã thành công vang dội, vượt qua mọi kỳ vọng của chúng tôi và trở thành một chiến thắng vang dội.
Hãy cùng đi uống cà phê vào một ngày gần đây Chuyển đổi sang biểu tượng cảm xúc Hãy cùng nhau đi uống cà phê ☕ trong thời gian sớm nhất có thể 👋.
Cung cấp báo cáo vào cuối ngày Thân thiện Vui lòng chia sẻ báo cáo trước cuối ngày.
Này, tôi cần thứ đó ngay lập tức Chuyên nghiệp Vui lòng cung cấp giấy tờ được yêu cầu sớm nhất có thể.
Dự án bị chậm tiến độ Diễn đạt lại Tiến trình dự án cần được điều chỉnh để đáp ứng thời hạn ban đầu

Bắt đầu

Để bắt đầu sử dụng API Viết lại GenAI, hãy thêm phần phụ thuộc này vào tệp bản dựng của dự án.

implementation("com.google.mlkit:genai-rewriting:1.0.0-beta1")

Sau đó, tạo bản sao ứng dụng Rewriter bằng các tuỳ chọn bắt buộc, kiểm tra xem các tính năng mô hình trên thiết bị bắt buộc có sẵn hay không (và tải các tính năng đó xuống nếu cần), chuẩn bị văn bản đầu vào dưới dạng yêu cầu, chạy quy trình viết lại để nhận đề xuất và giải phóng tài nguyên.

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();

Các tính năng được hỗ trợ và giới hạn

API Viết lại GenAI hỗ trợ các ngôn ngữ sau: tiếng Anh, tiếng Nhật, tiếng Pháp, tiếng Đức, tiếng Ý, tiếng Tây Ban Nha và tiếng Hàn. Các ngôn ngữ này được xác định trong RewriterOptions.Language. Dữ liệu đầu vào phải có ít hơn 256 mã thông báo.

Khả năng hoạt động của cấu hình tính năng cụ thể (do RewriterOptions chỉ định) có thể thay đổi tuỳ thuộc vào cấu hình của thiết bị cụ thể và các mô hình đã được tải xuống thiết bị.

Cách đáng tin cậy nhất để nhà phát triển đảm bảo rằng tính năng API dự kiến được hỗ trợ trên thiết bị có RewriterOptions được yêu cầu là gọi phương thức checkFeatureStatus(). Phương thức này cung cấp trạng thái xác định về khả năng sử dụng tính năng trên thiết bị trong thời gian chạy.

Các vấn đề thường gặp khi thiết lập

Các API GenAI của Bộ công cụ học máy dựa vào ứng dụng Android AICore để truy cập vào Gemini Nano. Khi một thiết bị vừa được thiết lập (bao gồm cả việc đặt lại) hoặc ứng dụng AICore vừa được đặt lại (ví dụ: xoá dữ liệu, gỡ cài đặt rồi cài đặt lại), ứng dụng AICore có thể không có đủ thời gian để hoàn tất quá trình khởi chạy (bao gồm cả việc tải cấu hình mới nhất xuống từ máy chủ). Do đó, các API GenAI của Bộ công cụ học máy có thể không hoạt động như mong đợi. Dưới đây là các thông báo lỗi thiết lập thường gặp mà bạn có thể thấy và cách xử lý các lỗi đó:

Ví dụ về thông báo lỗi Cách xử lý
AICore không thành công với loại lỗi 4-CONNECTION_ERROR và mã lỗi 601-BINDING_FAILURE: Không thể liên kết dịch vụ AICore. Điều này có thể xảy ra khi bạn cài đặt ứng dụng bằng các API GenAI của Bộ công cụ học máy ngay sau khi thiết lập thiết bị hoặc khi AICore bị gỡ cài đặt sau khi ứng dụng của bạn được cài đặt. Bạn có thể khắc phục vấn đề này bằng cách cập nhật ứng dụng AICore rồi cài đặt lại ứng dụng.
AICore không thành công với loại lỗi 3-PREPARATION_ERROR và mã lỗi 606-FEATURE_NOT_FOUND: Tính năng ... không có sẵn. Điều này có thể xảy ra khi AICore chưa tải xong các cấu hình mới nhất. Duy trì kết nối mạng và đợi từ vài phút đến vài giờ.

Xin lưu ý rằng nếu trình tải khởi động của thiết bị đã được mở khoá, bạn cũng sẽ thấy lỗi này – API này không hỗ trợ các thiết bị có trình tải khởi động đã mở khoá.
AICore không thành công với loại lỗi 1-DOWNLOAD_ERROR và mã lỗi 0-UNKNOWN: Tính năng ... không thành công với trạng thái lỗi 0 và lỗi esz: UNAVAILABLE: Unable to resolve host ... Duy trì kết nối mạng, chờ vài phút rồi thử lại.