Com a API GenAI Summarization 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 aborda preocupações sobre privacidade de dados e eficiência de custos. Os apps que resumem conversas, e-mails, notas e lembretes pessoais geralmente lidam com 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 GenAI Summarization abrange os seguintes recursos:
- Resumir texto, categorizado como artigo ou conversa.
- Resuma a saída em um, dois ou três marcadores.
Primeiros passos
Adicione a API de resumo do ML Kit como uma dependência na sua configuração build.gradle
.
implementation("com.google.mlkit:genai-summarization:1.0.0-beta1")
Em seguida, implemente o código no projeto:
- Crie um objeto
Summarizer
. - Faça o download do recurso, se ele estiver disponível.
- Crie uma solicitação de resumo.
- Execute a inferência e recupere 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 processa diferentes tipos de entrada
Quando a entrada de texto é especificada como InputType.CONVERSATION
, o modelo espera entradas no seguinte formato:
<name>: <message>
<name2>: <message2>
<name>: <message3>
<name3>: <message4>
Isso permite que o modelo produza um resumo mais preciso, oferecendo uma melhor compreensão da conversa e das interações.
Recursos e limitações compatíveis
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 o resumo dos primeiros 4.000 tokens. Os testes indicam que isso geralmente gera bons resultados para entradas mais longas. Considere ativar o truncamento automático chamando
setLongInputAutoTruncationEnabled
para que a entrada extra seja truncada automaticamente. - Divida a entrada em grupos de 4.000 tokens e resuma cada um deles.
- Considere uma solução de nuvem mais adequada para a entrada maior.
Para InputType.ARTICLE
, a entrada também precisa ter mais de 400 caracteres, e o modelo funciona melhor quando o artigo tem pelo menos 300 palavras.
A API GenAI Summarization oferece suporte a inglês, japonês e coreano e é definida em SummarizerOptions.Language
.
A disponibilidade da configuração de recurso específica (especificada por
SummarizerOptions
) pode variar dependendo da configuração do dispositivo
e dos modelos baixados nele.
A maneira mais confiável para os desenvolvedores garantirem que o recurso de API pretendido seja
compatível com um dispositivo com o SummarizerOptions
solicitado é chamar o método
checkFeatureStatus()
. Esse método fornece o status definitivo
da disponibilidade de recursos no dispositivo durante a 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 a redefinição) ou o app AICore é redefinido (por exemplo, limpar dados, desinstalar e reinstalar), ele 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 de IA generativa do ML Kit podem não funcionar como esperado. Confira as mensagens de erro de configuração comuns que você pode encontrar e como lidar com elas:
Exemplo de mensagem de erro | Como proceder |
O AICore falhou com o tipo de erro 4-CONNECTION_ERROR e o código de erro 601-BINDING_FAILURE: falha ao vincular o serviço AICore. | Isso pode acontecer quando você instala o app usando as APIs de IA generativa do ML Kit imediatamente após a configuração do dispositivo ou quando o AICore é desinstalado depois que o app é instalado. Atualize e reinstale o app AICore 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 baixar as configurações mais recentes. Quando o dispositivo está conectado à Internet, geralmente leva de alguns minutos a algumas horas para atualizar. Reiniciar o dispositivo pode acelerar a atualização.
Se o carregador de inicialização do dispositivo estiver desbloqueado, esse erro também vai aparecer. A API não é compatível com dispositivos com carregadores de inicialização desbloqueados. |
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: UNAVAILABLE: não foi possível resolver o host ... | Mantenha a conexão de rede, aguarde alguns minutos e tente de novo. |