Gemini AI y Llama Index en acción: una demo práctica paso a paso

Albert Gil López
6 min readDec 25, 2023

--

AUTOR: DALL-E 3

Estamos siendo testigos en primera persona de la evolución de la inteligencia artificial.

Hace unas semanas se presentó Gemini, el modelo de IA más avanzado y versátil de Google hasta la fecha. Gemini, por su naturaleza multimodal, tiene la capacidad de procesar y combinar información de diferentes fuentes como texto, imágenes, audio, video y código.

Esto abre un nuevo abanico de posibilidades ya que permite construir aplicaciones más intuitivas y útiles que se alinean más con la manera en que interactuamos con el mundo.

En este artículo veremos algunas de sus posibilidades, y cómo se integra con el framework de Llama Index, con el objetivo de proyectar algunas ideas para a creación de aplicaciones de Inteligencia Artificial Generativa (IAG).

Background

Gemini lleva años de investigación y desarrollo por parte de Google DeepMind. Gemini se distingue por ser el primer modelo de Google que es natively multimodal, lo que significa que fue diseñado desde cero para comprender, operar y combinar diferentes tipos de información, incluyendo texto, código, audio, imagen y video.

La flexibilidad de Gemini es evidente en sus tres versiones: Ultra, Pro y Nano. Cada una está optimizada para una gama de tareas, desde las más complejas en Ultra hasta las tareas en dispositivos móviles con Nano.

Si quieres entrar más en los detalles técnicos y el rendimiento de Gemini puedes ver el informe técnico y la descripción general del producto en las fuentes oficiales.

En resumen, la creación de Gemini marca un hito en la historia de la IA, abriendo nuevas puertas para aplicaciones más intuitivas en una gama más amplia de contextos.

Hands-On: Demo implementando Gemini con Llama Index

Tras entender las capacidades y antecedentes de Gemini vamos a remangarnos. Utilizando Llama Index se facilita bastante todo, la verdad.

Llama Index proporciona un framework que simplifica el proceso de integración y uso de modelos de IA como Gemini en aplicaciones prácticas.

En la demo te muestro como Gemini, a través de Llama Index, se puede utilizar para generar contenido, procesar imágenes y mantener una conversación.

