GenAI Sumarization API

با استفاده از رابط برنامه‌نویسی کاربردی خلاصه‌سازی GenAI کیت ML، می‌توانید به‌طور خودکار خلاصه‌هایی از مقالات و مکالمات را به‌صورت فهرستی از نکات مهم ایجاد کنید. این به کاربران کمک می‌کند تا حجم زیادی از متن را درک کنند.

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

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

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

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

شروع کنید

API خلاصه‌سازی ML Kit را به عنوان یک وابستگی در پیکربندی build.gradle خود اضافه کنید.

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

سپس، کد را در پروژه خود پیاده‌سازی کنید:

  1. یک شیء Summarizer ایجاد کنید.
  2. اگر قابلیت دانلود وجود دارد، آن ویژگی را دانلود کنید.
  3. یک درخواست خلاصه ایجاد کنید.
  4. استنتاج را اجرا کنید و نتیجه را بازیابی کنید.

کاتلین

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 ، ورودی نیز باید بیش از ۴۰۰ کاراکتر باشد، و مدل زمانی بهترین عملکرد را دارد که مقاله حداقل ۳۰۰ کلمه داشته باشد.

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

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

مطمئن‌ترین راه برای توسعه‌دهندگان جهت اطمینان از پشتیبانی ویژگی API مورد نظر در دستگاهی با SummarizerOptions درخواستی، فراخوانی متد 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: قادر به حل مشکل میزبان نیست ... اتصال شبکه را حفظ کنید، چند دقیقه صبر کنید و دوباره امتحان کنید.

کد نمونه