Cómo agregar funciones de Gemini a tu app para Android

1. Antes de comenzar

La API de Gemini te brinda acceso a los modelos de IA generativa de la familia Gemini. Te permitirá crear experiencias nuevas que hasta ahora no estaban disponibles.

Este codelab te guía por el proceso para agregar capacidades de resumen a la aplicación JetNews. JetNews es una app para leer noticias compilada con Jetpack Compose que forma parte del repositorio de muestras de Compose.

Aplicación de JetNews en acción

En este codelab, harás lo siguiente:

  • Crear una instrucción para resumir artículos de noticias en Vertex AI Studio
  • Integrar el SDK de Vertex AI in Firebase a JetNews
  • Agregar una sección "Resumen de Gemini" en la parte superior de la vista del artículo y un botón "Resumen" en la barra inferior

7eee9f1dcad682c.png

La app de JetNews con la función de resumen potenciada por la API de Gemini.

Requisitos previos

  • Tener conocimientos básicos de Kotlin
  • Conocer el uso de Android Studio y la prueba de apps en un emulador o dispositivo físico que ejecute el nivel de API de Android 21 o una versión posterior
  • Tener una Cuenta de Google para acceder a Firebase

2. Diseña una instrucción

La instrucción es el mensaje que tu aplicación envía al modelo de Gemini a través de la API de Gemini. Puede incluir archivos de texto, imágenes, audio y video.

El proceso de elaboración de la propuesta ideal para un caso de uso específico es más arte que ciencia y, a menudo, requiere varias iteraciones. Vertex AI Studio es una excelente herramienta para crear tu instrucción.

En este ejemplo, crearás una instrucción de texto en Vertex AI Studio. Abre Vertex AI Studio y, luego, haz clic en "Formato libre" en el panel de navegación de la izquierda.

52e11cb6e67d7199.png

En este codelab, debes resumir el contenido de un artículo técnico en cuatro viñetas. Tu objetivo con esta consigna es asegurarte de que el resumen contenga datos pertinentes y esté en texto sin formato de Markdown.

Después de algunas iteraciones, es probable que encuentres una instrucción que funcione particularmente bien. Algo como lo siguiente:

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]

Una vez que estés conforme con el resultado, podrás integrar la API de Gemini en la aplicación para Android.

3. Consulta el código

Comienza por consultar el código fuente de partida de GitHub:

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

La app de JetNews se diseñó desde cero para seguir las prácticas recomendadas de la arquitectura de Android y escalar bien en cualquier dispositivo móvil, ya sea grande o pequeño.

Obtén más información sobre el enfoque de implementación de JetNews para admitir pantallas grandes.

Si el código fuente de la app de JetNews te abruma, no te preocupes. Para agregar la función de resumen potenciada por Gemini, solo debes modificar el código de la clase GeminiRepositoryImpl. El código que activa y muestra el resumen en la app ya está implementado.

Implementación final

Para acceder directamente a la implementación final del código fuente, consulta esta rama:

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

Para crear y configurar tu proyecto de Firebase, deberás seguir las instrucciones detalladas en el paso 4 de este codelab.

4. Configura el proyecto de Firebase

Cómo crear un proyecto de Firebase

Crea un proyecto en Firebase console. Para crear un proyecto de Firebase nuevo, ingresa un nombre de proyecto nuevo en el primer paso del flujo de trabajo "Crear proyecto". El proyecto subyacente de Google Cloud se crea automáticamente.

En tu proyecto, ve a la página Crea con Gemini para hacer lo siguiente:

Conecta tu app a Firebase

Ahora que configuraste tu proyecto de Firebase, debes conectar tu app para Android a ese proyecto.

  1. En Firebase console, selecciona tu proyecto.
  2. Haz clic en "Agregar app" y selecciona "Android".
  3. Sigue las instrucciones en pantalla para registrar tu app. Para ello, proporciona el nombre del paquete de la app.
  4. Descarga el archivo google-services.json y agrégalo al directorio raíz del módulo (nivel de app) de tu app.
  5. Sigue las instrucciones en pantalla para agregar el complemento de Gradle de los servicios de Google y las dependencias de Gradle de la lista de materiales (BoM) de Firebase a tu app.

Alternativa: Usa Firebase Assistant en Android Studio para conectar tu app

