Hace ya unos meses que Google presentó Gemini, su nueva familia de modelos nativamente multimodal. Cuando salió causó un gran revuelo, en parte por la demostración de capacidades de Google, que fue poco transparente (y por ese motivo las redes sociales cargaron duramente contra Google).

Bueno, y porque la primera versión era tan multimodal como nos habían prometido. Pero pasó el tiempo y estamos viendo cómo Gemini ha ido evolucionando muy muy rápido: ha empezado a aceptar vídeos con audio integrado y su ventana de contexto ya tiene 2 millones de tokens.

En las últimas semanas han salido varias funcionalidades nuevas: caché de contexto en el modelo, Grounding automático y ejecución de código en sandbox. Si quieres saber en qué consisten estas funcionalidades, me complace decirte que estás en el sitio correcto.

  1. Caché de contexto

Una caché es un tipo de memoria que mantiene información acerca del sitio donde se necesita / procesa, de forma que optimiza en tiempo y consumo el proceso que la utiliza. Gemini ha presentado una caché de contexto de manera nativa, de forma que podemos decirle que guarde información “al lado” del modelo, mejorando así la velocidad de llamada y el coste de la misma. Veámoslo con un ejemplo:

Imaginemos que tenemos un chatbot que nos ayuda a elegir la pizza que necesitamos dentro de la carta de un restaurante, pudiendo preguntar por ingredientes, calorías y otros aspectos.

Como cada vez podemos mandar más información a los modelos, y no estamos hablando de un volumen muy grande, hemos decidido enviar toda la carta cada vez en lugar de hacer un sistema RAG para enviar solo la parte de la información que tenga sentido.

El prompt sería algo así:

"""Eres un chatbot ayudante de un restaurante y tu misión es recomendar pizzas de la carta del restaurante. Solo puedes recomendar pizzas de este restaurante. No contestes a otro tipo de preguntas. Tienes que recomendar pizzas dando los argumentos, puedes recomendar varias pizzas indicando siempre cuál es la mejor recomendación. Esta es la carta del restaurante: 

Pizzas Clásicas:
Margherita: Tomate, mozzarella fresca, albahaca. 250kcal (L: Lácteos)
Marinara: Tomate, ajo, orégano, aceite de oliva. 200kcal (L: Lácteos)
Capricciosa: Tomate, mozzarella, champiñones, jamón cocido, aceitunas negras. 350kcal (L: Lácteos)
Diavola: Tomate, mozzarella, salami picante, chile. 380kcal (L: Lácteos)
Prosciutto e Funghi: Tomate, mozzarella, jamón serrano, champiñones. 370kcal (L: Lácteos)
Pizzas Especiales:
Quattro Formaggi: Tomate, mozzarella, gorgonzola, parmesano, ricotta. 400kcal (L: Lácteos)
Vegetariana: Tomate, mozzarella, berenjena, calabacín, cebolla, pimiento rojo, aceitunas verdes. 320kcal (L: Lácteos)
Carbonara: Crema de leche, huevo, bacon, queso pecorino romano. 450kcal (L: Lácteos)
Pizza Romana: Tomate, mozzarella, anchoas, alcaparras, aceitunas negras. 360kcal (L: Lácteos)
Frutti di Mare: Tomate, mozzarella, gambas, mejillones, calamares, almejas. 420kcal (L: Lácteos, Mariscos)
Pizzas Gourmet:
Tartufo: Tomate, mozzarella, trufa negra, parmesano. 480kcal (L: Lácteos)
Gorgonzola e Pere: Tomate, mozzarella, gorgonzola, pera, rúcula. 410kcal (L: Lácteos)
Pizza Bianca: Crema de ajo, mozzarella, prosciutto crudo, rúcula. 430kcal (L: Lácteos)
Pizza Siciliana: Tomate, mozzarella, cebolla caramelizada, ricotta salada, anchoas. 390kcal (L: Lácteos)
Esta es la petición del usuario: {petición}

Y esta es tu recomendación:"""

Como podemos ver, vamos a tener que enviar una y otra vez todo el prompt aunque solo cambie una parte muy pequeña. Parece una ocasión perfecta para usar nuestra caché de contexto, gracias a ella ahorraremos dinero y tiempo a la hora de realizar nuestras recomendaciones.

  1. Grounding.

