GenAI Proofreading API

باستخدام واجهة برمجة التطبيقات GenAI Proofreading من ML Kit، يمكنك مساعدة المستخدمين في التحقّق من قواعدهم النحوية والإملائية في النصوص القصيرة.

الإمكانات الرئيسية

  • التدقيق في النص الذي تم إدخاله من خلال لوحة المفاتيح أو الصوت
  • ستعرض الطلبات اقتراحًا واحدًا على الأقل. إذا تم عرض اقتراحات متعددة، سيتم ترتيب النتائج حسب مستوى الثقة تنازليًا.

أمثلة النتائج

الإدخال

نوع الإدخال

الناتج

هذه رسالة قصيرة

لوحة المفاتيح

هذه رسالة قصيرة

المشروع على وشك الانتهاء ولكن يجب مراجعته

لوحة المفاتيح

المشروع على وشك الانتهاء ولكن يجب مراجعته

يُرجى مقابلتي عند الدب،

الصوت

يُرجى مقابلتي في البار.

البدء

للبدء باستخدام 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()

Java

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. يجب أن يكون عدد الرموز المميزة أقل من 256 رمزًا.

قد يختلف مدى توفّر إعدادات الميزة المحدّدة (المحدّدة بواسطة ProofreaderOptions) حسب إعدادات الجهاز المحدّد والطُرز التي تم تنزيلها على الجهاز.

الطريقة الأكثر موثوقية التي يمكن للمطوّرين اتّباعها لضمان توفّر ميزة واجهة برمجة التطبيقات المطلوبة على جهاز يتضمّن ProofreaderOptions المطلوب هي استدعاء الطريقة checkFeatureStatus(). توفّر هذه الطريقة الحالة النهائية لتوفّر الميزة على الجهاز في وقت التشغيل.

مشاكل الإعداد الشائعة

تعتمد واجهات برمجة التطبيقات المستنِدة إلى الذكاء الاصطناعي التوليدي في ML Kit على تطبيق Android AICore للوصول إلى Gemini Nano. عند إعداد جهاز للتو (بما في ذلك إعادة الضبط)، أو إعادة ضبط تطبيق AICore للتو (مثل محو البيانات، وإلغاء التثبيت ثم إعادة التثبيت)، قد لا يتوفّر لتطبيق AICore وقت كافٍ لإنهاء عملية التهيئة (بما في ذلك تنزيل أحدث الإعدادات من الخادم). نتيجةً لذلك، قد لا تعمل واجهات برمجة التطبيقات المستندة إلى الذكاء الاصطناعي التوليدي في ML Kit على النحو المتوقّع. في ما يلي رسائل الخطأ الشائعة التي قد تظهر لك أثناء عملية الإعداد وكيفية التعامل معها:

مثال على رسالة خطأ كيفية التعامل معها
تعذّر تنفيذ AICore بسبب نوع الخطأ 4-CONNECTION_ERROR ورمز الخطأ 601-BINDING_FAILURE: تعذّر ربط خدمة AICore. قد يحدث ذلك عند تثبيت التطبيق باستخدام واجهات برمجة تطبيقات GenAI في ML Kit بعد إعداد الجهاز مباشرةً أو عند إلغاء تثبيت AICore بعد تثبيت تطبيقك. يجب أن يؤدي تحديث تطبيق AICore ثم إعادة تثبيت تطبيقك إلى حلّ المشكلة.
تعذّر تنفيذ AICore بسبب الخطأ من النوع 3-PREPARATION_ERROR ورمز الخطأ 606-FEATURE_NOT_FOUND: الميزة ... غير متاحة. قد يحدث ذلك عندما لا ينتهي تطبيق AICore من تنزيل أحدث الإعدادات. عندما يكون الجهاز متصلاً بالإنترنت، يستغرق التحديث عادةً بضع دقائق إلى بضع ساعات. يمكن أن تؤدي إعادة تشغيل الجهاز إلى تسريع عملية التحديث.

يُرجى العِلم أنّه في حال تم إلغاء قفل أداة تحميل التشغيل على الجهاز، سيظهر لك هذا الخطأ أيضًا، لأنّ واجهة برمجة التطبيقات هذه لا تتوافق مع الأجهزة التي تم إلغاء قفل أداة تحميل التشغيل عليها.
تعذّر تنفيذ AICore بسبب نوع الخطأ 1-DOWNLOAD_ERROR ورمز الخطأ 0-UNKNOWN: تعذّر تنفيذ الميزة ... مع حالة التعذّر 0 والخطأ esz: UNAVAILABLE: يتعذّر تحليل المضيف ... يُرجى الحفاظ على الاتصال بالشبكة والانتظار بضع دقائق ثم إعادة المحاولة.