GenAI Proofreading API

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

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

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

نتایج مثال

ورودی

نوع ورودی

خروجی

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

کیبورد

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

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

کیبورد

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

لطفا منو به خرس نشون بده،

صدا

لطفا در بار به استقبالم بیا.

شروع به کار

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

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

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

کاتلین

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() است. این متد وضعیت قطعی در دسترس بودن ویژگی را در زمان اجرا در دستگاه ارائه می‌دهد.

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

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

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

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

کد نمونه