Como alternativa, puedes usar Firebase Assistant en Android Studio para conectar tu app a Firebase con unos pocos clics.

Firebase Assistant te permite registrar tu app con un proyecto de Firebase y agregar los archivos, los complementos y las dependencias necesarios de Firebase, todo desde Android Studio.

Consulta las instrucciones detalladas en la documentación de Firebase.

5. Actualiza las importaciones de Gradle

La app de JetNews usa la función de catálogos de versiones de Gradle, que ayuda a centralizar las versiones de las dependencias.

  1. Para agregar la importación de Gradle para Vertex AI en el SDK de Firebase, agrega lo siguiente a libs.versions.toml:
    [versions]
    ...
    vertexai = "16.0.0"
    
    [libraries]
    ...
    firebase-vertexai = { module = "com.google.firebase:firebase-vertexai", version.ref = "vertexai"}
    
  2. Actualiza build.gradle.kts:
    implementation(libs.firebase.vertexai)
    
  3. Haz clic en "Sincronizar ahora" para recuperar los artefactos de Gradle.

Si no quieres usar los catálogos de versiones de Gradle, puedes agregar la importación directamente en build.gradle.kts:

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

6. Integración de Kotlin

Ahora que se agregaron las dependencias adecuadas, actualiza el código de Kotlin.

Abre la clase GeminiRepositoryImpl. Esta clase alojará todo el código que interactúe con la API de Gemini.

Inicialización del modelo de Gemini

Crea una instancia de 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),
       )
    )

En este ejemplo, accedes al modelo Gemini 1.5 Flash. Este modelo puede manejar el caso de uso de resumen de texto de este ejemplo y es más rentable que Gemini 1.5 Pro. Obtén más información sobre los modelos de Gemini disponibles en la documentación de Vertex AI in Firebase.

En este ejemplo, también se establece el valor de temperatura en 0, lo que garantiza una mayor coherencia en la generación de resúmenes. Obtén más información sobre los parámetros de configuración del modelo en la documentación de Vertex AI in Firebase.

Por último, este ejemplo define la configuración de seguridad para garantizar que el modelo genere un lenguaje adecuado en sus respuestas. Obtén más información sobre las funciones de configuración de seguridad en la documentación de Vertex AI in Firebase.

Resumen con Gemini

A continuación, actualiza la función summarizePost() para resumir la publicación que se pasó como parámetro.

Primero, extrae el texto de la publicación para pasarlo al modelo:

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

Crea el prompt en función de la instrucción diseñada en el paso 2 de este codelab y pasa la publicación:

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 último, pasa la instrucción al modelo y muestra la respuesta:

return generativeModel.generateContent(prompt).text

Prueba la implementación

Para probar la implementación, haz clic en "Run app" en Android Studio y, luego, instala la app de JetNews en tu emulador o dispositivo físico.

Abre cualquier historia de la página principal y haz clic en el botón de resumen de la barra inferior:

Botón que activa el resumen de Gemini

Deberías ver una sección "Resumen de Gemini" en la parte superior del artículo, debajo de la ilustración:

La sección de resumen de Gemini que aparece en la parte superior del artículo

Arquitectura de la app de JetNews

JetNews se creó para mostrar las capacidades actuales de la IU de Jetpack Compose. Se implementó para ser compatible con diferentes tamaños de pantalla (para obtener más información, consulta esta entrada de blog).

El propósito de este codelab no es analizar en detalle la arquitectura de la app de JetNews. La integración de Gemini se realiza principalmente en la clase GeminiRepositoryImpl.

Sin embargo, si quieres ver cómo el botón activa el resumen, puedes consultar SummaryButton() en JetnewsIcons.kt. También puedes revisar la implementación de la IU de resumen en la función SummarySection() en PostContent.kt.

7. Conclusión

En este codelab aprendiste a hacer lo siguiente:

  • Crear y probar una instrucción en Vertex AI Studio
  • Configurar un proyecto en Firebase para usar Vertex AI in Firebase y la API de Gemini
  • Configurar las dependencias de Gradle para usar Vertex AI in Firebase en una app para Android
  • Llamar a la API de Gemini para acceder al modelo de Gemini 1.5 Flash desde el código de Kotlin

Si quieres obtener más información sobre Vertex AI in Firebase para apps para Android, puedes revisar las muestras de código de Android y la documentación.