Ir al contenido principal
Laravel, thinking fast.
Capitulo 4 · Lo que te cuesta un token

Demuestra que el cacheo funciona de verdad

Julian Beaujardin

El capítulo 3 defendía ordenar un prompt para que su prefijo estable se pueda cachear. Aquí es donde te enteras de si funcionó.

Los proveedores imponen un tamaño mínimo cacheable. Un prompt marcado para cachear pero por debajo de ese umbral no es un error: nada te avisa, nada falla. La marca simplemente no hace nada, y tú sigues creyendo que tienes cacheo.

La señal es que cache_read_input_tokens siga a cero en turnos que obviamente deberían haber acertado en un prefijo caliente. Si es así, la marca es decorativa: o el prefijo es demasiado pequeño para cualificar, o algo anterior a la marca varía en cada petición y no hay prefijo estable en absoluto.

Regístralo, míralo una vez y actúa según lo que veas. Es una comprobación de diez minutos que o confirma un descuento grande o revela que nunca lo tuviste.

El dial entre coste y latencia

Los modelos que razonan exponen un control sobre cuánto pensar, y su valor por defecto está elegido para problemas difíciles.

La mayoría de las funciones de producto no son problemas difíciles. Un chat que ayuda a alguien a describir su negocio no es una olimpiada de matemáticas, y el esfuerzo por defecto gasta dinero y segundos que la interacción no necesita:

'thinking' => ['type' => 'adaptive'],
'output_config' => ['effort' => 'medium'],

Dos decisiones que conviene separar.

Adaptativo en lugar de apagado. Apagar el razonamiento del todo es tentador por coste, pero en una función movida por herramientas sale mal: sin espacio para razonar, el modelo recurre menos a las herramientas, y toda esta función son herramientas. Más barato por llamada, peor en su trabajo.

Esfuerzo por debajo del valor por defecto. Este es tanto el dial de la latencia como el del coste. Un chat que responde en cuatro segundos en vez de nueve es un producto sensiblemente mejor, y aquí además es más barato.

No aceptes estos valores por defecto. Tampoco los adivines: cambia uno, mide latencia y calidad con tráfico real, y consérvalo o revierte.

Multiplícalo todo por las iteraciones

Una última cuenta, porque es la que convierte un coste razonable por llamada en una factura irrazonable.

En un bucle, cada iteración reenvía todo: prompt, historial completo, definiciones de herramientas y todos los resultados de herramientas hasta el momento. Los tokens de entrada crecen en cada pasada. Un turno de diez iteraciones no cuesta diez veces un turno de una: cuesta bastante más, porque las últimas iteraciones son las más grandes.

Lo que convierte el tope de iteraciones en un control de gasto tanto como de corrección:

$maxIterations = 10;

El capítulo 8 cubre qué hace ese bucle y por qué necesita un presupuesto de reloj además de un contador. Anota aquí sólo esto: todos los topes de este capítulo son por llamada, y un turno son muchas llamadas. Si pones tope a la llamada y no al bucle, no has puesto tope a nada.

Lo que sostiene este capítulo

  • El coste es una propiedad de corrección. Es el único modo de fallo que nunca se anuncia.
  • Los clientes no eligen nada que cueste dinero. Sobrescribe modelo, proveedor y tope en prepareForValidation(); expón un enum de propósitos.
  • Usa carriles. Una lista corta de propósitos con nombre, cada uno con modelo y tope fijados, gana a un número global o a un parámetro libre.
  • Un tope de salida puede consumirse razonando. Fíjalo para pensamiento más respuesta, y comprueba siempre la razón de parada para que el truncamiento sea visible.
  • Límite de frecuencia y presupuesto son preguntas distintas. «Demasiado rápido» va en la ruta; «demasiado» va donde sabes quién paga.
  • Incrementa primero, compara después. Comprobar-y-luego-incrementar falla abriendo bajo concurrencia, y un límite de gasto nunca debe fallar abriendo.
  • Ata el presupuesto a lo que paga, no a la credencial. Un token efímero reinicia el presupuesto en cada rotación.
  • Rechaza con 429, un Retry-After calculado y el nombre del límite alcanzado.
  • Lee el bloque de uso. Llega gratis en cada respuesta y responde a las preguntas que te harán después.
  • Verifica el cacheo del prompt en vez de darlo por hecho. Una marca por debajo del tamaño mínimo no hace nada, en silencio.
  • Pon tope al bucle, no sólo a la llamada. Las iteraciones multiplican todos los demás números.