GenAI Proofreading API

بااستفاده از GenAI Proofreading API در ML Kit می‌توانید به کاربران کمک کنید دستور زبان و املای نوشتارهای کوتاهشان را بررسی کنند.

قابلیت‌های کلیدی

  • نوشتار واردشده ازطریق صفحه‌کلید یا صدا را نمونه‌خوانی کنید
  • درخواست‌ها حداقل یک پیشنهاد برمی‌گردانند. اگر چندین پیشنهاد برگردانده شود، نتایج براساس اطمینان نزولی مرتب خواهند شد.

نتایج نمونه

ورودی

نوع ورودی

برونداد

این پیام کوتاهی است

صفحه‌کلید

این پیام کوتاه است

پروژه تقریباً کامل است اما باید بازبینی شود

صفحه‌کلید

پروژه تقریباً کامل است اما باید بازبینی شود

Please meat me at the bear,

صدا

لطفاً در بار با من ملاقات کنید.

شروع به کار

برای شروع کار با GenAI Proofreading API، این وابستگی را به فایل ساخت پروژه خود اضافه کنید.

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

سپس، کارخواه Proofreader را با تنظیمات خاص زبان و نوع ورودی پیکربندی و دریافت کنید. بررسی و اطمینان از اینکه ویژگی‌های مدل درون‌دستگاهی لازم دردسترس هستند (درصورت نیاز، بارگیری را راه‌اندازی می‌کند). نوشتاری را که می‌خواهید تجزیه‌وتحلیل کنید در ProofreadingRequest ارسال کنید، استنباط نمونه‌خوانی را اجرا کنید، و درنهایت پیشنهادهای برگشتی را برای تصحیح نوشتار پردازش کنید.

Kotlin

val textToProofread = "The praject is compleet but needs too be reviewd"

// Define task with required input and output format
val options = ProofreaderOptions.builder(context)
    // InputType can be KEYBOARD or VOICE. VOICE indicates that
    // the user generated text based on audio input.
    .setInputType(ProofreaderOptions.InputType.KEYBOARD)
    // Refer to ProofreaderOptions.Language for available
    // languages
    .setLanguage(ProofreaderOptions.Language.ENGLISH)
    .build()
val proofreader = Proofreading.getClient(options)

suspend fun prepareAndStartProofread() {
    // Check feature availability, status will be one of the
    // following: UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    val featureStatus = proofreader.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.
        proofreader.downloadFeature(object : DownloadCallback {
            override fun onDownloadStarted(bytesToDownload: Long) { }

            override fun onDownloadFailed(e: GenAiException) { }

            override fun onDownloadProgress(
                totalBytesDownloaded: Long
            ) {}

            override fun onDownloadCompleted() {
                startProofreadingRequest(textToProofread, proofreader)
            }
        })
    } 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
        // very quickly. However, if Gemini Nano is not already
        // downloaded, the download process may take longer.
        startProofreadingRequest(textToProofread, proofreader)
    } else if (featureStatus == FeatureStatus.AVAILABLE) {
        startProofreadingRequest(textToProofread, proofreader)
    }
}

