Adicionar recursos do Gemini ao seu app Android

1. Antes de começar

A API Gemini oferece acesso a modelos de IA generativa da família Gemini. Isso vai permitir que você crie novas experiências que até agora não estavam disponíveis.

Este codelab orienta você no processo de adicionar recursos de resumo ao aplicativo JetNews. O JetNews é um app de leitura de notícias criado com o Jetpack Compose, parte do repositório compose-samples (links em inglês).

Aplicativo JetNews em ação

Neste codelab, você vai:

  • Criar um comando para resumir notícias no Vertex AI Studio.
  • Integrar a Vertex AI no SDK do Firebase ao JetNews.
  • Adicionar uma seção "Resumo do Gemini" na parte de cima da visualização da notícia e um botão "Resumo" na barra de baixo.

7eee9f1dcad682c.png

O app JetNews com o recurso de resumo da API Gemini.

Pré-requisitos

  • Conhecimentos básicos sobre Kotlin (link em inglês)
  • Familiaridade com o uso do Android Studio e o teste de apps em um emulador ou dispositivo físico com o nível 21 da API do Android ou mais recente
  • Uma Conta do Google para acessar o Firebase

2. Elaborar um comando

O comando é a mensagem enviada pelo seu app ao modelo Gemini pela API Gemini. Ele pode incluir arquivos de texto, imagens, áudio e vídeo.

Criar o comando ideal para um caso de uso específico é mais arte do que ciência e, muitas vezes, requer várias iterações. O Vertex AI Studio é uma ótima ferramenta para criar seu comando.

Neste exemplo, você vai criar um comando de texto no Vertex AI Studio. Abra o Vertex AI Studio e clique em "Formato livre" no menu de navegação à esquerda.

52e11cb6e67d7199.png

Neste codelab, você vai resumir o conteúdo de um artigo técnico em quatro pontos. Seu objetivo com esse comando é garantir que o resumo seja relevante e esteja em texto simples, sem formatação Markdown.

Depois de algumas iterações, você provavelmente vai encontrar um comando que funciona muito bem. Você pode usar algo como o seguinte:

Summarize the core findings of the following article in 4 concise bullet points. Ensure each bullet point is specific, informative and relevant. Return just the bullet points as plain text. Don't use markdown.

[article body]

Quando achar que o resultado está como você quer, poderá integrar a API Gemini ao app Android.

3. Conferir o código

Comece conferindo o código-fonte inicial do GitHub:

git clone https://github.com/android/codelab-gemini-summary

O app JetNews foi projetado desde o início para seguir as práticas recomendadas de arquitetura do Android e ficar bem dimensionado em qualquer dispositivo móvel, grande ou pequeno.

Leia mais sobre a abordagem de implementação do JetNews para oferecer suporte a telas grandes (link em inglês).

Se o código-fonte do app JetNews for muito grande, não se preocupe. Para adicionar o recurso de resumo do Gemini, você só precisa modificar o código na classe GeminiRepositoryImpl. O código que ativa a geração do resumo e mostra o resultado no app já foi implementado.

Implementação final

É possível acessar diretamente a implementação final do código-fonte conferindo esta ramificação:

git clone https://github.com/android/codelab-gemini-summary
git switch final

Siga as instruções detalhadas na etapa 4 deste codelab para criar e configurar seu projeto do Firebase.

4. Configurar seu projeto do Firebase

Criar um projeto do Firebase

Crie um projeto do Firebase no console do Firebase. Crie um novo projeto do Firebase inserindo um novo nome na primeira etapa do fluxo de trabalho "Criar um projeto". O projeto do Google Cloud será criado automaticamente.

No projeto, acesse a página Criar com o Gemini para fazer o seguinte:

Conectar seu app ao Firebase

Agora que você configurou seu projeto do Firebase, é necessário conectar o app Android a ele.

  1. No Console do Firebase, selecione seu projeto.
  2. Clique em "Adicionar app" e selecione "Android".
  3. Siga as instruções na tela para registrar o app informando o nome do pacote.
  4. Baixe o arquivo google-services.json e adicione ao diretório raiz do módulo (nível do app) do seu app.
  5. Continue seguindo as instruções na tela para adicionar o plug-in do Gradle para Serviços do Google e as dependências do Gradle da Lista de materiais (BoM) do Firebase ao app.

Alternativa: usar o Firebase Assistente no Android Studio para conectar seu app

Se preferir, use o Firebase Assistente no Android Studio para conectar seu app com alguns cliques.

O Firebase Assistente permite registrar seu app com um projeto do Firebase e adicionar os arquivos, plug-ins e dependências necessários ao seu projeto do Android. Tudo isso é feito no Android Studio.

Consulte as instruções detalhadas na documentação do Firebase.

5. Atualizar importações do Gradle

