Saltar al contenido
Chatbots de WhatsApp desde cero
Temario Ir al ejercicio →

IA como complemento, no como cerebro

  • ⏱ 60 minutos
  • 📶 Nivel: avanzado
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Decidir en qué partes del bot aporta la IA y en cuáles es un riesgo (precios, stock, pedidos).
  • Diseñar el esquema «reglas primero, IA de respaldo, persona como último recurso».
  • Pedir a una IA una respuesta estructurada y validarla con código antes de usarla.
  • Evitar alucinaciones comprobando todo contra el catálogo y rechazando precios inventados.
  • Estimar el costo por conversación y conocer las reglas de Meta sobre IA en WhatsApp.

⚠️ INFO REFERENCIAL: revisa los sitios oficiales

Los precios, planes, límites y tarifas de esta lección son solo una referencia (revisados en octubre de 2026) y cambian con frecuencia. Antes de decidir o cobrar a un cliente, confirma siempre en los sitios oficiales de cada proveedor (enlaces al final de la lección).

1.Qué puede hacer la IA por tu bot (y qué no)

Una IA generativa (un modelo de lenguaje como los que ofrecen varios proveedores) entiende texto libre mucho mejor que cualquier lista de palabras clave. Si un cliente escribe «algo rico para el desayuno de mis hijos», tu motor de reglas de la lección 6 no sabe qué hacer; un modelo de lenguaje entiende que se trata de pan, leche y quizá cereal.

Pero la misma flexibilidad la hace poco fiable donde se necesita exactitud. Un modelo de lenguaje produce texto plausible, no texto verdadero. Si le preguntas el precio del arroz y no se lo das, te contestará con seguridad una cifra inventada. Eso se llama alucinación, y en un negocio una alucinación es un precio equivocado dicho por tu tienda.

Por eso el principio de esta lección es:

La IA entiende. Tu código decide. Tus datos responden.

Tarea ¿IA? Por qué
Entender un mensaje ambiguo («tienen cosas para una parrilla?») Sí Es lo que mejor hace
Elegir la intención del cliente entre una lista cerrada Sí Salida acotada y validable
Redactar una respuesta amable a una pregunta frecuente con datos que tú le das Con cuidado Hay que validar que no invente
Decir un precio o disponibilidad No Debe salir del catálogo, siempre
Confirmar un pedido, descontar stock, cobrar No Operaciones exactas: reglas
Resolver una queja delicada No Debe verla una persona (lección 25)

El bot que construiste es de reglas: predecible, barato y fácil de probar. La IA no lo reemplaza: se suma a la frontera, donde el bot hoy dice «no te entendí».

2.La arquitectura: reglas primero, IA de respaldo

Cada mensaje pasa por tres capas, de la más barata y segura a la más cara e incierta:

Mensajedel cliente
→reglas
Motor de reglasmenús, texto, catálogo
→no entendió
IAclasifica la intención
→baja confianza
Personaatención humana
  1. Reglas. Si detectarIntencion o el buscador de productos entienden, responde el motor. No se gasta nada y el resultado es exacto.
  2. IA, solo si las reglas fallan. Se le pide clasificar el mensaje en una lista cerrada de intenciones, no escribir respuestas. Tu código valida lo que devuelve.
  3. Persona. Si la IA tampoco entiende o duda, el bot ofrece hablar con alguien.

Este orden tiene tres ventajas: ahorras costo (la mayoría de mensajes se resuelven con reglas), ganas seguridad (lo delicado nunca pasa por la IA) y mantienes el control (si el proveedor falla o cambia de precio, el bot sigue funcionando, solo que con menos comprensión).

Veamos qué haría tu bot de referencia hoy con mensajes reales. Se ejecutó detectarIntencion del repositorio:

Salida esperada
"hola" -> saludo []
"quiero hablar con una persona" -> humano []
"oye que tal esta el arroz hoy, no se cual llevar" -> desconocida [ 'arroz' ]
"algo para el desayuno de mis hijos" -> desconocida []
"tienen cosas para una parrilla?" -> desconocida []

Los dos primeros los resuelven las reglas. El tercero es interesante: la intención es desconocida pero el buscador sí encontró el producto arroz. Los dos últimos no tienen salida con reglas: ahí es donde la IA podría ayudar. Y cuando el bot de reglas no entiende, hoy responde con un mensaje de ayuda (menú y botones) sin perder la conversación.

3.Pedir una salida estructurada: clasificar en vez de conversar

Lo más seguro es no pedirle a la IA que redacte lo que le dirás al cliente, sino que clasifique y devuelva un JSON. Esa es la técnica de «salida estructurada». La instrucción (el prompt) sería algo como:

