واجهة برمجة التطبيقات GenAI Summarization API

باستخدام واجهة برمجة التطبيقات GenAI Summarization من حزمة تعلّم الآلة، يمكنك إنشاء ملخّصات تلقائية للمقالات والمحادثات على شكل قائمة من النقاط. ويساعد ذلك المستخدمين في فهم النصوص الكبيرة.

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

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

تتضمّن واجهة برمجة التطبيقات GenAI Summarization الإمكانات التالية:

  • تلخيص النص، المصنّف على أنّه مقالة أو محادثة
  • عرض الملخّص في نقطة واحدة أو نقطتين أو ثلاث نقاط

البدء

أضِف واجهة برمجة التطبيقات ML Kit Summarization كإحدى التبعيات في إعداد build.gradle.

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

بعد ذلك، نفِّذ الرمز في مشروعك:

  1. أنشِئ عنصر Summarizer.
  2. نزِّل الميزة إذا كان يمكن تنزيلها.
  3. أنشِئ طلب تلخيص.
  4. نفِّذ الاستدلال واسترجِع النتيجة.

Kotlin

val articleToSummarize = "Announcing a set of on-device GenAI APIs..."

// Define task with required input type, output type, and language
val summarizerOptions = SummarizerOptions.builder(context)
    .setInputType(InputType.ARTICLE)
    .setOutputType(OutputType.ONE_BULLET)
    .setLanguage(Language.ENGLISH)
    .build()
val summarizer = Summarization.getClient(summarizerOptions)

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

            override fun onDownloadFailed(e: GenAiException) { }

            override fun onDownloadProgress(totalBytesDownloaded: Long) {}

            override fun onDownloadCompleted() {
                startSummarizationRequest(articleToSummarize, summarizer)
            }
        })
    } 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.
        startSummarizationRequest(articleToSummarize, summarizer)
    } else if (featureStatus == FeatureStatus.AVAILABLE) {
        startSummarizationRequest(articleToSummarize, summarizer)
    }
}

fun startSummarizationRequest(text: String, summarizer: Summarizer) {
    // Create task request
    val summarizationRequest = SummarizationRequest.builder(text).build()

    // Start summarization request with streaming response
    summarizer.runInference(summarizationRequest) { newText ->
        // Show new text in UI
    }

    // You can also get a non-streaming response from the request
    // val summarizationResult = summarizer.runInference(
    //     summarizationRequest).get().summary
}

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

جافا

String articleToSummarize = "Announcing: a set of on-device GenAI AI APIs.";

// Define task with required input type, output type, and language
SummarizerOptions summarizerOptions = 
    SummarizerOptions.builder(context)
        .setInputType(SummarizerOptions.InputType.ARTICLE)
        .setOutputType(SummarizerOptions.OutputType.ONE_BULLET)
        .setLanguage(SummarizerOptions.Language.ENGLISH)
        .build();
Summarizer summarizer = Summarization.getClient(summarizerOptions);

void prepareAndStartSummarization()
        throws ExecutionException, InterruptedException {
    // Check feature availability. Status will be one of the following:
    // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    try {
        int featureStatus = summarizer.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.
            summarizer.downloadFeature(new DownloadCallback() {
                @Override
                public void onDownloadCompleted() {
                    startSummarizationRequest(articleToSummarize, summarizer);
                }

                @Override
                public void onDownloadFailed(GenAiException e) { /* handle error */ }

                @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.
            startSummarizationRequest(articleToSummarize, summarizer);
        } else if (featureStatus == FeatureStatus.AVAILABLE) {
            startSummarizationRequest(articleToSummarize, summarizer);
        }
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

void startSummarizationRequest(String text, Summarizer summarizer) {
    // Create task request
    SummarizationRequest summarizationRequest =
        SummarizationRequest.builder(text).build();

    // Start summarization request with streaming response
    summarizer.runInference(summarizationRequest, newText -> {
        // Show new text in UI
    });

    // You can also get a non-streaming response from the request
    // ListenableFuture<SummarizationResult> summarizationResult
    //         = summarizer.runInference(summarizationRequest);
    // String summary = summarizationResult.get().getSummary();
}

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

كيفية تعامل النموذج مع أنواع الإدخال المختلفة

عند تحديد إدخال النص على أنّه InputType.CONVERSATION، يتوقّع النموذج إدخالاً بالتنسيق التالي:

<name>: <message>
<name2>: <message2>
<name>: <message3>
<name3>: <message4>

يسمح ذلك للنموذج بإنشاء ملخّص أكثر دقة من خلال توفير فهم أفضل للمحادثة والتفاعلات.

الميزات المتوافقة والقيود

يجب أن يكون الإدخال أقل من 4000 رمز (أو ما يقارب 3000 كلمة باللغة الإنجليزية). إذا كان الإدخال يتجاوز 4000 رمز، ننصحك بالاطّلاع على الخيارات التالية:

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

بالنسبة إلى InputType.ARTICLE، يجب أيضًا أن يكون الإدخال أكثر من 400 حرف، ويحقق النموذج أفضل أداء عندما تكون المقالة 300 كلمة على الأقل.

تتوافق واجهة برمجة التطبيقات GenAI Summarization مع اللغات الإنجليزية واليابانية والكورية، ويتم تحديدها في SummarizerOptions.Language.

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

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

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

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

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

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

نموذج الرموز البرمجية