GenAI Proofreading API של ML Kit מאפשר לכם לעזור למשתמשים לבדוק את הדקדוק והאיות שלהם בקטעי טקסט קצרים.
יכולות עיקריות
- הגהה של טקסט שהוזן באמצעות מקלדת או קול
- הבקשות יחזירו לפחות הצעה אחת. אם מוצגות כמה הצעות, התוצאות ימוינו לפי רמת הביטחון בסדר יורד.
תוצאות לדוגמה
קלט |
סוג הקלט |
פלט |
this is a short msg |
מקלדת |
זו הודעה קצרה |
הפרויקט כמעט הושלם, אבל צריך לבדוק אותו |
מקלדת |
הפרויקט כמעט הושלם, אבל צריך לבדוק אותו |
אשמח אם תפגוש אותי ליד הדוב, |
Voice |
ניפגש בבר. |
תחילת העבודה
כדי להתחיל להשתמש ב-GenAI Proofreading API, מוסיפים את התלות הזו לקובץ ה-build של הפרויקט.
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
) עשויה להשתנות בהתאם לתצורה של המכשיר הספציפי ולמודלים שהורדו למכשיר.
הדרך הכי אמינה למפתחים לוודא שתכונת ה-API הרצויה נתמכת במכשיר עם ProofreaderOptions
המבוקש היא לבצע קריאה ל-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: לא ניתן לפתור את המארח ... | משאירים את החיבור לרשת, מחכים כמה דקות ומנסים שוב. |