GenAI Rewriting API

בעזרת GenAI Rewriting API של ML Kit, אתם יכולים לעזור למשתמשים לשכתב באופן אוטומטי הודעות בצ'אט או קטעי תוכן קצרים בסגנון או בנימה שונים.

במקרים הבאים, יכול להיות שיהיה למשתמשים שימושי לקבל הצעות לכתיבה מחדש של תוכן:

  • שינוי המבנה של הודעה כך שתהיה מקצועית יותר כשמתקשרים עם בעלי עניין
  • קיצור הודעה כדי שהיא תתאים יותר לפרסום בפלטפורמות של מדיה חברתית
  • ניסוח מחדש של הודעה עבור אנשים ששפת האם שלהם היא לא אנגלית ומחפשים דרכים חלופיות להעביר את המסר

יכולות עיקריות

ה-API של ML Kit לשינוי תוכן באמצעות AI גנרטיבי יכול לשכתב קטעי תוכן קצרים באחד מהסגנונות הבאים:

  • להרחיב את המלל: להוסיף פרטים לטקסט.
  • Emojify: הוספת אמוג'י רלוונטי לטקסט הקלט, כדי להפוך אותו למבטא יותר ומהנה יותר.
  • לקצר: תמצות של טקסט הקלט לגרסה קצרה יותר, תוך שמירה על המסר המרכזי.
  • לנסח בסגנון ידידותי: שכתוב הטקסט כך שיהיה קליל ונעים יותר, בטון שיחה.
  • מקצועי: שכתוב של טקסט הקלט כך שיהיה רשמי יותר ויתאים יותר לעסקים, תוך שימוש בטון מכבד.
  • לנסח מחדש: שכתוב של טקסט הקלט באמצעות מילים ומבני משפטים שונים, תוך שמירה על המשמעות המקורית.

הבקשות יחזירו לפחות הצעה אחת. אם מוחזרות כמה הצעות, התוצאות ימוינו לפי רמת הביטחון, מהגבוהה לנמוכה.

תוצאות לדוגמה

קלט שכתוב בסגנון פלט
רוצה להיפגש כדי לדבר על זה? Professional רוצה להיפגש שוב כדי לדון בנושא?
אני רוצה להזמין אותך למפגש לא רשמי בבית שלי במוצאי שבת הקרובה קיצור רוצה להצטרף אליי למפגש לא רשמי אצלי בבית בערב שבת הקרוב?
האירוע הושלם בהצלחה הרחבה האירוע היה הצלחה גדולה, מעל ומעבר לכל הציפיות שלנו.
בוא נשתה קפה בקרוב הוספת אמוג'י בוא נשתה קפה ☕ בקרוב 👋.
העברת הדוח עד סוף היום ידידותי אפשר לקבל את הדוח עד סוף היום?
היי, אני צריך את זה בהקדם האפשרי Professional אפשר לשלוח את המסמך המבוקש בהקדם האפשרי?
הפרויקט לא עומד בלוח הזמנים ניסוח מחדש צריך לשנות את ציר הזמן של הפרויקט כדי לעמוד בתאריך היעד המקורי

תחילת העבודה

כדי להתחיל להשתמש ב-GenAI Rewriting API, מוסיפים את התלות הזו לקובץ ה-build של הפרויקט.

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

לאחר מכן, יוצרים מופע של לקוח Rewriter עם האפשרויות הנדרשות, בודקים אם התכונות הנדרשות של המודל במכשיר זמינות (ומורידים אותן אם צריך), מכינים את טקסט הקלט כבקשה, מריצים את תהליך השכתוב כדי לקבל הצעות, ומשחררים את המשאבים.

Kotlin

val textToRewrite = "The event was successful"

// Define task with selected input and output format
val rewriterOptions = RewriterOptions.builder(context)
    // OutputType can be one of the following: ELABORATE, EMOJIFY, SHORTEN,
    // FRIENDLY, PROFESSIONAL, REPHRASE
    .setOutputType(RewriterOptions.OutputType.ELABORATE)
    // Refer to RewriterOptions.Language for available languages
    .setLanguage(RewriterOptions.Language.ENGLISH)
    .build()
