Recetas a la compra y precios reales de Mercadona y Dia
El asistente del hub ya convierte una receta en la lista de la compra y pregunta en qué comida del menú va, y el comparador de precios usa datos reales de Mercadona y Dia. Cómo lo hicimos con un modelo pequeño y qué tuvimos que corregir.
Dos novedades en el hub. La primera: le dices al asistente «quiero hacer lasaña, añade los ingredientes» y los pone en la lista de la compra; después te pregunta en qué comida del menú la quieres y la apunta allí con sus ingredientes. La segunda: el botón «Comparar precios» de la lista ya no da estimaciones, sino los precios que tienen en ese momento las tiendas online de Mercadona y Dia. Las dos funcionan con el mismo modelo de lenguaje pequeño que se ejecuta en un ordenador de casa, y las dos nos enseñaron algo sobre cómo trabajar con él.
De la receta a la lista y al menú
La idea es sencilla: el modelo sabe qué lleva una lasaña. Le dimos una herramienta nueva que recibe el nombre del plato y la lista de ingredientes con sus cantidades (para unas cuatro raciones, sin agua, sal ni pimienta, que suelen estar en casa) y los añade a la lista sin duplicar lo que ya estaba apuntado. Si no le has dicho para cuándo es, la herramienta le devuelve los huecos libres del menú de esta semana y le indica que te pregunte. Contestas «el viernes en la cena» y queda apuntado.
Si lo dices todo de golpe («el sábado para comer quiero hacer paella, mete lo que hace falta en la lista»), hace las dos cosas en un solo paso.
Lo que no funcionó: tocar las instrucciones
Lo primero que probamos fue añadir una regla a las instrucciones del asistente explicándole cómo tratar las recetas. Medido con nuestra batería de frases (la misma que contamos en un asistente con IA que funciona en casa, ampliada a 111 intentos), el resultado fue malo: las confirmaciones inventadas, cuando el modelo dice «he añadido la leche» sin haber hecho nada, pasaron de 1 o 2 a 16 o 17. Y no solo en las recetas: empeoraba con frases que no tenían nada que ver, como «añade galletas a la lista». Bastaba con cambiar una línea de las instrucciones para desordenarlo.
Así que dejamos las instrucciones como estaban y pusimos todo en la descripción de la herramienta y en lo que esta responde. Con eso, las frases de recetas salieron bien en 23 de 24 intentos, y el resto de frases volvió a dar el mismo resultado que antes del cambio.
El historial solo guarda texto
Al probar la conversación completa en dos mensajes apareció otro problema. El chat recuerda lo que tú escribes y lo que el asistente contesta, pero no los datos internos que le devolvieron las herramientas. En el segundo mensaje («el viernes en la cena») el modelo ya no veía la lista de ingredientes, y el plato quedaba en el menú sin ellos.
La solución fue no depender del modelo: el servicio de herramientas recuerda durante dos horas la última receta de cada persona, y si después se apunta en el menú ese mismo plato sin ingredientes, los recupera él solo. En las pruebas, los ingredientes llegaron al menú en todos los intentos.
Actualización (1 de octubre, por la tarde): faltaba el orden contrario. Si primero decías «el sábado comemos paella» y después «añade los ingredientes», iban a la compra pero el plato del menú se quedaba sin ellos. Ahora la herramienta busca el plato en el menú de las próximas dos semanas (el tuyo y el de tus grupos) y, si está, le pone los ingredientes sin preguntar, sumándolos a los que ya tuviera. Al probarlo con el modelo aparecieron dos tropiezos más, resueltos también en el código y no en las instrucciones: a veces llamaba a la herramienta sin ingredientes y acababa preguntándotelos, y a veces escribía «mañana» donde iba una fecha y se quedaba reintentando. En las pruebas, los dos órdenes funcionaron en 8 de 8 conversaciones.
Una red de seguridad contra el «ya está hecho»
Quedaba lo más grave. Al contestar a la pregunta del asistente, en uno de cada cinco intentos el modelo respondía «he planificado la lasaña para el viernes» sin haber llamado a ninguna herramienta. Probablemente porque su mensaje anterior ya decía «he añadido los ingredientes» y repetía el patrón.
Añadimos una comprobación en el propio asistente, que vale para todo el chat y no solo para las recetas: mientras no se haya ejecutado ninguna acción, la respuesta se retiene hasta el final. Si dice que ha hecho algo («he añadido», «he puesto», «hecho», «listo») sin haber hecho nada, no se te muestra; se le avisa de que no ha guardado nada y se le pide que lo haga. Si vuelve a pasar, el asistente reconoce que no lo ha guardado y te pide que lo repitas. Después de este cambio, en 16 conversaciones de prueba no se coló ninguna confirmación falsa.
Lo que sigue fallando a veces es convertir «el viernes» en la fecha correcta: es un punto débil conocido de los modelos pequeños. Para que se note si ocurre, la respuesta del menú incluye ahora el día real en que se ha guardado el plato.
Precios reales en lugar de estimaciones
El comparador de precios funcionaba hasta ahora con un servicio de inteligencia artificial externo, de pago, que buscaba en la web el precio aproximado de cada producto en cinco supermercados. El resultado era una estimación, con el aviso de que podía no estar al día. Queríamos que lo hiciera nuestro modelo, pero un modelo no sabe precios: si le preguntas cuánto cuesta la leche en Mercadona, contestará una cifra verosímil e inventada.
La solución fue repartir el trabajo. Los precios salen de las tiendas, y el modelo solo hace lo que se le da bien: entender qué quieres decir.
De dónde salen los datos
Antes de escribir código comprobamos qué supermercados publican sus precios de una forma que se pueda consultar desde un servidor:
| Supermercado | Resultado |
|---|---|
| Mercadona | Sí: el buscador de su tienda online devuelve nombre, formato, precio y precio por kilo o litro |
| Dia | Sí: su buscador da precio, precio por unidad de medida y si está en oferta |
| Lidl | No: su tienda online casi no vende alimentación (buscando «leche» salían un enjuague bucal y una ensaladilla) |
| Carrefour y Alcampo | No: bloquean las consultas automáticas |
| Eroski | Solo leyendo la página web, que se rompería con cualquier cambio de diseño |
Nos quedamos con Mercadona y Dia. Mercadona tiene precios distintos según el almacén que sirve cada zona, así que usamos el de la nuestra.
El modelo elige, no inventa
Para cada producto de la lista, el hub hace la búsqueda en las dos tiendas y le enseña al modelo hasta ocho resultados reales de cada una. El modelo solo contesta con el número del que corresponde a lo apuntado. Parece poca cosa, pero es justo lo difícil:
| Apuntado | Primer resultado de la tienda | Lo que elige el modelo |
|---|---|---|
| leche | Pack de 6 briks | Un brik de 1 L |
| tomates | Tomate frito, pack de 3 | Tomates pera |
| huevos | Paquete de 24 | Docena |
| pechuga de pollo | Pechugas enteras congeladas | Filetes de pechuga en bandeja |
Con una regla automática (quedarse con el primer resultado que contiene las palabras) la lista de prueba de 15 productos salía bastante más cara de lo real, porque se colaban packs y formatos grandes. Con el modelo, los productos de las dos tiendas quedan en formatos parecidos y la comparación tiene sentido.
Aun así, una bandeja de 500 gramos y otra de 900 no se comparan por lo que cuestan. Por eso el hub muestra el precio por kilo o por litro, y cuando los dos productos se miden igual decide cuál es más barato por ese precio, no por el del paquete.
Si el ordenador está apagado
El modelo vive en un ordenador que no siempre está encendido. En ese caso el comparador no se queda sin servicio: elige con la regla automática, algo más torpe, y lo indica. Los resultados de cada búsqueda se guardan unas horas para no repetir consultas a las tiendas.
Qué ganamos
- Precios de verdad, del momento, con enlace a la ficha del producto en cada tienda.
- Ningún servicio de IA externo. Las dos funciones usan el modelo de casa. A las tiendas solo les llega el nombre del producto buscado, desde nuestro servidor, nunca datos de quien lo busca. Lo hemos reflejado en la política de privacidad.
- Sin coste por consulta. El servicio anterior se pagaba por uso.
Y una cosa que no ganamos: estas búsquedas no son una interfaz oficial de las tiendas. Si cambian su web, habrá que ajustar el hub, y mientras tanto el comparador dirá que no ha encontrado los productos.
Lo que nos llevamos
- Con un modelo pequeño, las instrucciones generales son frágiles: una línea más puede empeorar cosas que no tienen relación. Lo específico funciona mejor dentro de cada herramienta.
- Lo que se puede resolver con código no hay que pedírselo al modelo: recordar los ingredientes o calcular el precio por kilo.
- Un modelo de lenguaje es bueno eligiendo entre opciones reales y malo recordando datos. Darle los datos y pedirle que elija cambia el resultado por completo.
Cómo se usa todo esto está en las páginas de la lista de la compra, el menú semanal y el asistente.