Với API Tóm tắt GenAI của Bộ công cụ học máy, bạn có thể tự động tạo bản tóm tắt 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 các phần văn bản lớn.
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 cuộc 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ể yêu cầu sức mạnh xử lý đáng kể. Việc xử lý nội dung này trên thiết bị sẽ làm giảm tải máy chủ và giảm chi phí phân phát, đồng thời vẫn đảm bảo quyền riêng tư cho dữ liệu người dùng.
Các chức năng chính
API Tóm tắt GenAI bao gồm 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.
- Kết quả tóm tắt ở dạng một, hai hoặc ba dấu đầu dòng.
Bắt đầu
Thêm API tóm tắt của Bộ công cụ học máy 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 đố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 dữ liệu đầu vào văn bản được chỉ định là InputType.CONVERSATION
, mô hình sẽ yêu cầu dữ liệu đầu vào ở định dạng sau:
<name>: <message>
<name2>: <message2>
<name>: <message3>
<name3>: <message4>
Điều này cho phé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 hiểu biết tố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à giới hạn
Dữ liệu đầu vào phải có ít hơn 4.000 mã thông báo (hoặc khoảng 3.000 từ tiếng Anh). Nếu dữ liệu đầu vào vượt quá 4000 mã thông báo, hãy cân nhắc các lựa chọn sau:
- Ưu tiên tóm tắt 4000 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 dữ liệu đầu vào dài hơn. Hãy cân nhắc bật tính năng tự động cắt bớt bằng cách gọi
setLongInputAutoTruncationEnabled
để dữ liệu đầu vào thừa sẽ tự động bị cắt bớt. - Phân đoạn dữ liệu đầu vào thành các nhóm gồm 4000 mã thông báo và tóm tắt từng nhóm.
- Cân nhắc một giải pháp đá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
, dữ liệu đầu vào 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ừ.
API Tóm tắt GenAI 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 hoạt động của cấu hình tính năng cụ thể (do SummarizerOptions
chỉ định) có thể thay đổi tuỳ thuộc vào 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 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 khi 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 một thiết bị vừa được thiết lập (bao gồm cả việc đặt lại) hoặc ứng dụng AICore vừa được đặt 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 chạy (bao gồm cả việc tải cấu hình mới nhất xuống từ máy chủ). Do đó, các API GenAI của Bộ công cụ học máy có thể không hoạt động như mong đợi. Dưới đây là các thông báo lỗi thiết lập thường gặp mà bạn có thể thấy 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 thành công với loại lỗi 4-CONNECTION_ERROR và mã lỗi 601-BINDING_FAILURE: Không thể liên kết 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. Bạn có thể khắc phục vấn đề này bằng cách cập nhật ứng dụng AICore rồi cài đặt lại ứng dụng. |
AICore không thành công với loại lỗi 3-PREPARATION_ERROR và mã lỗi 606-FEATURE_NOT_FOUND: Tính năng ... không có sẵn. |
Đ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. Duy trì kết nối mạng và chờ từ vài phút đến vài giờ.
Xin lưu ý rằng nếu trình tải khởi động của thiết bị đã được 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 không thành công với loại lỗi 1-DOWNLOAD_ERROR và mã lỗi 0-UNKNOWN: Tính năng ... không thành công với trạng thái lỗi 0 và lỗi esz: UNAVAILABLE: Unable to resolve host ... | Duy trì kết nối mạng, đợi vài phút rồi thử lại. |