val rewriter = Rewriting.getClient(rewriterOptions)

suspend fun prepareAndStartRewrite() {
    // Check feature availability, status will be one of the following:
    // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    val featureStatus = rewriter.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.
        rewriter.downloadFeature(object : DownloadCallback {
            override fun onDownloadStarted(bytesToDownload: Long) { }

            override fun onDownloadFailed(e: GenAiException) { }

            override fun onDownloadProgress(totalBytesDownloaded: Long) {}

            override fun onDownloadCompleted() {
                startRewritingRequest(textToRewrite, rewriter)
            }
        })
    } 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.
        startRewritingRequest(textToRewrite, rewriter)
    } else if (featureStatus == FeatureStatus.AVAILABLE) {
        startRewritingRequest(textToRewrite, rewriter)
    }
}

suspend fun startRewritingRequest(text: String, rewriter: Rewriter) {
    // Create task request
    val rewritingRequest = RewritingRequest.builder(text).build()

    // Start rewriting 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 rewriteResults =
        rewriter.runInference(rewritingRequest).await().results

    // You can also start a streaming request
    // rewriter.runInference(rewritingRequest) { newText ->
    //    // Show new text in UI
    // }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
rewriter.close()

Java

String textToRewrite = "The event was successful";

// Define task with required input and output format
RewriterOptions rewriterOptions =
    RewriterOptions.builder(context)
        // OutputType can be one of the following: ELABORATE,
        // EMOJIFY, SHORTEN, FRIENDLY, PROFESSIONAL, REPHRASE
        .setOutputType(RewriterOptions.OutputType.ELABORATE)
        // Refer to RewriterOptions.Language for available
        // languages
        .setLanguage(RewriterOptions.Language.ENGLISH)
        .build();
Rewriter rewriter = Rewriting.getClient(rewriterOptions);

void prepareAndStartRewrite()
    throws ExecutionException, InterruptedException {
    // Check feature availability, status will be one of the
    // following: UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    try {
        int featureStatus = rewriter.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.
            rewriter.downloadFeature(
                new DownloadCallback() {
                    @Override
                    public void onDownloadCompleted() {
                        startRewritingRequest(textToRewrite, rewriter);
                    }

                    @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
            // quickly. However, if Gemini Nano is not already downloaded,
            // the download process may take longer.
            startRewritingRequest(textToRewrite, rewriter);
        } else if (featureStatus == FeatureStatus.AVAILABLE) {
            startRewritingRequest(textToRewrite, rewriter);
        }
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

void startRewritingRequest(String text, Rewriter rewriter) {
    // Create task request
    RewritingRequest rewritingRequest =
        RewritingRequest.builder(text).build();

    try {
        // Start rewriting request with non-streaming response
        // More than 1 result may be returned. If multiple
        // suggestions are returned, results will be sorted by
        // descending confidence.
        rewriter.runInference(rewritingRequest).get().getResults();

        // You can also start a streaming request
        // rewriter.runInference(rewritingRequest, 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()
rewriter.close();

תכונות נתמכות ומגבלות

ממשק ה-API של GenAI Rewriting תומך בשפות הבאות: אנגלית, יפנית, צרפתית, גרמנית, איטלקית, ספרדית וקוריאנית. השפות מוגדרות ב-RewriterOptions.Language. הקלט צריך להיות קטן מ-256 טוקנים.

הזמינות של הגדרת התכונה הספציפית (שמצוינת על ידי RewriterOptions) עשויה להשתנות בהתאם לתצורה של המכשיר הספציפי ולמודלים שהורדו למכשיר.

הדרך הכי מהימנה למפתחים לוודא שתכונת ה-API הרצויה נתמכת במכשיר עם RewriterOptions המבוקש היא לבצע קריאה ל-method‏ checkFeatureStatus(). השיטה הזו מספקת את הסטטוס הסופי של זמינות התכונה במכשיר בזמן הריצה.

בעיות נפוצות בהגדרה

ממשקי ה-API של GenAI ב-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: לא ניתן לפתור את הבעיה במארח ... משאירים את החיבור לרשת, מחכים כמה דקות ומנסים שוב.

קוד לדוגמה