GenAI Summarization API

با «میانای برنامه‌سازی کاربردی خلاصه کردن با هوش مصنوعی زایا» در ML Kit، می‌توانید به‌طور خودکار خلاصه‌هایی از مقاله‌ها و مکالمه‌ها به‌صورت فهرستی از نکات کلیدی تولید کنید. این کار به کاربران کمک می‌کند متن‌های طولانی را درک کنند.

خلاصه‌سازی از هوش مصنوعی زایای درون‌دستگاهی بهره می‌برد زیرا به نگرانی‌های مربوط به حریم خصوصی داده‌ها و مقرون‌به‌صرفه بودن رسیدگی می‌کند. برنامه‌هایی که گپ‌های شخصی، ایمیل‌ها، یادداشت‌ها، و یادآوری‌ها را خلاصه می‌کنند اغلب اطلاعات حساس را مدیریت می‌کنند، که باعث می‌شود پردازش درون‌دستگاهی برای حریم خصوصی کاربر مهم باشد. علاوه‌براین، تکالیف خلاصه کردن، به‌ویژه آن‌هایی که بافت طولانی یا موارد زیادی دارند، می‌توانند به قدرت پردازش قابل‌توجهی نیاز داشته باشند. پردازش این محتوا در دستگاه باعث کاهش بار سرور و کاهش هزینه‌های ارائه می‌شود، درحالی‌که داده‌های کاربر را خصوصی نگه می‌دارد.

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

«میانای برنامه‌سازی کاربردی خلاصه کردن با هوش مصنوعی زایا» قابلیت‌های زیر را پوشش می‌دهد:

  • نوشتار را که به‌عنوان مقاله یا مکالمه دسته‌بندی شده است خلاصه می‌کند.
  • خلاصه برونداد در یک، دو، یا سه گلوله.

شروع کنید

میانای برنامه‌سازی کاربردی خلاصه ML Kit را به‌عنوان وابستگی در پیکربندی 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>

این کار به مدل امکان می‌دهد با درک بهتر از مکالمه و تعاملات، خلاصه دقیق‌تری تولید کند.

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

ورودی باید کمتر از ۴۰۰۰ واحد (یا تقریباً ۳۰۰۰ کلمه انگلیسی) باشد. اگر ورودی از ۴۰۰۰ کد تجاوز کند، این گزینه‌ها را درنظر بگیرید:

  • اولویت‌بندی کردن خلاصه کردن ۴۰۰۰ کد اول. آزمایش نشان می‌دهد که این کار معمولاً برای ورودی‌های طولانی‌تر نتایج خوبی به‌همراه دارد. با فراخوانی setLongInputAutoTruncationEnabled، فعال کردن برش خودکار را درنظر بگیرید تا ورودی اضافی به‌طور خودکار برش داده شود.
  • ورودی را به گروه‌های ۴۰۰۰ نشانه‌ای تقسیم کن و آن‌ها را به‌صورت جداگانه خلاصه کن.
  • راه‌حل ابری مناسب‌تری برای ورودی بزرگ‌تر درنظر بگیرید.

برای InputType.ARTICLE، ورودی باید بیش‌از ۴۰۰ نویسه باشد و مدل زمانی بهترین عملکرد را دارد که مقاله حداقل ۳۰۰ کلمه باشد.

«میانای برنامه‌سازی کاربردی خلاصه هوشواره زایا» از زبان‌های انگلیسی، ژاپنی، و کره‌ای پشتیبانی می‌کند و در SummarizerOptions.Language تعریف شده است.

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

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

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

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

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

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

کد نمونه