Un modelo que no escribe
Jev contesta preguntas con un número en vez de texto. Mi primer caso de uso: decidir si una charla quedó abierta.
Hace poco salió un modelo que no genera texto, y me parece lo más disruptivo que vi en meses, más que los últimos modelos de frontera. Se llama Jev, lo hizo TypeSafe, y lo presentan como el primero de una clase nueva que llaman System One. Este post es sobre qué es y sobre el primer lugar donde lo puse a trabajar.
La respuesta corta es que Jev no conversa. Le das el estado de tu aplicación y una pregunta con respuesta tipada, y devuelve un número.
Qué es Jev
Un modelo de lenguaje común recibe texto y produce texto. Si querés que decida algo, le pedís que escriba “sí” o “no”, o un JSON, y después parseás lo que escribió esperando que venga en el formato que pediste.
Jev arranca del otro lado. Recibe un estado, que es un JSON con lo que quieras (una charla, un ticket, una línea de log), y una o más preguntas tipadas. Hay tres tipos: una afirmación, de la que devuelve la probabilidad de que sea cierta; una elección entre opciones que vos le das; y un puntaje sobre una escala que vos definís. No escribe nada. Contesta con el número y termina.
Eso cambia dos cosas. La primera es que no hay formato que parsear ni validar: la respuesta ya es un número. La segunda es que la duda tiene dónde vivir. Un booleano no puede decir “más o menos”, y un 0,44 sí.
Y corre en otra escala: contesta en medio segundo y la salida no se cobra.
El primer caso: ¿quedó algo abierto?
El bot de la tienda tiene un remarketing simple. Cuando un asesor habló último y el cliente no volvió a escribir en cuatro horas, dentro del mismo día y en horario comercial, se le manda un mensaje fijo: “Hola, ¿pudiste ver lo que te mandé antes?”.
Desde hace unas semanas el texto no lo escribe ningún modelo. El modelo sólo decide una cosa: ¿quedó algo abierto en esa charla, o el cliente ya cerró? Son unas veinte decisiones por día.
Esa decisión la tomaba un agente de texto con un prompt de unas 350 palabras. Dos listas, cuándo mandar y cuándo no, y un cierre en mayúsculas: ANTE LA DUDA, NO MANDES. Tenía que responder un JSON con un booleano.
Lo que medí en producción sobre 238 decisiones, desde el 8 de septiembre hasta hoy:
- Tardaba. La mitad de las llamadas más de 2 segundos, una de cada diez más de 8,7 segundos, y la peor 6 minutos.
- Razonaba para emitir un bit. Unos 1.500 tokens de entrada y 93 de salida en promedio: prosa para llegar a un true o un false.
- Mandaba casi siempre. 200 veces mandó, 37 calló. Con un prompt cuyo sesgo declarado es no mandar ante la duda, mandó 5 de cada 6 veces. La duda, en un booleano, no tiene dónde vivir.
- Envolvía el JSON en un bloque de código una de cada cinco veces. Se parseaba igual, pero es fragilidad gratis.
- Si fallaba, perdía. Cuando el modelo no contestaba, el trabajo terminaba sin guardar nada y no se volvía a agendar. El cliente, por definición, no vuelve a escribir. Esa charla no recibía follow-up nunca.
Lo mismo con Jev
Con Jev la pregunta es una afirmación: “el asesor habló último y el cliente no volvió: quedó algo abierto”. Los criterios para verdadero y para falso son las dos listas del prompt viejo, reescritas en positivo y enumeradas, porque Jev lee literal y se pierde con negaciones y condiciones implícitas. La regla es una línea: se manda si la probabilidad supera 0,8.
Lo que cambió, medido esta semana:
- Medio segundo. Cinco llamadas seguidas, entre 0,50 y 0,59 segundos. Cuatro veces menos en la mediana, diecisiete veces menos en el percentil 90, y sin cola de minutos.
- Un centavo de dólar cada 700 decisiones. La entrada son unos 300 tokens de estado, y la salida no se cobra.
- Estable. La misma charla cinco veces: 0,44, 0,43, 0,45, 0,48, 0,44. Ruido de tres centésimas, sin seed.
- Separa. Sobre 17 charlas reales de producción, las que había que mandar dieron entre 0,89 y 0,96, y las que había que callar entre 0,17 y 0,42. Un hueco de casi medio punto contra un ruido de tres centésimas. El umbral no está al borde de nada.
Y entiende rioplatense. Un ejemplo reconstruido:
Asesor: Te aviso entre mañana y pasado si me entra el 15 en negro.
Cliente: Dale, gracias.
Ahí no quedó nada abierto del lado del cliente: la pelota la tiene la tienda. Jev dio 0,24. Un cliente que pidió quedar en lista de espera, 0,17.
El “ante la duda, no mandes” dejó de ser una frase en un prompt y pasó a ser un número. Y un número se mueve con datos: si los follow-ups que salieron con 0,7 responden tan bien como los de 0,9, se baja; si no, se sube.
El agente no se fue
Jev es el primero de una cadena de dos. Si no contesta, porque se cayó el servicio o falta la clave, la decisión cae al agente viejo. Pero un “no” de Jev es una respuesta, no una falla, y el agente no la revisa. Si el respaldo pudiera revisar el “no” del principal, estaríamos preguntando hasta que alguno diga que sí, exactamente al revés del sesgo del feature.
Cada silencio queda registrado con quién lo decidió. Es lo que va a permitir comparar un juez contra el otro cuando haya datos.
Lo que probé y descarté
Antes de esto intenté usar Jev para dos de los guards que conté en el post anterior, con traces reales.
El primero era el de fuga de vocabulario interno: 700 respuestas, un centavo. Jev atrapaba más que la regex, pero lo que atrapaba de más eran pasos intermedios que el pipeline nunca manda al cliente. La regex tuvo una sola falla real en 700. Una lista de palabras prohibidas es un problema de regex.
El segundo era el de stock afirmado sin haber buscado: 800 turnos. La regex disparó cinco veces y cuatro eran recaps legítimos de una búsqueda de un minuto antes. Jev sumaba dos casos reales, algo así como uno por día. No justificaba ni el clasificador ni una regla nueva.
La moraleja: Jev paga cuando la regla es semántica y la salida es un bit con duda. No reemplaza una regla léxica ni una verificación numérica, que es su punto ciego documentado.
Lo que no puedo decir todavía
Tres cosas, para que el relato no suene mejor de lo que es.
La precisión no mejoró. El agente daba 21 de 21 en su corpus cuando se mergeó, y Jev da 17 de 17 en el suyo. Lo que cambió es latencia, costo, estabilidad y que la duda sea medible.
Queda por ver cómo se comporta con el tiempo. Lo de arriba es lo que medí en el laboratorio y sobre charlas pasadas. El número interesante es qué pasa con ese 84% de “mandar” cuando la duda pasa a ser un umbral, y después qué tasa de respuesta tienen los follow-ups de cada juez.
El 0,8 es arbitrario. Lo elegí alto a propósito para arrancar, y lo voy a calibrar contra respuestas reales.
Por qué me parece disruptivo
Los modelos de frontera compiten en escribir mejor. Jev compite en otra cosa: contestar una pregunta chica, rápido, barato, con un número que dice cuánto duda. Casi todas las decisiones que toma un sistema como Chatty son de ese tamaño: ¿quedó abierto?, ¿esto es una queja?, ¿hay que pasar a una persona? Hoy cada una de esas pasa por un modelo que escribe un párrafo para decir sí o no.
Con Jev, por primera vez el criterio de un modelo es una perilla y no un párrafo.