Saltar al contenido
Chatbots de WhatsApp desde cero
Temario

Ejercicio: IA como complemento, no como cerebro

  • ⏱ 50 minutos
  • 📶 Nivel: avanzado

Objetivo

Construir la red de seguridad que rodea a una IA en el bot del minimarket: extraer su respuesta, validarla, no dejarla inventar productos ni precios, decidir cuándo usarla y estimar su costo. Todo sin llamar a ningún proveedor: las funciones trabajan con el texto que devolvería la IA, así que las pruebas son gratis y repetibles.

Cómo se trabaja

La parte A es una investigación y una práctica con el proveedor que prefieras (opcional: necesita cuenta y a veces tarjeta). La parte B son seis funciones de JavaScript puro que se comprueban en esta página. Imagina que la IA recibió el mensaje del cliente y se le pidió responder solo con un JSON como este: {"intencion": "pedir_producto", "producto_id": "arroz", "confianza": 0.9}.

Las intenciones permitidas son pedir_producto, consultar_horario, consultar_delivery y hablar_con_persona. Cualquier otra cosa debe tratarse como desconocida.

💡 Reto extra

Escribe decidirCamino(intencionReglas, claseIA): si las reglas ya entendieron (intencionReglas distinta de "desconocida") devuelve "reglas" sin consultar a la IA; si no, devuelve "ia" cuando la clasificación sea válida y "humano" cuando también la IA dé "desconocida". Esa función es el corazón del diseño «reglas primero, IA de respaldo».

▶ Prueba tu código aquí (opcional)
Consola

Pasos

Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.

💡 Pista 1: Primer objeto JSON

Busca la primera { y la última } con indexOf y lastIndexOf, corta ese fragmento y pásalo por JSON.parse dentro de un try/catch. Así funciona aunque haya texto o un bloque de código alrededor.

💡 Pista 2: Detectar precios

Una expresión regular como /s\/\s*\d|\d+([.,]\d+)?\s*soles/i cubre S/ 5, S/5.50 y 5 soles. Cuidado con el \ de S/ dentro de la expresión.

💡 Pista 3: Costo por millón de tokens

Si un precio es «por millón de tokens», el costo es tokens / 1000000 * precio. Suma entrada y salida, y multiplica por las llamadas.

🔎 Comprueba tu trabajo

Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista. Pega solo el JavaScript, sin las etiquetas <script>.

    ✅ Ver una solución posible

    Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.

    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;
      }
    }
    
    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;
    }
    
    function productoDelCatalogo(id, productos) {
      if (typeof id !== "string") return null;
      return productos.find((p) => p.id === id) || null;
    }
    
    function textoPrecio(producto) {
      return producto.nombre + " cuesta S/ " + producto.precio.toFixed(2) + ".";
    }
    
    function contienePrecio(texto) {
      return /s\/\s*\d|\d+([.,]\d+)?\s*soles/i.test(String(texto));
    }
    
    function costoEstimado(llamadas, tokensEntrada, tokensSalida, precioEntradaPorMillon, precioSalidaPorMillon) {
      const porLlamada = (tokensEntrada / 1e6) * precioEntradaPorMillon + (tokensSalida / 1e6) * precioSalidaPorMillon;
      return porLlamada * llamadas;
    }