GenAI Rewriting API ของ ML Kit ช่วยให้คุณช่วยผู้ใช้เขียนข้อความแชทหรือเนื้อหาสั้นๆ ใหม่โดยอัตโนมัติด้วยสไตล์หรือโทนที่แตกต่างกัน
ผู้ใช้อาจพบว่าข้อเสนอแนะเกี่ยวกับวิธีเขียนเนื้อหาใหม่มีประโยชน์ในกรณีต่อไปนี้
- ปรับโครงสร้างข้อความให้เป็นทางการมากขึ้นเมื่อสื่อสารกับผู้มีส่วนได้ส่วนเสีย
- ย่อข้อความให้เหมาะกับการโพสต์บนแพลตฟอร์มโซเชียลมีเดียมากขึ้น
- ปรับเปลี่ยนข้อความสำหรับผู้ที่ไม่ได้ใช้ภาษาแม่เพื่อหาทางเลือกอื่นในการสื่อสารข้อความ
ความสามารถหลัก
GenAI Rewriting API ของ ML Kit สามารถเขียนเนื้อหาสั้นๆ ใหม่ในสไตล์ใดสไตล์หนึ่งต่อไปนี้
- ลงรายละเอียด: ขยายข้อความอินพุตด้วยรายละเอียดและภาษาที่บรรยายมากขึ้น
- Emojify: เพิ่มอีโมจิที่เกี่ยวข้องลงในข้อความอินพุตเพื่อให้ข้อความแสดงอารมณ์ได้มากขึ้นและสนุกยิ่งขึ้น
- ย่อ: ย่อข้อความอินพุตให้สั้นลงโดยคง ข้อความหลักไว้
- เป็นกันเอง: เขียนข้อความอินพุตใหม่ให้เป็นกันเองและเข้าถึงได้ง่ายขึ้น โดยใช้โทนการสนทนา
- ปรับให้เป็นทางการ: เขียนข้อความอินพุตใหม่ให้เป็นทางการและ เป็นธุรกิจมากขึ้นโดยใช้โทนที่สุภาพ
- ปรับเปลี่ยน: เขียนข้อความอินพุตใหม่โดยใช้คำและโครงสร้างประโยคที่แตกต่างกัน แต่ยังคงความหมายเดิมไว้
คำขอจะแสดงผลข้อเสนอแนะอย่างน้อย 1 รายการ หากระบบแสดงผลข้อเสนอแนะหลายรายการ ระบบจะจัดเรียงผลลัพธ์ตามความเชื่อมั่นจากมากไปน้อย
ตัวอย่างผลการแข่ง
| อินพุต | สไตล์การเขียนใหม่ | เอาต์พุต |
| คุณอยากจะมาเจอกันเพื่อคุยกันต่อไหม | ปรับให้เป็นทางการ | คุณสนใจที่จะมาเจอกันอีกครั้งเพื่อพูดคุยเรื่องนี้เพิ่มเติมไหม |
| ฉันอยากจะขอเชิญคุณมาร่วมงานสังสรรค์แบบสบายๆ ที่บ้านของฉันในเย็นวันเสาร์ที่จะถึงนี้ | ย่อ | คุณอยากจะมาร่วมงานสังสรรค์แบบสบายๆ ที่บ้านของฉัน ในเย็นวันเสาร์นี้ไหม |
| งานนี้ประสบความสำเร็จ | ลงรายละเอียด | งานนี้ประสบความสำเร็จอย่างมาก เกินความคาดหมายของเราทั้งหมด และพิสูจน์ให้เห็นถึงชัยชนะอย่างล้นหลาม |
| ไว้ไปดื่มกาแฟกันเร็วๆ นี้นะ | Emojify | ไว้ไปดื่มกาแฟ ☕ กันเร็วๆ นี้นะ 👋 |
| ส่งรายงานภายในสิ้นวัน | ปรับให้เป็นกันเอง | คุณช่วยแชร์รายงานภายในสิ้นวันได้ไหม |
| เฮ้ ต้องการสิ่งนั้นด่วนเลย | ปรับให้เป็นทางการ | คุณช่วยส่งเอกสารที่ขอโดยเร็วที่สุดเมื่อคุณสะดวกได้ไหม |
| โปรเจ็กต์ล่าช้ากว่ากำหนด | ปรับเปลี่ยน | ต้องปรับไทม์ไลน์ของโปรเจ็กต์เพื่อให้เป็นไปตามกำหนดเวลาเดิม |
เริ่มต้นใช้งาน
หากต้องการเริ่มต้นใช้งาน GenAI Rewriting API ให้เพิ่มทรัพยากร Dependency นี้ลงในไฟล์บิลด์ของโปรเจ็กต์
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();
ฟีเจอร์และข้อจำกัดที่รองรับ
GenAI Rewriting API รองรับภาษาอังกฤษ ญี่ปุ่น,
ฝรั่งเศส เยอรมัน อิตาลี สเปน และเกาหลี ซึ่งกำหนดไว้ใน
RewriterOptions.Language อินพุตควรมีความยาวไม่เกิน 256 โทเค็น
ความพร้อมใช้งานของการกำหนดค่าฟีเจอร์ที่เฉพาะเจาะจง (ระบุโดย RewriterOptions) อาจแตกต่างกันไปตามการกำหนดค่าของอุปกรณ์แต่ละเครื่องและโมเดลที่ดาวน์โหลดลงในอุปกรณ์
วิธีที่น่าเชื่อถือที่สุดสำหรับนักพัฒนาแอปในการตรวจสอบว่าอุปกรณ์รองรับฟีเจอร์ API ที่ต้องการด้วย RewriterOptions ที่ขอคือการเรียกใช้เมธอด
checkFeatureStatus() เมธอดนี้จะแสดงสถานะความพร้อมใช้งานของฟีเจอร์ในอุปกรณ์อย่างชัดเจนในขณะรันไทม์
ปัญหาการตั้งค่าที่พบบ่อย
ML Kit GenAI API อาศัยแอป Android AICore ในการเข้าถึง Gemini Nano เมื่อเพิ่งตั้งค่าอุปกรณ์ (รวมถึงการรีเซ็ต) หรือเพิ่งรีเซ็ตแอป AICore (เช่น ล้างข้อมูล ถอนการติดตั้งแล้วติดตั้งใหม่) แอป AICore อาจมีเวลาไม่พอที่จะทำการเริ่มต้นให้เสร็จสมบูรณ์ (รวมถึงการดาวน์โหลดการกำหนดค่าล่าสุดจากเซิร์ฟเวอร์) ด้วยเหตุนี้ ML Kit GenAI API จึงอาจทำงานไม่เป็นไปตามที่คาดไว้ ต่อไปนี้คือข้อความแสดงข้อผิดพลาดในการตั้งค่าที่พบบ่อยซึ่งคุณอาจเห็นและวิธีจัดการข้อผิดพลาดเหล่านั้น
| ตัวอย่างข้อความแสดงข้อผิดพลาด | วิธีจัดการ |
| AICore ล้มเหลวโดยมีข้อผิดพลาดประเภท 4-CONNECTION_ERROR และรหัสข้อผิดพลาด 601-BINDING_FAILURE: บริการ AICore ผูกไม่สำเร็จ | ข้อผิดพลาดนี้อาจเกิดขึ้นเมื่อคุณติดตั้งแอปโดยใช้ ML Kit GenAI API ทันทีหลังจากตั้งค่าอุปกรณ์ หรือเมื่อถอนการติดตั้ง AICore หลังจากติดตั้งแอป การอัปเดตแอป AICore แล้วติดตั้งแอปอีกครั้งควรจะแก้ไขปัญหานี้ได้ |
| AICore ล้มเหลวโดยมีข้อผิดพลาดประเภท 3-PREPARATION_ERROR และรหัสข้อผิดพลาด 606-FEATURE_NOT_FOUND: ฟีเจอร์ ... ไม่พร้อมใช้งาน |
ข้อผิดพลาดนี้อาจเกิดขึ้นเมื่อ AICore ดาวน์โหลดการกำหนดค่าล่าสุดไม่เสร็จ เมื่ออุปกรณ์เชื่อมต่อกับอินเทอร์เน็ต โดยปกติแล้วการอัปเดตจะใช้เวลา 2-3 นาทีถึง 2-3 ชั่วโมง การรีสตาร์ทอุปกรณ์สามารถเร่งการอัปเดตได้
โปรดทราบว่าหาก Bootloader ของอุปกรณ์ปลดล็อกอยู่ คุณจะเห็นข้อผิดพลาดนี้ด้วย เนื่องจาก API นี้ไม่รองรับอุปกรณ์ที่มี Bootloader ที่ปลดล็อก |
| AICore ล้มเหลวโดยมีข้อผิดพลาดประเภท 1-DOWNLOAD_ERROR และรหัสข้อผิดพลาด 0-UNKNOWN: ฟีเจอร์ ... ล้มเหลวโดยมีสถานะความล้มเหลว 0 และข้อผิดพลาด esz: UNAVAILABLE: Unable to resolve host ... | เชื่อมต่อเครือข่ายไว้ รอ 2-3 นาที แล้วลองอีกครั้ง |