Với API Tóm tắt bằng AI tạo sinh của Bộ công cụ học máy, bạn có thể tự động tạo bản tóm tắt các bài viết và cuộc trò chuyện dưới dạng danh sách các dấu đầu dòng. Điều này giúp người dùng hiểu được những đoạn văn bản dài.
Tính năng tóm tắt được hưởng lợi từ AI tạo sinh trên thiết bị vì tính năng này giải quyết các mối lo ngại về quyền riêng tư đối với dữ liệu và hiệu quả chi phí. Các ứng dụng tóm tắt tin nhắn trò chuyện, email, ghi chú và lời nhắc cá nhân thường xử lý thông tin nhạy cảm, khiến việc xử lý trên thiết bị trở nên quan trọng đối với quyền riêng tư của người dùng. Ngoài ra, các tác vụ tóm tắt, đặc biệt là những tác vụ có ngữ cảnh dài hoặc nhiều mục, có thể đòi hỏi sức mạnh xử lý đáng kể. Việc xử lý nội dung này trên thiết bị giúp giảm tải cho máy chủ và giảm chi phí phân phát, đồng thời vẫn đảm bảo sự riêng tư cho dữ liệu người dùng.
Các chức năng chính
GenAI Summarization API có các chức năng sau:
- Tóm tắt văn bản, được phân loại là bài viết hoặc cuộc trò chuyện.
- Tóm tắt kết quả trong một, hai hoặc ba dấu đầu dòng.
Bắt đầu
Thêm API tóm tắt của ML Kit làm phần phụ thuộc trong cấu hình build.gradle
.
implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")
Tiếp theo, hãy triển khai mã trong dự án của bạn:
- Tạo một đối tượng
Summarizer
. - Tải tính năng xuống nếu có thể tải xuống.
- Tạo yêu cầu tóm tắt.
- Chạy quy trình suy luận và truy xuất kết quả.
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();
Cách mô hình xử lý nhiều loại dữ liệu đầu vào
Khi đầu vào văn bản được chỉ định là InputType.CONVERSATION
, mô hình sẽ mong đợi đầu vào ở định dạng sau:
<name>: <message>
<name2>: <message2>
<name>: <message3>
<name3>: <message4>
Điều này giúp mô hình tạo ra bản tóm tắt chính xác hơn bằng cách cung cấp thông tin chi tiết hơn về cuộc trò chuyện và các lượt tương tác.
Các tính năng được hỗ trợ và hạn chế
Câu lệnh phải có dưới 4.000 mã thông báo (hoặc khoảng 3.000 từ tiếng Anh). Nếu đầu vào vượt quá 4.000 mã thông báo, hãy cân nhắc các lựa chọn sau:
- Ưu tiên việc tóm tắt 4.000 mã thông báo đầu tiên. Thử nghiệm cho thấy điều này thường mang lại kết quả tốt cho các thông tin đầu vào dài hơn. Hãy cân nhắc bật tính năng tự động rút gọn bằng cách gọi
setLongInputAutoTruncationEnabled
để hệ thống tự động rút gọn dữ liệu đầu vào bổ sung. - Phân đoạn đầu vào thành các nhóm gồm 4.000 mã thông báo và tóm tắt từng nhóm.
- Hãy cân nhắc một giải pháp trên đám mây phù hợp hơn với dữ liệu đầu vào lớn hơn.
Đối với InputType.ARTICLE
, nội dung nhập cũng phải có hơn 400 ký tự, trong đó mô hình hoạt động hiệu quả nhất khi bài viết có ít nhất 300 từ.
GenAI Summarization API hỗ trợ tiếng Anh, tiếng Nhật và tiếng Hàn, đồng thời được xác định trong SummarizerOptions.Language
.
Khả năng sử dụng cấu hình tính năng cụ thể (do SummarizerOptions
chỉ định) có thể thay đổi tuỳ theo cấu hình của thiết bị cụ thể và các mô hình đã được tải xuống thiết bị.
Cách đáng tin cậy nhất để nhà phát triển đảm bảo rằng tính năng API dự kiến được hỗ trợ trên một thiết bị có SummarizerOptions
được yêu cầu là gọi phương thức checkFeatureStatus()
. Phương thức này cung cấp trạng thái xác định về khả năng sử dụng tính năng trên thiết bị trong thời gian chạy.
Các vấn đề thường gặp về chế độ thiết lập
Các API GenAI của Bộ công cụ học máy dựa vào ứng dụng Android AICore để truy cập vào Gemini Nano. Khi thiết bị vừa được thiết lập (bao gồm cả thiết lập lại) hoặc ứng dụng AICore vừa được thiết lập lại (ví dụ: xoá dữ liệu, gỡ cài đặt rồi cài đặt lại), ứng dụng AICore có thể không có đủ thời gian để hoàn tất quá trình khởi động (bao gồm cả việc tải các cấu hình mới nhất xuống từ máy chủ). Do đó, các API AI tạo sinh của Bộ công cụ học máy có thể không hoạt động như mong đợi. Sau đây là các thông báo lỗi thiết lập thường gặp mà bạn có thể gặp phải và cách xử lý các lỗi đó:
Ví dụ về thông báo lỗi | Cách xử lý |
AICore không hoạt động được do lỗi loại 4-CONNECTION_ERROR và mã lỗi 601-BINDING_FAILURE: Không liên kết được dịch vụ AICore. | Điều này có thể xảy ra khi bạn cài đặt ứng dụng bằng các API GenAI của Bộ công cụ học máy ngay sau khi thiết lập thiết bị hoặc khi AICore bị gỡ cài đặt sau khi ứng dụng của bạn được cài đặt. Việc cập nhật ứng dụng AICore rồi cài đặt lại ứng dụng của bạn sẽ khắc phục được vấn đề này. |
AICore không hoạt động được do lỗi loại 3 – PREPARATION_ERROR và mã lỗi 606 – FEATURE_NOT_FOUND: Không có tính năng .... |
Điều này có thể xảy ra khi AICore chưa tải xong các cấu hình mới nhất. Khi thiết bị kết nối với Internet, quá trình cập nhật thường mất từ vài phút đến vài giờ. Việc khởi động lại thiết bị có thể giúp quá trình cập nhật diễn ra nhanh hơn.
Xin lưu ý rằng nếu trình tải khởi động của thiết bị bị mở khoá, bạn cũng sẽ thấy lỗi này. API này không hỗ trợ các thiết bị có trình tải khởi động đã mở khoá. |
AICore gặp lỗi loại 1 – DOWNLOAD_ERROR và mã lỗi 0 – UNKNOWN: Tính năng ... gặp lỗi với trạng thái lỗi 0 và lỗi esz: UNAVAILABLE: Unable to resolve host ... | Giữ kết nối mạng, chờ vài phút rồi thử lại. |