באמצעות ה-API של GenAI Summarization ב-ML Kit, אפשר ליצור באופן אוטומטי סיכומים של מאמרים ושיחות כרשימה של נקודות. כך המשתמשים יכולים להבין טקסטים ארוכים.
השימוש ב-AI גנרטיבי במכשיר לסיכום מידע מועיל כי הוא נותן מענה לדאגות לגבי פרטיות הנתונים ויעילות העלויות. אפליקציות שמסכמות שיחות אישיות, אימיילים, הערות ותזכורות לרוב מטפלות במידע רגיש, ולכן חשוב שהעיבוד יתבצע במכשיר כדי לשמור על פרטיות המשתמשים. בנוסף, משימות סיכום, במיוחד כאלה עם הקשרים ארוכים או עם הרבה פריטים, עשויות לדרוש כוח עיבוד משמעותי. עיבוד התוכן במכשיר מפחית את עומס השרתים ומקטין את עלויות ההצגה, תוך שמירה על פרטיות נתוני המשתמשים.
יכולות עיקריות
היכולות של GenAI Summarization API הן:
- לסכם טקסט, שמסווג כמאמר או כשיחה.
- סיכום הפלט בנקודה אחת, שתיים או שלוש.
שנתחיל?
מוסיפים את ML Kit Summarization API כתלות בהגדרות שלכם ב-build.gradle
configuration.
implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")
לאחר מכן, מטמיעים את הקוד בפרויקט:
- יוצרים אובייקט
Summarizer
. - מורידים את התכונה אם אפשר להוריד אותה.
- יוצרים בקשת סיכום.
- מריצים את ההסקה ומאחזרים את התוצאה.
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()
Java
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>
כך המודל יכול לספק סיכום מדויק יותר כי הוא מבין טוב יותר את השיחה והאינטראקציות.
תכונות נתמכות ומגבלות
הקלט צריך להיות באורך של פחות מ-4,000 טוקנים (או בערך 3,000 מילים באנגלית). אם הקלט חורג מ-4,000 טוקנים, כדאי לשקול את האפשרויות הבאות:
- התקציר צריך להתמקד ב-4,000 הטוקנים הראשונים. הבדיקות מראות שבדרך כלל מתקבלות תוצאות טובות יותר כשמזינים קלט ארוך יותר. כדאי להפעיל חיתוך אוטומטי באמצעות הקריאה
setLongInputAutoTruncationEnabled
כדי שהקלט הנוסף ייחתך אוטומטית. - תפלח את הקלט לקבוצות של 4, 000 טוקנים ותסכם כל אחת מהן בנפרד.
- כדאי לשקול פתרון ענן שמתאים יותר לקלט הגדול יותר.
במקרה של InputType.ARTICLE
, הקלט צריך להיות באורך של יותר מ-400 תווים, והמודל פועל בצורה הכי טובה כשהמאמר הוא באורך של 300 מילים לפחות.
ה-API של סיכום באמצעות AI גנרטיבי תומך באנגלית, ביפנית ובקוריאנית, ומוגדר ב-SummarizerOptions.Language
.
הזמינות של הגדרת התכונה הספציפית (שמצוינת על ידי SummarizerOptions
) עשויה להשתנות בהתאם לתצורה של המכשיר הספציפי ולמודלים שהורדו למכשיר.
הדרך הכי אמינה למפתחים לוודא שתכונת ה-API הרצויה נתמכת במכשיר עם SummarizerOptions
המבוקש היא לבצע קריאה ל-method checkFeatureStatus()
. השיטה הזו מספקת את הסטטוס הסופי של זמינות התכונה במכשיר בזמן הריצה.
בעיות נפוצות בהגדרה
ממשקי GenAI API של ML Kit מסתמכים על אפליקציית Android AICore כדי לגשת ל-Gemini Nano. כשמגדירים מכשיר חדש (כולל איפוס), או כשמאפסים את אפליקציית AICore (למשל, מוחקים את הנתונים, מסירים את ההתקנה ואז מתקינים מחדש), יכול להיות שלאפליקציית AICore לא יהיה מספיק זמן לסיים את האתחול (כולל הורדת ההגדרות האחרונות מהשרת). כתוצאה מכך, יכול להיות שממשקי ה-API של ML Kit GenAI לא יפעלו כמצופה. ריכזנו כאן את הודעות השגיאה הנפוצות שמוצגות במהלך ההגדרה, והסבר איך לטפל בהן:
דוגמה להודעת שגיאה | איך לטפל בבעיה |
הפעולה של AICore נכשלה עם סוג השגיאה 4-CONNECTION_ERROR וקוד השגיאה 601-BINDING_FAILURE: שירות AICore נכשל בקישור. | זה יכול לקרות כשמתקינים את האפליקציה באמצעות ממשקי ה-API של ML Kit GenAI מיד אחרי הגדרת המכשיר, או כשמסירים את ההתקנה של AICore אחרי התקנת האפליקציה. עדכון של אפליקציית AICore ואז התקנה מחדש של האפליקציה אמורים לפתור את הבעיה. |
הפעולה של AICore נכשלה עם סוג השגיאה 3-PREPARATION_ERROR וקוד השגיאה 606-FEATURE_NOT_FOUND: התכונה ... לא זמינה. |
מצב כזה יכול לקרות כש-AICore לא סיים להוריד את ההגדרות האחרונות. כשהמכשיר מחובר לאינטרנט, העדכון מתבצע בדרך כלל תוך כמה דקות עד כמה שעות. הפעלה מחדש של המכשיר יכולה לזרז את העדכון.
שימו לב שאם טוען האתחול של המכשיר לא נעול, תוצג גם השגיאה הזו – ה-API הזה לא תומך במכשירים עם טועני אתחול לא נעולים. |
הייתה שגיאה ב-AICore מסוג 1-DOWNLOAD_ERROR וקוד שגיאה 0-UNKNOWN: התכונה ... נכשלה עם סטטוס כשל 0 ושגיאה esz: UNAVAILABLE: לא ניתן לפתור את המארח ... | משאירים את החיבור לרשת, מחכים כמה דקות ומנסים שוב. |