Jev frente a un LLM

No compiten por el mismo trabajo. Un LLM escribe; Jev decide. La comparación útil no es cuál es más listo, sino qué tiene que hacer tu código con la respuesta, y esa diferencia es lo bastante grande como para cambiar cómo se escribe el programa que hay alrededor.

La misma decisión, escrita de las dos formas

Enruta un ticket de soporte a una de cuatro colas. Esto es lo que cada lado te cuesta realmente en código.

Con un modelo de lenguaje

const res = await llm.chat({
  messages: [{ role: "user", content:
    `Route this ticket. Reply with JSON: {"queue": "Billing"|"Technical"|"Account"|"Sales"}
     Ticket: ${ticket}` }],
  response_format: { type: "json_object" }
});

let queue;
try {
  queue = JSON.parse(res.content).queue;        // may not be JSON
} catch {
  return retry();                               // ...so there is a retry
}
if (!QUEUES.includes(queue)) return retry();    // may be a queue you never had
// and no idea how close the call was

Con Jev

const { answers } = await jev.systemOne({
  state: ticket,
  model: "jev-latest",
  questions: { queue: { type: "choice", instructions:
    "Which team should own this ticket?", criteria: QUEUES } }
});

const { choice, probabilities, confidence } = answers.queue;
// choice is one of QUEUES. It cannot be anything else.
if (confidence < 0.7) return humanReview(ticket, probabilities);
route(choice);

El bucle de reintentos es la señal. Existe en la primera versión porque la respuesta llega como texto que puede no parsearse, o parsearse a una cola que nunca estuvo en la lista. En la segunda no tiene dónde vivir: la respuesta es una de QUEUES por construcción. Lo que la sustituye es una rama completamente distinta, una que se dispara cuando el modelo está inseguro y no cuando está mal formado.

Lo que puede ver la segunda versión

Ese ticket, pasado por Jev de verdad. La ganadora no sorprende; la segunda es la parte que una etiqueta pelada habría tirado.

“Nuestro inicio de sesión SSO está devolviendo un 500 desde la versión 4.2 de esta mañana. Nadie del equipo puede entrar. Igual en Chrome y en Safari, en dos inquilinos distintos.”
Técnico con 87 %, de 4 opciones
87 % Técnico

Técnico gana con un 87 %, pero Cuenta se queda con un 13 %, y ese es justo el desacuerdo correcto, porque un fallo de SSO sí está en la frontera entre ambos. Una etiqueta pelada lo habría escondido. Si equivocarse en el enrutado tiene un coste, el 13 % es el número sobre el que poner el umbral.

Lado a lado

Qué envías
Jev

Un state más un mapa de preguntas tipadas.

LLM

Un prompt, normalmente con el esquema y las reglas escritos en prosa.

Qué vuelve
Jev

Una respuesta tipada por pregunta, con probabilidad para cada opción.

LLM

Texto. JSON si lo pediste con educación y el modo está soportado.

Tu siguiente línea de código
Jev

Un switch sobre un valor que solo puede ser uno de los tuyos.

LLM

Un parseo, luego una validación, y luego una rama por si falló cualquiera de los dos.

Cómo falla
Jev

Puede equivocarse sobre tu texto. No puede devolver una forma que no definiste.

LLM

También puede equivocarse en la forma: un campo que falta, una etiqueta que nunca listaste, prosa envolviendo el JSON.

Preguntar diez cosas
Jev

Diez preguntas en una petición, evaluadas contra el state en paralelo.

LLM

Un prompt abarrotado, o diez llamadas.

Incertidumbre
Jev

Una distribución y un valor de confianza, en cada Choice y cada Score.

LLM

Lo que el texto afirme sobre su propia certeza.

Las cifras

Las publica TypeSafe; son cifras del proveedor, no mediciones nuestras.

70–500 ms

respuesta de extremo a extremo, frente a 3–329 s de los modelos de frontera

40–200×

más rápido en consultas con forma de Sistema Uno

0,042 $

por millón de tokens de entrada, salida gratis

Lo que sí podemos medir: a lo largo de 14 ejecuciones hechas desde este sitio, la mediana de ida y vuelta es 329 ms, y la mayoría de esas peticiones llevaban nueve preguntas, no una.

Cuándo el LLM es la herramienta adecuada

Casi siempre, si lo que necesitas es lenguaje. Jev no tiene opinión que explicar ni nada que decir.

  • Necesitas prosa: una respuesta, un resumen, un mensaje de commit, una explicación de la decisión en vez de la decisión.
  • Necesitas que escriba código, o un plan, o cualquier cosa abierta en la que el conjunto de respuestas no se conoce antes de la llamada.
  • El conjunto de respuestas posibles es de verdad ilimitado. Extraer un nombre arbitrario no es un Choice sobre 255 opciones.
  • Necesitas una cadena de razonamiento que puedas inspeccionar. Jev devuelve un juicio, no los pasos que hay detrás.
  • El volumen es bajo y la forma es laxa. Un bucle de reintentos que corre dos veces al día no merece que lo diseñes para eliminarlo.

Los dos se componen mejor de lo que compiten. El propio planteamiento de TypeSafe es Sistema Uno para el juicio estructurado y rápido y un modelo corriente como Sistema Dos detrás: filtra la entrada con un Noul, enruta con un Choice y pásale lo que sobreviva al modelo que sí sabe escribir.

Seguir leyendo

Haz tú mismo la comparación

Pega un ticket, un borrador, un prompt —cualquier cosa alrededor de la que, si no, habrías escrito un bucle de parseo— y mira volver nueve respuestas tipadas de una sola petición.

Abrir el patio de juegos