בעזרת 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()
. השיטה הזו מספקת את הסטטוס המוחלט של זמינות התכונה במכשיר בזמן הריצה.
בעיות נפוצות בהגדרה
ממשקי ה-API של ML Kit GenAI מסתמכים על אפליקציית Android AICore כדי לגשת ל-Gemini Nano. כשמכשיר מוגדר זה עתה (כולל איפוס), או שאפליקציית AICore אופסה זה עתה (למשל, נמחקו הנתונים, האפליקציה הוסרה והתקנתה מחדש), יכול להיות שלא יהיה לאפליקציית AICore מספיק זמן לסיים את האיפוס (כולל הורדת ההגדרות האחרונות מהשרת). כתוצאה מכך, יכול להיות ש-ML Kit GenAI APIs לא יפעלו כמצופה. ריכזנו כאן את הודעות השגיאה הנפוצות במהלך ההגדרה ואת הדרכים לטיפול בהן:
דוגמה להודעת שגיאה | איך מטפלים |
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: Feature ... failed with failure status 0 and error esz: UNAVAILABLE: Unable to resolve host ... | שומרים על החיבור לרשת, ממתינים כמה דקות ומנסים שוב. |