prompt-clasificador.txt
Eres un clasificador para el bot de Minimarket La Esquina.
Clasifica el mensaje del cliente en UNA de estas intenciones:
pedir_producto, consultar_horario, consultar_delivery, hablar_con_persona.
Si no encaja en ninguna, usa "desconocida".
Responde SOLO con un JSON: {"intencion": "...", "producto_id": "...", "confianza": 0.0 a 1.0}
No expliques nada. No inventes precios.
Mensaje: """{{mensaje}}"""

Notas importantes:

⚠️ Importante · Verifica este dato

Los modelos, los precios, los límites y los nombres de las funciones de cada proveedor cambian con frecuencia. En esta lección no se llamó a ningún proveedor: todo el código recibe el texto que devolvería la IA. Así aprendes la parte que no cambia (validar) y puedes enchufar el proveedor que elijas.

4.Nunca confíes en la salida: valídala

La respuesta de una IA es entrada no confiable, igual que un mensaje de un cliente. Puede venir con texto de más, con un bloque de código alrededor, con una intención que no pediste o con un producto que no existe. Hay cuatro defensas, y las cuatro son funciones puras de pocas líneas.

1. Extraer el JSON. Los modelos a veces envuelven su respuesta («Claro, aquí está: ``json ...») aunque les pidas lo contrario. En vez de confiar enJSON.parse(texto), corta desde la primera{hasta la última}` y atrapa el error:

ia-red-de-seguridad.js
function extraerJSON(texto) {
  const t = String(texto == null ? "" : texto);
  const a = t.indexOf("{");
  const b = t.lastIndexOf("}");
  if (a === -1 || b <= a) return null;
  try {
    const obj = JSON.parse(t.slice(a, b + 1));
    return obj && typeof obj === "object" ? obj : null;
  } catch (e) {
    return null;
  }
}

2. Aceptar solo lo permitido. La intención debe estar en la lista y la confianza debe superar un umbral. Todo lo demás es desconocida:

ia-red-de-seguridad.js
function validarClasificacion(obj, permitidas, umbral) {
  if (!obj || typeof obj !== "object") return "desconocida";
  if (!permitidas.includes(obj.intencion)) return "desconocida";
  if (typeof obj.confianza !== "number" || obj.confianza < umbral) return "desconocida";
  return obj.intencion;
}

3. Comprobar los datos contra tu catálogo. Si la IA devuelve un producto_id, vale solo si existe:

ia-red-de-seguridad.js
function productoDelCatalogo(id, productos) {
  if (typeof id !== "string") return null;
  return productos.find((p) => p.id === id) || null;
}

4. No dejar pasar cifras de dinero. Si por alguna razón dejas que la IA redacte un texto, rechaza cualquiera que mencione un precio:

ia-red-de-seguridad.js
function contienePrecio(texto) {
  return /s\/\s*\d|\d+([.,]\d+)?\s*soles/i.test(String(texto));
}

Probemos las cuatro con cinco mensajes del minimarket y una IA simulada que devuelve textos típicos, incluidos los errores. (Es una simulación a propósito: así el resultado es siempre el mismo y no cuesta nada.)

demo-ia.mjs
const P = ['pedir_producto', 'consultar_horario', 'consultar_delivery', 'hablar_con_persona'];
const iaFalsa = {
  'a que hora cierran hoy domingo?': '```json\n{"intencion":"consultar_horario","confianza":0.93}\n```',
  'algo para el desayuno de mis hijos': '{"intencion":"pedir_producto","producto_id":"caviar","confianza":0.88}',
  'quiero borrar todos los pedidos': '{"intencion":"borrar_pedidos","confianza":0.99}',
  'asdf': 'Lo siento, no entendí.',
  'cuanto cuesta el arroz': 'El arroz cuesta S/ 3.50 hoy.',
};
for (const m of Object.keys(iaFalsa)) {
  const reglas = detectarIntencion(m);            // del repositorio
  if (reglas !== 'desconocida') { console.log(JSON.stringify(m), '-> reglas:', reglas); continue; }
  const bruto = iaFalsa[m];
  const obj = extraerJSON(bruto);
  const int = validarClasificacion(obj, P, 0.7);
  let extra = '';
  if (obj && obj.producto_id) {
    const pr = productoDelCatalogo(obj.producto_id, PRODUCTOS);
    extra = ' producto:' + (pr ? pr.id : 'NO EXISTE');
  }
  console.log(JSON.stringify(m), '-> reglas: desconocida | IA:', int + extra, '| trae precio:', contienePrecio(bruto));
}
Salida esperada
"a que hora cierran hoy domingo?" -> reglas: horario
"algo para el desayuno de mis hijos" -> reglas: desconocida | IA: pedir_producto producto:NO EXISTE | trae precio: false
"quiero borrar todos los pedidos" -> reglas: desconocida | IA: desconocida | trae precio: false
"asdf" -> reglas: desconocida | IA: desconocida | trae precio: false
"cuanto cuesta el arroz" -> reglas: desconocida | IA: desconocida | trae precio: true

Lee cada línea con calma, porque cada una enseña algo:

  1. Horario: las reglas ya lo entienden. La IA ni se consulta: costo cero.
  2. Desayuno: la IA clasificó bien la intención (pedir_producto), pero el producto que propuso (caviar) no existe en el catálogo. Sin la comprobación 3, el bot habría mostrado un producto fantasma.
  3. Borrar pedidos: la IA devolvió una intención que no está en la lista. Aunque dijo «99 % seguro», se descarta. La confianza que declara un modelo no es una medida fiable de acierto: úsala como una señal más, nunca como garantía.
  4. asdf: la IA respondió texto sin JSON; extraerJSON devolvió null y todo cayó en desconocida. El bot ofrece hablar con una persona.
  5. Precio del arroz: las reglas no lo entendieron, y la IA contestó con un precio de memoria (S/ 3.50), pero el catálogo dice otra cosa. contienePrecio lo detecta y el texto se descarta.

Esa quinta línea merece su propio apartado.

5.La regla de oro: los precios salen del catálogo

El arroz de tu minimarket cuesta S/ 4.20. Si el cliente pregunta «cuánto cuesta el arroz» y la IA contesta «S/ 3.50», tu tienda acaba de decir un precio equivocado. Puede costarte plata (si lo honras) o la confianza del cliente (si no). Y la IA no tiene forma de saberlo: nunca vio tu catálogo, o lo vio hace un mes.

La solución es una división de trabajo estricta:

Con las funciones que ya tienes, la respuesta del precio sale así, sin pasar por la IA:

demo-precio.mjs
console.log(textoPrecio(PRODUCTOS.find((p) => p.id === 'arroz')));
Salida esperada
Arroz extra 1 kg cuesta S/ 4.20.

Mira también que el buscador de reglas ya había detectado arroz en el mensaje «oye que tal esta el arroz hoy...». En la mayoría de los casos, la IA no es necesaria para el precio: basta mejorar las reglas con un sinónimo (por ejemplo, tratar «cuánto cuesta» como intención de consulta de precio). Un buen uso de la IA es descubrir qué frases no entienden tus reglas y convertirlas en reglas nuevas con el tiempo. El bot mejora y la IA se usa cada vez menos.

⚠️ Importante · La misma regla vale para todo dato que cambia

Stock, horarios, zonas de delivery, costo de envío, promociones, direcciones, números de Yape. Todo eso vive en tus datos (NEGOCIO y PRODUCTOS en el código de referencia) y se inserta en el mensaje desde el código. Si quieres que la IA redacte una respuesta a una pregunta frecuente, pásale tú los datos en el prompt, pide que use solo esos datos y valida el resultado (¿contiene precios? ¿contiene datos que no le diste?). Y si dudas, no uses texto libre de la IA: usa un mensaje fijo.

6.Preguntas frecuentes (FAQ): el uso más seguro de texto generado

Si quieres que el bot responda «¿tienen estacionamiento?» o «¿aceptan tarjeta?» con naturalidad, hay un patrón seguro:

  1. Tienes una lista de respuestas oficiales escritas por ti («Sí, tenemos estacionamiento frente a la tienda»).
  2. La IA solo elige cuál corresponde a la pregunta (clasificación otra vez), o responde «ninguna».
  3. El bot envía tu texto, no el de la IA.

Es el mismo patrón: la IA es un buscador inteligente, no un autor. Para reformular con tono propio hay técnicas más avanzadas (que alimentan al modelo con tus documentos), pero cada capa extra añade riesgo, costo y mantenimiento. Para un negocio pequeño, el patrón de elegir entre respuestas oficiales cubre casi todo.

7.Costos: la IA se paga por uso

A diferencia de tus reglas, que cuestan cero por mensaje, la IA se cobra generalmente por tokens (trozos de texto: aproximadamente, una palabra corta es uno o dos tokens). Cada llamada tiene un costo de entrada (tu prompt más el mensaje del cliente) y uno de salida (la respuesta del modelo), y casi siempre se cotiza por millón de tokens. La salida suele costar más que la entrada.

La cuenta es simple, y la función costoEstimado del ejercicio la hace:

JavaScript
costo = llamadas * (tokensEntrada/1e6 * precioEntrada + tokensSalida/1e6 * precioSalida)

Con precios ficticios de ejemplo (0.50 por millón de entrada y 2.00 por millón de salida, en la moneda que cobre tu proveedor), mil clasificaciones de 400 tokens de entrada y 60 de salida cuestan:

Salida esperada
0.3200

Unos pocos centavos por mil mensajes. Con un clasificador corto y un modelo barato, el costo casi nunca es el problema. Los problemas reales son otros:

Pon un tope diario de llamadas a la IA en tu Worker: si un día algo sale mal (un bucle, un ataque), el costo queda acotado. Y registra cuántas veces se usó la IA y cuántas veces su respuesta fue descartada: esas dos cifras te dicen si vale la pena. (La lección 21 trata las métricas en general.)

⚠️ Importante · Verifica este dato

Los precios por token y los límites de cada modelo cambian a menudo; consulta la página de precios de tu proveedor el día que cotices y anota la fecha. Un tope diario y alertas de gasto en el panel del proveedor son una protección básica.

8.Latencia, fallos y privacidad

Tres asuntos prácticos antes de ponerlo en producción:

9.Lo que dice Meta sobre IA en WhatsApp

Una advertencia de contexto: Meta actualizó en octubre de 2025 los términos de la plataforma de negocio de WhatsApp para prohibir que proveedores de IA distribuyan asistentes de propósito general (un «ChatGPT dentro de WhatsApp») por la API, con efecto desde el 15 de enero de 2026. La regla, según la prensa que cubrió el cambio, no afecta a negocios que usan IA para atender a sus clientes (por ejemplo, un bot de pedidos o de soporte), que es justamente el uso de este curso. Según esos mismos reportes, el criterio es que la IA sea la funcionalidad principal del servicio y no una parte accesoria (como un bot de pedidos que usa un modelo para entender mensajes), y los términos también prohíben usar datos de la plataforma, aun anonimizados, para entrenar otros modelos de IA. Aun así, Meta se reserva la decisión sobre qué es función «principal» y qué es «accesoria».

⚠️ Importante · Verifica este dato

Esto proviene de reportes de prensa (por ejemplo, TechCrunch), no de una página de documentación de Meta que se haya podido consultar. Lee los términos vigentes de la política comercial de WhatsApp y asegúrate de que tu bot es un bot de negocio (pedidos, citas, soporte, información), no un asistente de uso general.

Sé transparente con el cliente: tu saludo ya dice «Soy el asistente virtual». Mantén esa claridad, con o sin IA. Para probar la red de seguridad (que nada fuera de la lista, ningún id inexistente y ningún texto con precio llegue al cliente) sigue las ideas de la lección 23.

10.Errores frecuentes

11.Apuntes para llevar

12.Glosario

Término Significado
IA generativa Modelo que produce texto a partir de una instrucción, con respuestas plausibles pero no siempre verdaderas.
Alucinación Respuesta de una IA que suena segura pero es falsa o inventada.
Token Fragmento de texto (parte de una palabra) con el que los modelos miden y cobran el uso.
Prompt Instrucción y datos que le envías al modelo.
Salida estructurada Pedir al modelo una respuesta en un formato fijo, como un JSON con campos concretos.
Prompt injection Ataque en el que un texto del usuario intenta cambiar las instrucciones del modelo.
Clasificación de intención Tarea de elegir, entre una lista cerrada, qué quiere hacer el cliente.
Umbral de confianza Valor mínimo que debe declarar el modelo para que se acepte su clasificación.

🧠 Comprueba lo aprendido

Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.

¿Qué parte del bot NO debe delegarse a la IA?

¿Cuál es el orden recomendado de capas para cada mensaje?

Un modelo devuelve {"intencion":"borrar_pedidos","confianza":0.99}. ¿Qué haces?

¿Por qué conviene usar extraerJSON en vez de JSON.parse(texto) directo?

El modelo propone producto_id: "caviar", pero ese producto no está en tu catálogo. ¿Qué haces?

¿Cómo se calcula aproximadamente el costo de usar una IA?

📚 Para profundizar (fuentes oficiales)

Este material lo hace un estudiante con ayuda de IA: ante cualquier duda, manda la documentación oficial.

Tu progreso se guarda en este navegador y se refleja en el índice del curso.

💡 🚀 ¡Ahora te toca!

La práctica fija lo aprendido. Pasa al ejercicio de esta lección.

Ir al ejercicio