O app JetNews usa o recurso de catálogos de versões do Gradle, que ajuda a centralizar as versões das dependências.

  1. Para adicionar a importação do Gradle para a Vertex AI no SDK do Firebase, adicione o seguinte a libs.versions.toml:
    [versions]
    ...
    vertexai = "16.0.0"
    
    [libraries]
    ...
    firebase-vertexai = { module = "com.google.firebase:firebase-vertexai", version.ref = "vertexai"}
    
  2. Atualizar build.gradle.kts:
    implementation(libs.firebase.vertexai)
    
  3. Clique em "Sincronizar agora" para buscar os artefatos do Gradle.

Se você não quiser usar os catálogos de versões do Gradle, adicione a importação diretamente em build.gradle.kts:

// Import the Firebase BoM
implementation(platform("com.google.firebase:firebase-bom:33.5.1"))
implementation("com.google.firebase:firebase-vertexai")

6. Integração com o Kotlin

Agora que as dependências adequadas foram adicionadas, atualize o código Kotlin.

Abra a classe GeminiRepositoryImpl. Essa classe hospeda todo o código que interage com a API Gemini.

Inicialização do modelo Gemini

Instancie a classe GenerativeModel:

private val generativeModel = Firebase.vertexAI.generativeModel(
   "gemini-1.5-flash",
   generationConfig = generationConfig {
      temperature = 0f
   },
      safetySettings = listOf(
         SafetySetting(HarmCategory.HARASSMENT, HarmBlockThreshold.LOW_AND_ABOVE),
                SafetySetting(HarmCategory.HATE_SPEECH, HarmBlockThreshold.LOW_AND_ABOVE),
                SafetySetting(HarmCategory.SEXUALLY_EXPLICIT, HarmBlockThreshold.LOW_AND_ABOVE),
                SafetySetting(HarmCategory.DANGEROUS_CONTENT, HarmBlockThreshold.LOW_AND_ABOVE),
       )
    )

Neste exemplo, você está acessando o modelo Gemini 1.5 Flash. Esse modelo é capaz de lidar com o caso de uso de resumo de texto deste exemplo e tem um custo benefício melhor do que o Gemini 1.5 Pro. Saiba mais sobre os modelos do Gemini disponíveis na documentação da Vertex AI no Firebase.

Esse exemplo também define o valor da temperatura como 0, o que garante uma consistência melhor na geração de resumos. Saiba mais sobre os parâmetros de configuração do modelo na documentação da Vertex AI no Firebase.

Por fim, este exemplo define as configurações de segurança para garantir que o modelo gere respostas com linguagem apropriada. Saiba mais sobre os recursos de configuração de segurança na documentação da Vertex AI no Firebase.

Resumo usando o Gemini

Em seguida, atualize a função summarizePost() para resumir a postagem transmitida como parâmetro.

Primeiro, extraia o texto da postagem para transmitir ao modelo:

val postString = StringBuilder()
for (paragraph in post.paragraphs) {
  postString.append(paragraph.text)
}

Crie o prompt com base no comando criado na etapa 2 deste codelab e transmita a postagem:

val prompt =
            "Summarize the following article in 4 concise bullet points. " +
                    "Ensure each bullet point is specific, informative and relevant. " +
                    "Return just the bullet points as plain text. " +
                    "Use plain text, don't use markdown. \n $postString"

Por fim, transmita o comando para o modelo e retorne a resposta:

return generativeModel.generateContent(prompt).text

Testar a implementação

Para testar a implementação, clique em "Run app" no Android Studio e instale o app JetNews no emulador ou em um dispositivo físico.

Abra qualquer matéria na página inicial e clique no botão "Resumir" na barra de baixo:

Botão que ativa o resumo do Gemini

A seção "Resumo do Gemini" vai aparecer na parte de cima da matéria, abaixo da ilustração:

A seção "Resumo do Gemini" que aparece na parte de cima da matéria

Arquitetura do app JetNews

O JetNews foi criado para mostrar os recursos atuais da interface do Jetpack Compose. Ele foi implementado para ser compatível com diferentes tamanhos de tela. Para mais detalhes, consulte esta postagem do blog (em inglês).

O objetivo deste codelab não é entrar em detalhes na arquitetura do app JetNews. A integração do Gemini ocorre principalmente na classe GeminiRepositoryImpl.

No entanto, se você quiser saber como o botão ativa o resumo, consulte a função SummaryButton() em JetnewsIcons.kt. Você também pode analisar a implementação da interface de resumo na função SummarySection() em PostContent.kt.

7. Conclusão

Neste codelab, você aprendeu a:

  • Criar e testar um comando no Vertex AI Studio.
  • Configurar um projeto no Firebase para usar a Vertex AI no Firebase e a API Gemini.
  • Configurar as dependências do Gradle para usar a Vertex AI no Firebase em um app Android.
  • Chamar a API Gemini para acessar o modelo Gemini 1.5 Flash usando o código Kotlin.

Para saber mais sobre a Vertex AI no Firebase para apps Android, consulte os exemplos de código Android (link em inglês) e a documentação.