suspend fun startProofreadingRequest(
    text: String, proofreader: Proofreader
) {
    // Create task request
    val proofreadingRequest =
        ProofreadingRequest.builder(text).build()

    // Start proofreading 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 proofreadingResults =
        proofreader.runInference(proofreadingRequest).await().results

    // You can also start a streaming request
    // proofreader.runInference(proofreadingRequest) { newText ->
    //     // show new text in UI
    // }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
proofreader.close()

جاوا

String textToProofread = "The praject is compleet but needs too be reviewd";

// Define task with required input and output format
ProofreaderOptions proofreaderOptions = 
    ProofreaderOptions
        .builder(context)
        // InputType can be KEYBOARD or VOICE. VOICE indicates that the
        // user generated text based on audio input.
        .setInputType(ProofreaderOptions.InputType.KEYBOARD)
        // Refer to ProofreaderOptions.Language for available languages
        .setLanguage(ProofreaderOptions.Language.ENGLISH)
        .build();
Proofreader proofreader = Proofreading.getClient(proofreaderOptions);

void prepareAndStartProofread(Context context) throws ExecutionException,
        InterruptedException {
    // Check feature availability, status will be one of the following:
    // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    try {
        int featureStatus = proofreader.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.
            proofreader.downloadFeature(new DownloadCallback() {
                @Override
                public void onDownloadCompleted() {
                    startProofreadingRequest(textToProofread, proofreader);
                }

                @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
            // very quickly. However, if Gemini Nano is not already
            // downloaded, the download process may take longer.
            startProofreadingRequest(textToProofread, proofreader);
        } else if (featureStatus == FeatureStatus.AVAILABLE) {
            startProofreadingRequest(textToProofread, proofreader);
        }
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

void startProofreadingRequest(String text, Proofreader proofreader) {
    // Create task request
    ProofreadingRequest proofreadingRequest = ProofreadingRequest
            .builder(text).build();

    try {
        // Start proofreading request with non-streaming response
        // More than 1 result may be returned. If multiple suggestions are
        // returned, results will be sorted by descending confidence.
        proofreader.runInference(proofreadingRequest).get().getResults();

        // You can also start a streaming request
        // proofreader.runInference(proofreadingRequest, 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()
proofreader.close();

نحوه مدیریت انواع مختلف ورودی توسط مدل

وقتی مدل اطلاعات بیشتری درباره نحوه وارد کردن نوشتار توسط کاربر داشته باشد (صفحه‌کلید یا صدا)، می‌تواند نوع خطاهایی را که ممکن است وجود داشته باشد بهتر پیش‌بینی کند. نوشتار واردشده با صفحه‌کلید بیشتر مستعد غلط املایی با کلیدهای نزدیک است، درحالی‌که نوشتار واردشده با صدا بیشتر مستعد غلط املایی کلماتی با تلفظ یکسان است.

ویژگی‌های پشتیبانی‌شده و محدودیت‌ها

ویژگی نمونه‌خوانی برای زبان‌های زیر پشتیبانی می‌شود: انگلیسی، ژاپنی، فرانسوی، آلمانی، ایتالیایی، اسپانیایی، و کره‌ای، و این زبان‌ها در ProofreaderOptions.Language تعریف شده‌اند. ورودی باید کمتر از ۲۵۶ واحد باشد.

دردسترس بودن پیکربندی ویژگی خاص (مشخص‌شده با ProofreaderOptions) ممکن است بسته به پیکربندی دستگاه خاص و مدل‌هایی که در دستگاه بارگیری شده است متفاوت باشد.

مطمئن‌ترین راه برای توسعه‌دهندگان جهت اطمینان از اینکه ویژگی API موردنظر در دستگاهی با ProofreaderOptions درخواستی پشتیبانی می‌شود، فراخوانی روش checkFeatureStatus() است. این روش وضعیت قطعی دردسترس بودن ویژگی در دستگاه را در زمان اجرا ارائه می‌دهد.

مشکلات رایج راه‌اندازی

«میاناهای برنامه‌سازی کاربردی GenAI در ML Kit» برای دسترسی به Gemini Nano به برنامه Android AICore متکی است. وقتی دستگاهی تازه راه‌اندازی شده باشد (ازجمله بازنشانی)، یا برنامه AICore تازه بازنشانی شده باشد (برای نمونه، پاک کردن داده‌ها، حذف نصب و سپس نصب مجدد)، ممکن است برنامه AICore زمان کافی برای تکمیل مقداردهی اولیه (ازجمله بارگیری جدیدترین پیکربندی‌ها از سرور) نداشته باشد. درنتیجه، ممکن است «میاناهای برنامه‌سازی کاربردی هوش مصنوعی زایا در ML Kit» عملکرد موردانتظار را نداشته باشند. در اینجا پیام‌های خطای رایج راه‌اندازی که ممکن است ببینید و نحوه رسیدگی به آن‌ها آورده شده است:

مثال پیام خطا نحوه رسیدگی
‫AICore با خطای نوع ۴-CONNECTION_ERROR و کد خطای ۶۰۱-BINDING_FAILURE ناموفق بود: سرویس AICore پیوند نشد. این اتفاق ممکن است زمانی رخ دهد که برنامه را بااستفاده از ML Kit GenAI APIs بلافاصله پس‌از راه‌اندازی دستگاه نصب کنید یا زمانی که AICore پس‌از نصب برنامه شما حذف نصب شود. به‌روزرسانی برنامه AICore و سپس بازنصب کردن برنامه‌تان باید مشکل را برطرف کند.
‫AICore با نوع خطای 3-PREPARATION_ERROR و کد خطای 606-FEATURE_NOT_FOUND ناموفق بود: ویژگی ... دردسترس نیست. این اتفاق ممکن است زمانی رخ دهد که AICore بارگیری جدیدترین پیکربندی‌ها را به‌پایان نرسانده باشد. وقتی دستگاه به اینترنت متصل باشد، معمولاً چند دقیقه تا چند ساعت طول می‌کشد تا به‌روز شود. بازراه‌اندازی دستگاه می‌تواند سرعت به‌روزرسانی را افزایش دهد.

توجه داشته باشید که اگر قفل bootloader دستگاه باز باشد، این خطا را نیز خواهید دید—این API از دستگاه‌های دارای bootloader باز پشتیبانی نمی‌کند.
‫AICore با خطای نوع ۱-DOWNLOAD_ERROR و کد خطای ۰-UNKNOWN ناموفق بود: ویژگی ... با وضعیت ناموفق ۰ و خطای esz: UNAVAILABLE ناموفق بود: میزبان ... شناسایی نشد اتصال شبکه را حفظ کنید، چند دقیقه صبر کنید، و دوباره امتحان کنید.

کد نمونه