Credits — Google Gemini Sample (https://github.com/GoogleCloudPlatform/generative-ai/tree/main/gemini)

  1. Empieza por aquí, configura tu proyecto para poder acceder al servicio de Vertex AI a través de Google Cloud.
  2. Uso del modelo “gemini-pro” para generar contenido y mantener una conversación de chat.
from vertexai.preview.generative_models import (
GenerationConfig,
GenerativeModel,
Image,
Part,
)

El modelo se puede utilizar para generar contenido a partir de diferentes entradas de texto. Por ejemplo, se genera una respuesta a la pregunta “¿Por qué el cielo es azul?” y se crea una lista de tendencias tecnológicas.

model = GenerativeModel("gemini-pro")

responses = model.generate_content("¿Por qué el cielo es azul?", stream=True)

for response in responses:
print(response.text, end="")
prompt = """Crea una lista de 10 elementos. Cada elemento tiene que ser una tendencia en la industria tecnologica.

Cada tenedencia tiene que ser inferior a 5 palabras""" # try your own prompt

responses = model.generate_content(prompt, stream=True)

for response in responses:
print(response.text, end="")

Se pueden establecer parámetros de generación (GenerationConfig) cómo en los otros modelos para controlar cómo éste produce respuestas. Estos incluyen configuraciones como temperature, top_p, top_k, y max_output_tokens. Son parámetros que afectan la creatividad y la longitud de las respuestas generadas por el modelo.

En el siguiente código se muestra cómo el modelo puede manejar conversaciones naturales emulando un chat entre dos personas. Se inicia un chat y se envían mensajes al modelo, que responde de manera contextual.

# Test chat prompts
# The Gemini Pro model supports natural multi-turn conversations and is ideal for text tasks that require back-and-forth interactions. The following examples show how the model responds during a multi-turn conversation.

chat = model.start_chat()

prompt = """Mi nombre es Albert. Eres mi asistente personal. Mi película favorita es Titanic. Sugiereme una nueva película."""

responses = chat.send_message(prompt, stream=True)

for response in responses:
print(response.text, end="")
prompt = "¿Mi película favorita está basada en un libro?"

responses = chat.send_message(prompt, stream=True)

for response in responses:
print(response.text, end="")
print(chat.history)
[role: "user"
parts {
text: "Mi nombre es Albert. Eres mi asistente personal. Mi película favorita es Titanic. Sugiereme una nueva película.\n"
}
, role: "model"
parts {
text: "* **The Shawshank Redemption (1994)**: Un banquero condenado injustamente por el asesinato de su esposa se hace amigo de un contrabandista en prisión.\n* **The Godfather (1972)**: Una familia italoamericana de Nueva York está involucrada en el crimen organizado.\n* **The Dark Knight (2008)**: Un vigilante enmascarado protege Gotham City de los criminales, incluido el Joker.\n* **Inception (2010)**: Un ladrón profesional se introduce en los sueños de la gente para robar información valiosa.\n* **Interstellar (2014)**: Un grupo de astronautas viaja a través de un agujero de gusano para encontrar un nuevo hogar para la humanidad.\n* **La La Land (2016)**: Un pianista de jazz y una aspirante a actriz se enamoran en Los Ángeles.\n* **Moonlight (2016)**: Un joven afroamericano crece en un barrio pobre de Miami.\n* **Parasite (2019)**: Una familia pobre de Corea del Sur se infiltra en la casa de una familia rica.\n* **The Green Mile (1999)**: Un guardia de prisión descubre que un preso condenado a muerte tiene poderes curativos.\n* **The Sixth Sense (1999)**: Un niño que ve fantasmas ayuda a un psicólogo a resolver su propio pasado."
}
, role: "user"
parts {
text: "¿Mi película favorita está basada en un libro?"
}
, role: "model"
parts {
text: "Sí, tu película favorita, Titanic, está basada en el libro *Titanic: Una historia de fuego y hielo* de Walter Lord, publicado en 1955. El libro es un relato histórico del hundimiento del RMS Titanic, ocurrido en la madrugada del 15 de abril de 1912. Lord se basó en entrevistas con supervivientes, testimonios de la investigación oficial y otros documentos para reconstruir los acontecimientos de esa fatídica noche.\n\nLa película Titanic, dirigida por James Cameron y estrenada en 1997, es una adaptación del libro de Lord. La película sigue de cerca la trama del libro, aunque con algunas diferencias. Por ejemplo, la película se centra más en la historia de amor entre Jack y Rose, dos pasajeros de diferentes clases sociales que se conocen y se enamoran a bordo del Titanic.\n\nTanto el libro como la película han sido elogiados por su precisión histórica y su capacidad para capturar la tragedia del Titanic. El libro ganó el Premio Nacional del Libro de No Ficción en 1956, y la película ganó 11 Premios de la Academia, incluyendo Mejor Película y Mejor Director."
}
]

3. Procesamiento de imágenes mediante la carga de una imagen a través de una URL, y cómo el modelo tiene la capacidad para describir una escena a partir de esa imagen y generarnos un texto.

# Utilizamos GenerativeModel a través de Vertex Ai
# Otra opción es inizializarlo utilizando llama_index
# from llama_index.multi_modal_llms.gemini import GeminiMultiModal
# Si se usa esta opción hay que configurar una API KEY:

# import os
# GOOGLE_API_KEY = "tu-api-key" # add your GOOGLE API key here
# os.environ["GOOGLE_API_KEY"] = GOOGLE_API_KEY

from llama_index.multi_modal_llms.generic_utils import (
load_image_urls,
)

image_urls = [
"https://cdn.hobbyconsolas.com/sites/navi.axelspringer.es/public/media/image/2016/07/titanic.jpg?tf=1200x",
# Añade más imágenes aquí
]

image_documents = load_image_urls(image_urls)

# from llama_index import SimpleDirectoryReader
# # load image documents from local directory
# image_documents = SimpleDirectoryReader("data/").load_data()

Mostramos la imagen:

from PIL import Image
import requests
from io import BytesIO
import matplotlib.pyplot as plt

img_response = requests.get(image_urls[0])
print(image_urls[0])
img = Image.open(BytesIO(img_response.content))
plt.imshow(img)
https://cdn.hobbyconsolas.com/sites/navi.axelspringer.es/public/media/image/2016/07/titanic.jpg?tf=1200x
from llama_index.multi_modal_llms.gemini import GeminiMultiModal

gemini_pro = GeminiMultiModal(model="models/gemini-pro-vision")

complete_response = gemini_pro.complete(
prompt="¿Puedes describirme esta escena?",
image_documents=image_documents,
)

complete_response.text

‘Es una imagen del Titanic, un trasatlántico británico que se hundió en el Océano Atlántico Norte la noche del 14 al 15 de abril de 1912, después de chocar con un iceberg durante su viaje inaugural desde Southampton a Nueva York.’

Conclusiones

Es evidente que estamos al borde de una revolución en el campo de la inteligencia artificial.

Gemini tiene la capacidad para procesar y comprender una gama diversa de datos — texto, imagen, audio y video — con un enfoque intuitivo y natural.

Gemini es una invitación a explorar y a imaginar nuevas realidades. A medida que esta tecnología evoluciona y se integra más en nuestras vidas y trabajo, nos enfrentamos a la emocionante tarea de descubrir cómo podemos utilizarla (para bien siempre, claro).

What’s Next, próximos pasos:

Comparte tu experiencia:

Estoy abierto a colaborar y discutir sobre las posibilidades que ofrece la inteligencia artificial y cómo trabajar juntos para explorar y construir soluciones en diferentes sectores. Si tienes ideas, preguntas o simplemente quieres hablar de ello, escríbeme:

--

--

Albert Gil López

Explorando data science e IA para mejorar la vida diaria y optimizar negocios. Apasionado por el aprendizaje continuo y la aplicación práctica del conocimiento.