Com a API de resumo GenAI do Kit de ML, é possível gerar automaticamente resumos de artigos e conversas como uma lista de marcadores. Isso ajuda os usuários a entender grandes blocos de texto.
O resumo se beneficia da IA generativa no dispositivo porque ele aborda preocupações sobre privacidade de dados e eficiência de custos. Os apps que resumem conversas, e-mails, notas e lembretes pessoais geralmente processam informações sensíveis, o que torna o processamento no dispositivo importante para a privacidade do usuário. Além disso, as tarefas de resumo, principalmente aquelas com contextos longos ou muitos itens, podem exigir um poder de processamento significativo. O processamento desse conteúdo no dispositivo reduz a carga do servidor e os custos de veiculação, mantendo a privacidade dos dados do usuário.
Principais recursos
A API de resumo do GenAI abrange os seguintes recursos:
- Resumir texto, categorizado como artigo ou conversa.
- Gerar resumo em um, dois ou três marcadores.
Primeiros passos
Adicione a API de resumo do ML Kit como uma dependência na configuração
build.gradle
.
implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")
Em seguida, implemente o código no seu projeto:
- Crie um objeto
Summarizer
. - Faça o download do recurso, se ele tiver essa opção.
- Crie uma solicitação de resumo.
- Execute a inferência e extraia o resultado.
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();
Como o modelo lida com diferentes tipos de entrada
Quando a entrada de texto é especificada como InputType.CONVERSATION
, o modelo
espera uma entrada no seguinte formato:
<name>: <message>
<name2>: <message2>
<name>: <message3>
<name3>: <message4>
Isso permite que o modelo produza um resumo mais preciso, fornecendo uma melhor compreensão da conversa e das interações.
Recursos compatíveis e limitações
A entrada precisa ter menos de 4.000 tokens (ou aproximadamente 3.000 palavras em inglês). Se a entrada exceder 4.000 tokens, considere estas opções:
- Priorize a síntese dos primeiros 4.000 tokens. Os testes indicam que isso
geralmente gera bons resultados para entradas mais longas. Ative a truncagem
automática chamando
setLongInputAutoTruncationEnabled
para que a entrada extra seja truncada automaticamente. - Segmente a entrada em grupos de 4.000 tokens e resuma-os individualmente.
- Considere uma solução em nuvem mais adequada para a entrada maior.
Para InputType.ARTICLE
, a entrada também precisa ter mais de 400 caracteres, e o
modelo tem melhor desempenho quando o artigo tem pelo menos 300 palavras.
A API de resumo da GenAI oferece suporte ao inglês, japonês e coreano e é
definida em SummarizerOptions.Language
.
A disponibilidade da configuração específica do recurso (especificada por
SummarizerOptions
) pode variar dependendo da configuração do dispositivo
e dos modelos que foram transferidos por download para ele.
A maneira mais confiável para os desenvolvedores garantirem que o recurso de API pretendido tenha
suporte em um dispositivo com o SummarizerOptions
solicitado é chamar o método
checkFeatureStatus()
. Esse método fornece o status definitivo
da disponibilidade do recurso no dispositivo no momento da execução.
Problemas comuns de configuração
As APIs GenAI do Kit de ML dependem do app Android AICore para acessar o Gemini Nano. Quando um dispositivo é configurado (incluindo redefinição) ou o app AICore é redefinido (por exemplo, dados limpos, desinstalado e reinstalado), o app AICore pode não ter tempo suficiente para concluir a inicialização, incluindo o download das configurações mais recentes do servidor. Como resultado, as APIs do ML Kit GenAI podem não funcionar como esperado. Confira as mensagens de erro comuns de configuração e como lidar com elas:
Exemplo de mensagem de erro | Como lidar com |
O AICore falhou com o tipo de erro 4-CONNECTION_ERROR e o código de erro 601-BINDING_FAILURE: o serviço AICore falhou na vinculação. | Isso pode acontecer quando você instala o app usando as APIs do ML Kit GenAI imediatamente após a configuração do dispositivo ou quando o AICore é desinstalado após a instalação do app. Atualize o app AICore e reinstale o app para corrigir o problema. |
O AICore falhou com o tipo de erro 3-PREPARATION_ERROR e o código de erro 606-FEATURE_NOT_FOUND: o recurso ... não está disponível. |
Isso pode acontecer quando o AICore não termina de fazer o download das configurações mais recentes. Mantenha a conexão de rede e aguarde de alguns minutos a algumas horas.
Se o carregador de inicialização do dispositivo estiver desbloqueado, esse erro também vai aparecer. Essa API não oferece suporte a dispositivos com carregador de inicialização desbloqueado. |
O AICore falhou com o tipo de erro 1-DOWNLOAD_ERROR e o código de erro 0-UNKNOWN: o recurso ... falhou com o status de falha 0 e o erro esz: INDISPONÍVEL: não foi possível resolver o host ... | Mantenha a conexão de rede, aguarde alguns minutos e tente novamente. |