Todos los artículos

Prompt caching: el mismo agente por cerca de un cuarto del costo

Medimos un pequeño agente de recetas en una API real: con cuatro ajustes, pasó de no leer nada del caché a leer hasta el 94%.

A line rising from 0% to 94%: the share of a small recipe agent's prompt read from the cache, before and after four moves.

Del prompt caching ya se escribió mucho. Las guías de los grandes proveedores explican cómo funciona, y abundan los posts de equipos que subieron su hit rate con un solo cambio. Lo que queremos sumar es una forma de verlo pasar: el prompt de un agente, dibujado igual en cada paso, con el número medido en cada imagen. A veces, la misma idea contada de otra forma es la que hace que todo se entienda.

Para mostrarlo, armamos un pequeño agente de recetas basado en lo que nos pasó con nuestros propios agentes: un prompt que parece estar bien, corregido con cuatro ajustes y con cada versión enviada a la API real de un modelo. Con el mismo modelo y sin cambiar una sola palabra de las reglas, sus prompts costaron un 73% menos, y la prueba completa costó menos de un centavo. Al final mostramos una prueba que evita que se vuelvan a romper y lo que estos mismos ajustes hicieron en los nuestros.

Cómo decide el caché lo que pagas

Cada llamada a un modelo vuelve a enviar la solicitud entera: las herramientas, las instrucciones y la conversación. El prompt caching le permite al proveedor guardar el trabajo que ya hizo con el comienzo de una solicitud y reutilizarlo cuando la siguiente empieza exactamente igual. Según las guías de OpenAI y de Anthropic, leer del caché cuesta una décima parte del precio normal de entrada o menos, y escribir en él, un cuarto más.

La regla es corta: el caché reutiliza todo hasta lo primero que cambia. De eso se trata todo: lo que nunca cambia va primero, y lo que cambia, al final.

Cuatro ajustes en un agente de recetas

Nuestro agente de prueba escribe recetas. Tiene dos herramientas, find_in_pantry y save_recipe, unas mil palabras de reglas y un perfil por persona. La aplicación tiene dos planes: el Pro puede guardar recetas y el gratuito no. Ana es vegetariana y tiene el plan Pro; Leo tiene el gratuito. Durante una noche, cada uno envía tres mensajes.

Un prompt que parece estar bien

Este es el prompt con el que empiezan muchos agentes. La fecha va arriba, para que el agente sepa qué día es. Después vienen los datos de Ana, para que personalice sus respuestas. Su plan decide qué herramientas recibe. Y, como suele pasar, el prompt se vuelve a construir completo antes de cada llamada al modelo.

El primer prompt del agente de recetas: las herramientas de su plan, luego la fecha, los datos de Ana y las reglas, y al final su mensaje. El 0% de la noche salió del caché.

El caché estaba activado y no devolvió nada. Cada mensaje escribió su prompt entero en el caché y ninguno lo volvió a leer, así que la noche costó más de lo que habría costado sin caché.

Paso 1. Mover al final lo que cambia en cada mensaje

La fecha cambia cada minuto y está casi arriba de todo. Todo lo que viene después es trabajo nuevo en cada mensaje, incluidas las mil palabras de reglas. Las dos guías dicen lo mismo: lo que cambia en cada solicitud va al final. Así que la fecha pasa al mensaje del usuario.

Paso 1: la fecha pasa de las instrucciones al mensaje del usuario. El 65% de la noche salió del caché.

Ahora los mensajes siguientes de cada persona leen del caché casi todo su prompt, y la noche pasó del 0% al 65%. Lo que cambia en cada mensaje va al final.

Pero el primer mensaje de Leo seguía sin leer nada.

Paso 2. Sacar los datos personales de la parte compartida

Los datos personales cambian de una persona a otra. Mientras estén en las instrucciones, nadie más puede reutilizar el prompt de Ana. Así que pasan al mensaje del usuario, y las instrucciones quedan iguales para todos.

Paso 2: los datos de Ana y de Leo pasan al mensaje del usuario. La lista de herramientas de Leo es más corta. El 64% de la noche salió del caché.

La noche bajó un poco, al 64%, porque los datos de Ana ahora viajan con cada uno de sus mensajes. Y Leo seguía sin leer nada. Lo que es de una sola persona va después de lo que comparten todos, pero con eso no bastaba: algo seguía siendo distinto, y estaba antes de las instrucciones.

Paso 3. Dar a cada plan la misma lista de herramientas

Las herramientas van antes que las instrucciones, y el plan gratuito de Leo le daba una lista más corta. Su solicitud era distinta de la de Ana desde la primera línea, así que no podía reutilizar nada de lo que ella había dejado en el caché.

La solución es enviar la misma lista en todos los planes. La lista solo describe las herramientas; no decide qué puede usar Leo. Eso se decide aparte: la guía de OpenAI recomienda limitar qué herramientas se pueden llamar sin cambiar la lista que se envía, y el código que ejecuta las herramientas rechaza lo que su plan no permite. El mismo menú para todos, y en la mesa se decide qué puede pedir cada uno.

