Teníamos una escuela de cocina online con 1.404 recetas, menús semanales y miembros activos cocinando cada día. El problema no era falta de contenido: era que el usuario tenía el menú delante y no siempre sabía cómo ejecutarlo. Ahí decidimos integrar IA en la plataforma web, pero con una premisa clara desde el principio: la IA tenía que vivir dentro del flujo del usuario, no ser una herramienta aparte a la que vas cuando te acuerdas.
No lo hicimos porque la IA estuviera de moda. Lo hicimos porque había un hueco real entre tener la receta y saber cocinarla, y un asistente con el contexto adecuado lo tapaba mejor que cualquier FAQ o vídeo. Este artículo es qué construimos, las decisiones que tomamos y lo que aprendimos por el camino.
El asistente de cocina conversacional
El usuario abre su menú de la semana y tiene delante las recetas, los totales nutricionales y la guía de batch cooking. Lo que le falta no es información, es alguien a quien preguntarle «¿esto lo puedo doblar para cuatro?» o «¿qué hago si no tengo el ingrediente X?». Ese es el hueco que llena el asistente.
La pieza que lo hace funcionar es el contexto. Cuando el usuario abre el chat desde un menú, no arranca una conversación en blanco: le inyectamos automáticamente el contexto de ese menú —las recetas, los totales nutricionales, la guía de batch— sin que el usuario tenga que explicarle nada al modelo. Pregunta «¿cuánto tardo en hacer esto?» y el asistente ya sabe qué es «esto». Sin ese contexto, el modelo es un cocinero genérico de internet; con él, es el asistente de tu menú concreto.
El historial persiste por menú, así que la conversación de esta semana no se mezcla con la de la anterior. Y las respuestas se adaptan al programa del usuario: no es lo mismo aconsejar a alguien en un plan hipocalórico que a alguien en uno terapéutico. El mismo asistente, distinto criterio según quién pregunta.
El perfil silencioso del usuario
Nadie rellena formularios de onboarding. Lo sabes, yo lo sé, y nuestros usuarios también: si les pones diez campos para «personalizar tu experiencia», los abandonan. Así que decidimos no pedir el perfil. Que se construyera solo.
El asistente aprende mientras conversa. Si el usuario menciona que cocina para cuatro, que es intolerante a algo o que no tiene mucha mano en la cocina, eso se guarda en su perfil sin que rellene nada. La personalización crece con cada conversación, sin fricción y sin un formulario de por medio.
¿Cómo? Con lo que internamente llamamos marcadores ocultos. Es el patrón del que más he aprendido en este proyecto, así que vale la pena explicarlo de verdad.
En el system prompt le decimos al modelo que, cuando detecte cierta información, añada un marcador especial al final de su respuesta, con un formato exacto. El usuario nunca lo ve. La respuesta que llega al backend es algo así:
Claro, para 4 comensales puedes doblar las cantidades del guiso.
Recuerda que con legumbres suele quedar mejor reposado.
PERFIL_UPDATE:{"comensales": 4}
El backend, en PHP, hace tres cosas: busca el marcador, extrae el JSON y lo fusiona con el perfil existente en la base de datos, y devuelve al frontend solo el texto limpio, sin el marcador. El usuario lee una respuesta de cocina normal; el sistema, en paralelo, ha aprendido que cocina para cuatro.
Lo interesante de este patrón es que no usa function calling ni tool use de la API. El modelo habla en texto plano y nosotros parseamos ese texto. Y es el modelo quien decide cuándo activarlo: no hay lógica de triggers en el cliente buscando palabras clave. Si el usuario menciona algo relevante, el modelo lo detecta solo, porque el system prompt se lo enseñó. La conversación es asimétrica: el usuario ve charla natural, el servidor ve charla más comandos estructurados.
Tiene un riesgo real, y lo aprendimos a base de verlo: el modelo puede alucinar el marcador en el momento equivocado, o formatearlo mal y romperte el parse. La defensa es ser obsesivamente explícito en el system prompt sobre el formato exacto y sobre cuándo usarlo. Cada ambigüedad que dejas, el modelo la rellena a su manera.
Generación de contenido para producción
El asistente conversacional es la cara visible de la IA, pero buena parte del trabajo del modelo no se ve. Lo usamos también para generar contenido estructurado que alimenta la producción de la plataforma.
El generador de menús semanales es interno: el modelo arma propuestas de menú que luego se revisan, no algo que el usuario toque directamente. La guía de batch cooking se genera convirtiendo un menú en instrucciones de cocinado eficiente —qué preparar a la vez, qué adelantar—. Y la guía interactiva de receta es un paso a paso que se monta dinámicamente en lugar de estar escrito a mano para cada una de las 1.404 recetas.
De ahí salen también los PDFs. Generamos un HTML en el servidor, partiendo del mismo menú, con el contenido que aporta el modelo, y ese HTML es el que se imprime. El reto no fue la IA en sí, sino el puente: montar un HTML limpio y listo para impresión a partir del menú y de lo que devuelve el modelo, de forma que el documento final salga consistente cada vez. La IA pone el contenido; la estructura del PDF la pone el HTML que controlamos nosotros.
Reconocimiento de imágenes: hacia dónde vamos
Esta parte todavía no está cerrada, pero la dirección está clara y la cuento porque es de lo más prometedor que tenemos entre manos.
La idea: el usuario fotografía su nevera o la etiqueta de un producto, el modelo identifica los ingredientes, y el sistema busca en nuestra base recetas compatibles con lo que hay. Es el puente entre la visión artificial y nuestra propia base de datos de recetas, que es justo lo que un modelo genérico no puede hacer solo.
El patrón previsto reutiliza los marcadores ocultos. Si el modelo identifica ingredientes concretos en la foto, añade un marcador tipo BUSCAR: ingrediente1, ingrediente2 en su respuesta. El backend lo intercepta, lanza la búsqueda en la base de recetas, y devuelve al frontend el texto del modelo más tarjetas de receta generadas por el servidor, como si el asistente las hubiera traído él mismo. El usuario vive una experiencia fluida; por debajo, es el mismo truco de antes aplicado a visión.
Está a medias. Pero el hecho de que encaje en un patrón que ya teníamos funcionando es la mejor señal de que la arquitectura iba bien encaminada.
Lo que aprendimos
El contexto lo es todo. Un modelo sin el contexto nutricional y de menú no sirve para nada en este dominio: te da consejos de cocina genéricos que el usuario ya encuentra en Google. Todo el valor está en lo que le inyectamos antes de que responda. La IA no fue la parte difícil; decidir qué contexto darle y cuándo, sí.
Los marcadores ocultos resultaron ser un patrón más general de lo que pensábamos: una forma de que el modelo le hable al sistema sin que el usuario se entere, en texto plano y sin atarte al tool use de un proveedor concreto. Eso último importa más de lo que parece: como el modelo solo produce texto, mañana podemos cambiar de modelo o mezclar varios sin reescribir el mecanismo. De hecho, el chat de atención al cliente que tenemos en el horizonte va a usar otro modelo distinto, y el patrón sigue valiendo igual.
Y la lección que más me costó interiorizar: la IA no reemplaza la estructura de datos. Sin las 1.404 recetas bien modeladas, sin la base de ingredientes, sin los menús estructurados, nada de esto funciona. El modelo es el que conversa y el que redacta, pero lo que tiene valor de verdad es la base de datos que hay debajo. La IA la hace accesible; no la sustituye.
Dónde estamos y qué viene
Empezamos con una plataforma llena de contenido que el usuario no siempre sabía aprovechar. Ahora tiene un asistente que conoce su menú, un perfil que se construye solo mientras cocina, y contenido generado a medida para cada semana.
Lo que viene: afinar cómo captamos los datos del usuario para que el perfil sea aún más preciso, cerrar el reconocimiento de imágenes, y montar el chat de atención al cliente. También queremos mejorar el sistema de comentarios. Ninguna de esas piezas es un salto al vacío: todas se apoyan en lo que ya construimos, que era exactamente la idea —una base sobre la que seguir sumando, no una demo que impresiona y luego no escala.