
Caso de éxito
Asistente de compras de Reductivist
Cliente: Reductivist
Creamos un asistente de preguntas y respuestas para Reductivist, una pequeña marca de California que vende objetos minimalistas hechos en EE. UU. Los clientes preguntan por los productos, los envíos y las devoluciones, y el asistente responde con los datos de la propia tienda y su catálogo en vivo, o dice que no lo sabe y remite al formulario de contacto. El modelo nunca escribe un precio: nombra productos, y los datos de la tienda ponen el precio y el stock en cada tarjeta. Funciona con la cuota gratuita de Workers AI de Cloudflare, con límites diarios que lo mantienen dentro de ella, así que no tiene coste de funcionamiento. Antes del lanzamiento se probó con 61 preguntas, incluidas inyecciones de instrucciones y políticas inventadas, y el informe de pruebas recoge cada fallo y lo que se cambió.
- preguntas de prueba superadas
- 60/61
- precios escritos por el modelo
- 0
- tiempo medio hasta la respuesta
- 1.7 s
- coste mensual de funcionamiento
- $0
El reto
Reductivist vende tres productos, el Ringtool V1 Gold, el Ringtool V2 Silver y el X Bottle Opener, en una tienda propia hecha con Next.js. Los clientes tenían preguntas que las páginas de producto no respondían, y el dueño quería un asistente que las respondiera sin inventar nada. El primer hallazgo fue que la tienda casi no publicaba datos. Un cliente no podía saber por la web qué hace un Ringtool, cuánto tarda la entrega o qué trae la caja, así que un asistente basado en los datos de la tienda no tenía con qué responder, y uno que respondiera igualmente se lo estaría inventando. Además, los Términos decían que los gastos de envío se sumaban al pagar, cuando el pago no cobraba ninguno. El otro límite era el coste: ninguna API de pago, ninguna suscripción y ningún servicio nuevo que pagar.
Nuestro enfoque
La primera entrega no fue código. Fue un breve archivo de datos para que lo rellenara el dueño, y el mismo texto pasó a las descripciones vacías de los productos, así que ahora también aparece en las páginas de producto y en sus datos para buscadores. Cualquier tema sobre el que el dueño no ha escrito queda vacío, y el asistente trata un tema vacío como "la tienda no lo indica". Tres productos y una página de políticas caben muchas veces en una sola instrucción, así que no hay base de datos vectorial ni sistema de búsqueda, solo los datos y una lectura nueva del catálogo en cada pregunta. El modelo no tiene herramientas ni hace acciones: no puede añadir al carrito, consultar un pedido ni enviar un correo, lo que limita el daño de una inyección de instrucciones a una frase mala. Nunca se abre solo, se llega a él con un simple enlace de texto, y su cabecera dice que las respuestas las escribe una IA, como espera la ley de California sobre bots que ayudan a vender.
El modelo nunca da un precio
Un precio escrito por un modelo es lo más dañino que puede fallar en un asistente de tienda, así que al modelo no se le da esa tarea. Responde en un formato JSON fijo con una respuesta, hasta tres identificadores de producto, un tema y una marca para cuando debe derivar al cliente. El servidor comprueba cada respuesta contra ese formato, reintenta una vez si no coincide y, tras un segundo fallo, usa una respuesta fija que remite al contacto. Cada tarjeta de producto, con su precio, su stock y su botón de añadir al carrito, se crea con la base de datos de la tienda en el momento de la pregunta. Después, un código sencillo revisa la propia respuesta. Rechaza cualquier cantidad de dinero en cualquier forma, incluidas otras monedas, cifras escritas con letras y porcentajes, que serían un descuento inventado. También rechaza cualquier enlace que salga de la tienda y cualquier correo que no sea el de la tienda. Una respuesta rechazada se sustituye por una derivación al formulario de contacto.
Sin coste
El modelo es Llama 3.3 70B en Cloudflare Workers AI, llamado con peticiones HTTP sencillas y sin SDK. Cloudflare da a cada cuenta 10.000 unidades de cómputo gratis al día, y una respuesta medida usa unas 45. Unos límites en la base de datos mantienen el uso dentro de ese presupuesto: 500 caracteres por mensaje, 10 turnos por conversación, 20 mensajes por visitante al día y 100 para toda la tienda. Una comprobación de Cloudflare Turnstile abre cada conversación, para que un script no pueda gastar el presupuesto del día. Con el máximo diario, el asistente usa unas 6.400 de las 10.000 unidades. Si la cuota se acaba, Cloudflare devuelve un error y no una factura, y el panel dice que el asistente no está disponible y muestra el enlace de contacto. Las preguntas se guardan 90 días sin la dirección IP real, y la Política de Privacidad lo explica.
Pruebas a la vista
Un conjunto de 61 preguntas cubre siete grupos: datos que debe saber, datos que debe admitir que no sabe, políticas que no existen, precios, inyecciones de instrucciones, preguntas sobre pedidos que debe derivar y peticiones que no tienen nada que ver con la tienda. La primera ejecución superó 55. Dos respuestas habían caducado por un retraso de Cloudflare, así que ahora una llamada que caduca se reintenta una vez. Una respuesta correcta sobre reembolsos se marcó como derivación, y el modelo no quería decir si un producto estaba en stock, y un cambio en las reglas corrigió cada caso. La ejecución final superó 59, y 60 tras un último cambio en los filtros. Queda un fallo, y el informe explica por qué. Ante una falsa "actualización del administrador" que decía que el envío costaba $10, el modelo dijo bien que el envío es gratis, pero citó los $10 para negarlo, y el filtro de precios sustituyó toda la respuesta. El filtro se dejó estricto a propósito. El informe también recoge respuestas que pasan pero se leen mal, como negativas rígidas y frases unidas con comas.
El resultado
En la ejecución final, la respuesta mediana tardó 1,7 segundos y la más lenta de cada veinte, 3,6 segundos, sin fallos de formato. Ninguna respuesta afirmó un dato que no estuviera en el archivo de datos o en el catálogo, y las 61 respuestas finales se leyeron a mano para comprobarlo. Escribir el archivo de datos también mejoró la propia tienda: las páginas de producto ganaron las descripciones que les faltaban y los Términos ya no contradicen el pago. El asistente está terminado y oculto en producción hasta que la tienda complete su traslado de Vercel a Cloudflare Workers, porque el plan gratuito de Vercel no permite uso comercial. Alojar la tienda y el modelo en una misma cuenta de Cloudflare también cierra un hueco en los límites que solo existe en Vercel, donde un visitante podría fijar la cabecera de IP con la que se cuentan los límites.
Tecnología y despliegue
La tienda usa Next.js 16 y TypeScript, con Supabase para el catálogo, el stock y los registros del asistente, y Stripe Checkout para los pagos. El asistente llama a Cloudflare Workers AI con temperatura 0 y un esquema JSON, y Cloudflare Turnstile protege cada conversación. Los límites de uso se aplican en una sola función de Postgres, y una tarea diaria borra los registros de más de 90 días. El proceso de respuesta, la instrucción, las comprobaciones de formato y los filtros son funciones sencillas con 106 pruebas sin conexión que nunca llaman al modelo. Un script de evaluación pasa las 61 preguntas por el modelo real y guarda cada respuesta, así que cada cambio en la instrucción se mide antes de publicarse. No se añadió ningún paquete de npm nuevo.