Paso 3: Leo recibe la misma lista de herramientas que Ana, aunque su plan no le permite usar save_recipe. El 80% de la noche salió del caché.

Esta vez, el primer mensaje de Leo reutilizó lo que Ana había dejado en el caché, y la noche llegó al 80%. El plan sigue decidiendo qué puede hacer cada persona; solo dejó de decidir qué dice el prompt.

Paso 4. Tool calls casi gratis: agregar, no rehacer

Para responderle a Ana, el agente primero revisa su despensa: el modelo pide find_in_pantry, el agente ejecuta esa herramienta y vuelve a llamar al modelo con el resultado. Si esa segunda llamada solo agrega al final lo que pidió el modelo y lo que devolvió la herramienta, todo lo anterior sale del caché. La guía de OpenAI lo dice claramente: hay que agregar mensajes nuevos en lugar de reescribir los turnos anteriores.

Paso 4: la llamada posterior a la herramienta agrega dos líneas al final de la solicitud. El 94% de esa llamada salió del caché.

La llamada posterior a la herramienta leyó del caché el 94% de su prompt. Un agente hace muchas llamadas como esta, así que terminan saliendo casi gratis. En la primera versión, el agente reconstruía el prompt completo antes de cada llamada, con la hora nueva arriba, y esa misma llamada no leía nada. Una tool call tiene que sumar a la solicitud, nunca rehacerla.

Lo que suman los cuatro ajustes

Juntos, los cuatro ajustes cambiaron lo que costó la noche. A un precio de USD 1 por millón de tokens de entrada, los prompts de la noche pasaron de USD 1.76 a USD 0.48 cada mil llamadas, y la llamada posterior a la herramienta costó USD 0.25.

Resultados por paso: el 0%, 65%, 64% y 80% de la noche salió del caché, y el 94% en la llamada posterior a una herramienta. El costo del prompt cada mil llamadas bajó de USD 1.76 a USD 0.48, y fue de USD 0.25 tras la herramienta.

Ninguno de los cuatro ajustes cambió una sola palabra de las reglas. Hicimos la prueba con gpt-6-luna, con el razonamiento desactivado; para cualquier modelo, multiplica estos costos por su precio por millón de tokens de entrada.

Revisa tu propio agente

Toma dos solicitudes que envíe tu agente, de dos personas con un minuto de diferencia, y busca el primer punto en que se separan. Todo lo anterior puede salir del caché; todo lo posterior se paga en cada llamada. Si ese punto está cerca del principio, mira qué hay ahí: una fecha, un nombre, una lista de herramientas hecha para un solo plan.

Después, asegúrate de que siga así con una prueba. Esta nunca llama a un modelo: construye dos solicitudes y compara cómo empiezan.

# dos personas, dos horas: sus solicitudes empiezan igual
ana = build_request(ANA, "18:42", "¿Cena con garbanzos?")
leo = build_request(LEO, "18:43", "¿Almuerzo rápido con huevos?")
assert ana["tools"] == leo["tools"]              # mismas herramientas
assert ana["messages"][0] == leo["messages"][0]  # mismas instrucciones

# la llamada tras una herramienta empieza con toda la anterior
second = add_tool_result(ana, PANTRY_CALL, PANTRY_RESULT)
assert second["messages"][:2] == ana["messages"]

Si alguien vuelve a poner la fecha arriba, escribe un nombre en las instrucciones o recorta la lista de herramientas de un plan, falla la primera verificación. Si alguien rehace el prompt después de llamar a una herramienta, falla la segunda.

Cómo lo hicimos en nuestros agentes

En un texto anterior dijimos que el caché daba para un artículo propio. En octubre hicimos el mismo tipo de ajustes en nuestros agentes reales: la hora pasó al final de cada solicitud, las definiciones de herramientas dejaron de variar según el proyecto, el rol o el idioma, y cada tool call suma a la solicitud en lugar de reconstruirla.

Vimos una mejora todavía mayor que en esta pequeña noche, porque nuestros agentes suelen hacer más de una tool call por mensaje, y esas son las llamadas que más leen del caché. Cuantas más tool calls, más sube el promedio. Nuestro panel pasó de un sesenta y tantos por ciento al 93%. Lo que estamos construyendo todavía está en desarrollo, con poca gente y mucho tiempo entre un mensaje y otro, así que muchas llamadas encuentran el caché expirado, como el primer mensaje de Ana esa noche; con uso continuo, esperamos entre el 96% y el 98%.

Antes y después: el mismo agente y las mismas reglas en otro orden. Antes, cada llamada leyó el 0% del caché; después, la llamada posterior a la herramienta leyó el 94%.

Mira las primeras líneas de tu prompt. Si cambian de una llamada a otra, llévalas al final y deja que el caché haga el resto.

Únete a la lista de espera.

Werk todavía no salió. Anótate y tendrás acceso antes que nadie.

Anotarme