API Viết lại GenAI

Với GenAI Rewriting API của ML Kit, bạn có thể tự động giúp người dùng viết lại tin nhắn trò chuyện hoặc đoạn nội dung ngắn theo một 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 một đoạn nội dung trong các trường hợp sau:

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

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

API Viết lại bằng AI tạo sinh 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 những phong cách sau:

  • Thêm chi tiết: Mở rộng văn bản đầu vào bằng nhiều chi tiết và ngôn ngữ mô tả hơn.
  • Emojify: Thêm các biểu tượng cảm xúc phù hợp vào văn bản đầu vào, giúp văn bản trở nên biểu cảm 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 mà vẫ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 sao cho thân mật và gần gũi 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 sao cho 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, nhưng vẫn giữ nguyên ý nghĩa ban đầu.

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

Kết quả mẫu

Input Kiểu viết lại Đầu ra
Bạn có muốn gặp mặt để nói chuyện thêm không? Chuyên nghiệp Bạn có muốn gặp lại để thảo luận thêm về vấn đề này không?
Tôi rất mong bạn có thể đến dự buổi gặp mặt thân mật tại nhà tôi vào tối thứ Bảy tuần này Rút ngắn Bạn có muốn đến nhà tôi chơi vào tối thứ Bảy tuần này không?
Sự kiện đã diễn ra thành công Trình bày chi tiết Sự kiện này đã thành công vang dội, vượt quá mọi mong đợi của chúng tôi và chứng tỏ là một thành công vang dội.
Lát nữa đi uống cà phê nhé Chèn biểu tượng cảm xúc Lát nữa đi uống cà phê ☕ nhé 👋.
Cung cấp báo cáo vào cuối ngày Thân thiện Vui lòng gửi báo cáo trước khi hết ngày hôm nay.
Chào bạn, tôi cần thứ đó càng sớm càng tốt 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 đang chậm tiến độ Diễn đạt lại Cần điều chỉnh tiến độ dự án để đáp ứng thời hạn ban đầu

Bắt đầu

Để bắt đầu sử dụng GenAI Rewriting API, 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 đó, hãy khởi tạo ứng dụng khách Rewriter bằng các lựa chọn bắt buộc, kiểm tra xem các tính năng bắt buộc của mô hình trên thiết bị 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à hạn chế

GenAI Rewriting API 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. Đầu vào phải ít hơn 256 mã thông báo.

Khả năng sử dụng cấu hình tính năng cụ thể (do RewriterOptions chỉ định) có thể thay đổi tuỳ theo 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 một 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 về chế độ 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 thiết bị vừa được thiết lập (bao gồm cả thiết lập lại) hoặc ứng dụng AICore vừa được thiết lập 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 động (bao gồm cả việc tải các cấu hình mới nhất xuống từ máy chủ). Do đó, các API AI tạo sinh của Bộ công cụ học máy có thể không hoạt động như mong đợi. Sau đây là các thông báo lỗi thiết lập thường gặp mà bạn có thể gặp phải 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 hoạt động được do lỗi loại 4-CONNECTION_ERROR và mã lỗi 601-BINDING_FAILURE: Không liên kết được 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. Việc cập nhật ứng dụng AICore rồi cài đặt lại ứng dụng của bạn sẽ khắc phục được vấn đề này.
AICore không hoạt động được do lỗi loại 3 – PREPARATION_ERROR và mã lỗi 606 – FEATURE_NOT_FOUND: Không có tính năng .... Đ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. Khi thiết bị kết nối với Internet, quá trình cập nhật thường mất từ vài phút đến vài giờ. Việc khởi động lại thiết bị có thể giúp quá trình cập nhật diễn ra nhanh hơn.

Xin lưu ý rằng nếu trình tải khởi động của thiết bị bị 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 gặp lỗi loại 1 – DOWNLOAD_ERROR và mã lỗi 0 – UNKNOWN: Tính năng ... gặp lỗi với trạng thái lỗi 0 và lỗi esz: UNAVAILABLE: Unable to resolve host ... Giữ kết nối mạng, chờ vài phút rồi thử lại.