Montar un chatbot es la parte fácil: son unas cuantas líneas y una clave. Lo difícil —y lo que decide si te ayuda o te mete en un problema— es de qué habla, de qué no y quién responde de lo que diga. Esta lección va sobre todo de eso.
- Diagnosticar. Ni con rodeos: «eso suena a…» es un diagnóstico escrito.
- Recomendar un medicamento de prescripción, ni comparar uno con otro para el público.
- Sustituir una derivación. Si la respuesta correcta es «vaya al médico», tiene que decirlo y parar ahí.
Entonces, ¿para qué sirve?
Para lo que preguntan veinte veces al día y no es clínico. Que es muchísimo más de lo que parece:
| Sí | No |
|---|---|
| Horario, guardias, dónde aparcar | «¿Qué me tomo para esto?» |
| Qué hace falta para una receta electrónica | «¿Me cambio el ibuprofeno por…?» |
| Si tenéis un producto y si hay que encargarlo | «¿Esto es grave?» |
| Cómo se pide cita para un servicio | Interpretar una analítica |
| Llevar a la persona a la herramienta o al mostrador | Decir una dosis |
Y hay que decir tres cosas, siempre visibles
- Que es un bot. No por trámite: quien cree que habla con el farmacéutico se fía de otra manera, y esa confianza no te la ha dado nadie.
- Que no sustituye al consejo farmacéutico, en la primera pantalla y no en un pie de página.
- Que la conversación viaja a un tercero. Lo que se escribe ahí sale de tu farmacia y llega al proveedor del modelo. Eso es tratamiento de datos y hay que contarlo — y es la razón por la que el bot nunca debe pedir el nombre, el DNI ni el tratamiento de nadie.
La arquitectura, en una línea
navegador → tu servidor → el modelo
En Vercel esa pieza es una función de servidor: un fichero en api/ que
recibe la pregunta, le añade tus instrucciones, llama al modelo con la clave que vive
en las variables de entorno, y devuelve la respuesta. Son unas cuarenta líneas.
Las cinco piezas del que funciona
-
El prompt de sistema: qué es y qué NO contesta
Es el texto fijo que va delante de cada pregunta. Lo que de verdad lo hace seguro no es decirle lo que sabe: es decirle qué hace cuando le preguntan lo que no le toca.
Eres el asistente de [Farmacia X]. Contestas SÓLO sobre: horario y guardias, servicios, si tenemos un producto, y cómo pedir cita. Si te preguntan cualquier cosa clínica —síntomas, qué tomar, dosis, si un medicamento va bien para algo, interpretar una analítica— NO contestes. Di exactamente: «Eso lo vemos en el mostrador o por teléfono en el [teléfono].» No digas nunca una dosis. No recomiendes ningún medicamento. No des una opinión sobre lo que puede tener alguien. Si no sabes algo de la farmacia, dilo y da el teléfono.Esa frase de salida —la que dice qué contestar cuando no toca— es la línea más importante del fichero. Sin ella, el modelo improvisa una respuesta amable… y clínica.
-
Un tope de gasto, desde el primer día
No porque vaya a ser caro: porque no lo controlas tú. Un enlace compartido en un grupo, o alguien probando, y la factura se dispara en una tarde.
Tres frenos, y los tres son sencillos:
- Límite por persona (por IP o por sesión): tantas preguntas por hora.
- Límite diario global. Alcanzado el tope, el bot dice que vuelvan mañana. Es mejor que una factura.
- Respuestas cortas. El coste está en lo que escribe, no en lo que lee.
-
Caché para lo que se repite
«¿A qué hora abrís?» es la misma pregunta siempre. Guardar la respuesta y devolverla sin llamar al modelo quita de golpe la mayor parte del gasto de un bot de farmacia, porque casi todo lo que le preguntan se repite.
Y guarda también el fallo, con ventana corta. Escribir en caché sólo cuando hay éxito es lo que convierte un mal día en una llamada por visita: si el modelo falla y no guardas nada, cada visita vuelve a intentarlo y te comes la cuota entera. Aquí pasó — 166 llamadas y cero filas en la caché. -
Guarda la pregunta Y la respuesta
Casi todos los que montan un bot guardan la pregunta y el coste. Y así puedes saber cuánto gastas y de qué te preguntan, pero no si contesta bien — que es lo único que decide si lo dejas puesto.
Aquí se guardaba el texto desde el principio y no se enseñaba en ningún sitio. Guardarlo y no mirarlo es casi lo mismo que no guardarlo.
-
Léelo el primer mes, entero
Cincuenta conversaciones de verdad enseñan más sobre tu farmacia que cualquier análisis: verás preguntas que no esperabas —y que probablemente deberían estar contestadas en la web— y verás dónde tu prompt se queda corto.
Es también donde vas a descubrir si alguien ha intentado que dé un consejo clínico y qué hizo el bot. Esa comprobación no la puede hacer nadie más.
Un aviso sobre la respuesta vacía
Aquí eso dejó a un modelo figurando con 91 llamadas y cero fallos sin haber producido una sola frase. Un fallo que se registra como éxito no se arregla nunca, porque nadie lo busca. Comprueba que hay texto, no que no hubo error.
Por dónde pasa un mensaje, y por qué el orden importa
El prompt de sistema, línea a línea
El prompt de sistema es el texto fijo que va delante de todas las conversaciones. Es donde se decide de qué habla el bot, de qué no, y qué hace cuando no sabe. En una farmacia, la mitad del trabajo está en las prohibiciones, no en las capacidades.
Eres el asistente de la Farmacia [NOMBRE], en [CIUDAD].
# Lo que SI haces
- Horario, direccion, telefono y como llegar.
- Si tenemos un producto de parafarmacia y a que precio.
- Explicar servicios: SPD, control de tension, cita para atencion
farmaceutica.
- Como funciona la receta electronica en terminos generales.
# Lo que NO haces NUNCA
- No das consejo sanitario personalizado, no valoras sintomas y no
sugieres que tomar. Si te lo piden, derivas: "eso lo vemos en el
mostrador con un farmaceutico, o llama al [TELEFONO]".
- No hablas de medicamentos con receta, ni de dosis, ni de si algo se
puede tomar con otra cosa.
- No reservas, no cobras y no confirmas stock de medicamentos.
- No pides ni aceptas datos de salud. Si alguien los escribe, no los
repites y le dices que no los escriba aqui.
# Como contestas
- Corto: dos o tres frases.
- En el idioma en que te escriban.
- Si no lo sabes, lo dices y das el telefono. NO te lo inventas.
- Al final de cualquier tema de salud: "esto no sustituye al consejo de
tu farmaceutico".Los topes: tres capas, y las tres hacen falta
Un chatbot público es una API abierta a internet que cuesta dinero por llamada. Sin topes, una sola persona con un script te gasta la cuota de un mes en una tarde — y no hace falta mala intención: basta un bucle mal escrito.
| Capa | Qué limita | De qué te protege |
|---|---|---|
| Por mensaje | Largo del texto de entrada y de la respuesta | De que alguien pegue un libro entero, que se paga por tokens |
| Por sesión | Mensajes por conversación y por minuto | Del script en bucle, que es el caso realista |
| Por día | Un contador global de tu web | Del día raro. Es el único tope que garantiza que la factura no se dispara |
const MAX_ENTRADA = 800; // caracteres
const MAX_POR_SESION = 20; // mensajes
const MAX_POR_DIA = 400; // llamadas al modelo, en toda la web
if (mensaje.length > MAX_ENTRADA) {
return respuesta('Hazme la pregunta mas corta, por favor.');
}
if (await mensajesDeEstaSesion(sesionId) >= MAX_POR_SESION) {
return respuesta('Hemos hablado bastante por hoy. Llamanos al [TELEFONO].');
}
if (await llamadasDeHoy() >= MAX_POR_DIA) {
// ⚠️ NO es un error: es una respuesta util. Y te avisa a ti.
await avisarAlAdmin('Tope diario del chatbot alcanzado');
return respuesta('Ahora mismo no puedo atenderte. Llamanos al [TELEFONO].');
}La caché: la diferencia entre unos céntimos y una factura
Las preguntas que le hacen a un bot de farmacia se repiten muchísimo: horario, si abrís en festivo, si tenéis algo, dónde aparcar. Cada una de esas, sin caché, es una llamada pagada al modelo. Con caché, la segunda y todas las siguientes son gratis e instantáneas.
function clave(texto) {
return texto
.toLowerCase()
.normalize('NFD').replace(/[\u0300-\u036f]/g, '') // quita tildes
.replace(/[^a-z0-9 ]/g, ' ') // y signos
.replace(/\s+/g, ' ').trim();
}
// "¿A que hora abris?" y "a que hora abris" son la MISMA clave.
const k = clave(mensaje);
const guardada = await cache.get(k);
if (guardada) return respuesta(guardada, { desde_cache: true });
const texto = await llamarAlModelo(mensaje);
await cache.set(k, texto, { horas: 24 });
return respuesta(texto);Qué se guarda de cada conversación
| Se guarda | Para qué |
|---|---|
| La pregunta y la respuesta | Es lo único que dice si el bot contesta bien. Sin la respuesta guardada, el panel sólo cuenta llamadas |
| Si vino de caché | Para saber si la caché sirve de algo |
| Modelo, tokens y milisegundos | Coste y velocidad, que es lo que se mira cada semana |
| Un identificador de sesión | Para leer la conversación entera, no frases sueltas |
| La IP o el correo | No. No hace falta para nada de lo anterior |
Las preguntas rápidas: el detalle que decide si se usa
Un chat que se abre vacío con un cursor parpadeando no se usa: nadie sabe qué preguntarle. Tres o cuatro botones con las preguntas reales cambian el uso por completo — y además te protegen, porque encauzan hacia lo que el bot sí sabe contestar.
| Buena | Mala |
|---|---|
| «¿Qué horario tenéis hoy?» | «Hazme una pregunta» |
| «¿Hacéis SPD?» | «¿En qué puedo ayudarte?» |
| «¿Dónde aparco?» | «Consúltame lo que quieras» |
Los cuatro números que dicen si sirve
| Número | Qué te dice |
|---|---|
| Conversaciones que pasan de un mensaje | Si la primera respuesta valió. Una conversación de un mensaje es alguien que se fue |
| % servido desde caché | Cuánto te está ahorrando. Si es bajo, es que cada uno pregunta distinto — interesante en sí mismo |
| Veces que ha dicho «no lo sé» | Es la lista de lo que hay que añadir al prompt, servida en bandeja |
| Veces que ha derivado al mostrador | Que el bot haga esto es un ÉXITO, no un fallo. Es su trabajo |
Antes de publicarlo
- La clave vive en el servidor y no aparece en el código fuente de la página.
- El prompt dice qué contestar cuando le preguntan algo clínico, con la frase escrita.
- Hay tope por persona y tope diario.
- Dice que es un bot, que no sustituye al consejo y que la conversación va a un tercero.
- Guardo pregunta y respuesta, y me he comprometido a leerlas el primer mes.
- He intentado yo mismo que dé un consejo clínico, y he visto qué contesta.
← Anterior: Analytics y Search Console Siguiente: una app con AI Studio →