Dentro de los diferentes casos de uso que nos ofrece la IA Generativa, los sistemas RAG son de los más populares, ya que nos permiten nutrir a los modelos fundacionales con información más actualizada o específica para una determinada respuesta.

Por ejemplo, si estamos preguntando al chatbot corporativo, es más que probable que, junto con nuestra pregunta, le llegue al modelo LLM la información relevante sobre nuestra pregunta para que la respuesta sea lo más precisa posible.

Pues bien, Gemini ha presentado que cuenta con grounding nativo tanto para integrarse con Google Search (como no) o con fuentes empresariales mediante los agentes de Vertex. Esto es de muchísima utilidad ya que nos ahorra tiempo, esfuerzo y mantenimiento a la hora de elaborar soluciones que necesiten información actualizada de Google o relevantes a nuestro caso.

Para no complicarlo mucho vamos a ir con un ejemplo sencillo. Queremos saber quién ha ganado el último Roland Garros. Si lanzamos esta pregunta a un modelo sin grounding, este se basará en sus conocimientos para decirnos que no puede saber el futuro.

Ejemplo de una consulta a gemini sin usar grounding

Y ahora, la respuesta si le permitimos buscar en Google mediante el grounding:

Ejemplo de una consulta a Gemini usando grounding

Como nos podemos imaginar, el modelo ha sido entrenado con información que no contiene el último campeón pero sí puede consultar a Google. Con esta información actualizada ya es capaz de darnos la información correcta. ¡Vamos, Carlitos!

  1. Ejecución de código.

De las tres funcionalidades de las que hablamos en este post esta es, sin duda, la que más me ha volado la cabeza. Y es que los LLM tenían muchos problemas a la hora de generar código o realizar operaciones matemáticas donde la calidad de sus respuestas no era comparable a la obtenida en otras materias. Bien es verdad que, con el uso de tools, esta carencia se minimiza bastante pero implica trabajo extra en la codificación de la llamada y lleva gastos extra asociados.

Desde hace unos días, Gemini ya puede hacer uso de un sandbox de Python con algunas librerías precargadas como numPy o symPy y que permite al modelo ejecutar el código iterativamente en este sandbox hasta conseguir una respuesta válida.

Evidentemente tiene bastantes limitaciones, pero como avance es espectacular. Ahora podemos preguntar a “alguien” que sabe mucho de Python pero que, además, puede acceder a un terminal para probar que la solución que te da es correcta mediante diferentes pruebas.

Para el ejemplo, voy a intentar generar un número aleatorio. Hace unos meses necesitaba esto para un juego que estaba haciendo con IA Generativa y me encontré una desagradable sorpresa: los modelos dicen siempre los mismos números. Vamos a ver si con esta funcionalidad el resultado es distinto.

Sin code_execution:

model = genai.GenerativeModel(model_name='gemini-1.5-flash')
result = model.generate_content("Dime un número random")

Respuestas (4 ejecuciones):

42
42
42
42

Con code_execution:

model = genai.GenerativeModel(model_name='gemini-1.5-flash', tools="code_execution")
result = model.generate_content("Dime un número random")

Respuesta (1ª ejecución):

``` python
import random

number = random.randint(0, 100)
print(number)

```
```
73

```
El número aleatorio es 73. 

Respuesta (2ª ejecución):

``` python
import random

print(random.randint(0, 100))

```
```
26

```
He generado un número aleatorio entre 0 y 100. ¡El número es 26! 

Vemos que ahora el resultado sí es el esperado y, además del pez, ¡nos enseña a pescar!

¿Os imagináis el salto de calidad que va a dar la generación de código con estas ayudas? Después de Python ¿cuál será el próximo lenguaje? ¿Veremos entornos persistentes de desarrollo?

En resumen

Como hemos visto, los LLMs están llegando ya a un punto de madurez en la que no es tan importante lo potente del modelo (ya casi todos dan respuestas muy buenas) como las herramientas que lo rodean para aumentar sus capacidades en determinados casos de uso.

Espero que este post os despierte la curiosidad y empecéis ahora mismo a cacharrear con todos estos juguetes.

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete

Estamos comprometidos.

Tecnología, personas e impacto positivo.