El caché de prompts abarata la autoconsistencia en las comprobaciones de LLM con contexto largo
Medido en seis modelos: muestrear varias veces el mismo prompt largo cuesta solo entre 1,55x y 2,5x una llamada gracias al caché. Además, la ecuación, las salvedades y una receta de puntuación.
Por qué las comprobaciones de consistencia no tienen por qué costar seis veces más
Desde hace años existe una forma barata y portátil de pillar a un LLM poco fiable. Le haces la misma pregunta varias veces y comparas lo que responde. Si las respuestas no coinciden, no te fíes de ninguna. No hacen falta logprobs, etiquetas ni modelo juez, y cualquier API a la que puedas llamar dos veces lo admite. Aun así, en producción se ve poco, porque todo el mundo pone la misma objeción: seis muestras son seis veces la factura.
Las pruebas con seis modelos muestran otro panorama. Donde el caché de prompts está activo, seis muestras salen por entre 1,55 y 2,5 veces el precio de una llamada. Una aclaración sobre lo que significa: las cifras son proporciones, así que una petición puntuada sigue costando más que una normal. Lo que cambia es el tamaño del recargo, alrededor del 55 % en lugar del 500 % que la gente imagina. Las cifras absolutas en dólares están en las tablas para que puedas comprobarlo.
Una carga de trabajo para la que se diseñó el caché
La razón es mecánica. Una petición llega a la API como un único flujo de tokens, primero el contexto y al final la pregunta. El caché compara ese flujo con los anteriores empezando por el byte cero, y todo lo que coincide se cobra alrededor de un 90 % por debajo de la tarifa normal de entrada. Un cambio en cualquier punto temprano del prompt invalida todo lo que viene detrás.
El muestreo por consistencia nunca cambia nada. Repite exactamente el mismo prompt N veces. La primera llamada paga la tarifa completa y llena el caché, y las otras cinco reutilizan el contexto a una décima parte del precio, de modo que el único trabajo nuevo es generar respuestas, justo lo que quieres comparar. En RAG sobre documentos largos o en agentes con grandes contextos de herramientas, que son los casos donde más importa la confianza, los tokens de entrada son la mayor parte del coste, y así el 6x desaparece en buena medida.
Algunos detalles lo complican. Escribir en el caché de Anthropic cuesta un recargo único de 1,25x, y Anthropic es el único de los tres proveedores que informa de esa escritura. Gemini cachea en bloques de 8.192 tokens, y en estas ejecuciones no se cacheó nada entre unos 9k y 17k tokens. Los tamaños mínimos también varían: 512 tokens en Claude Opus-5, 1024 en OpenAI y 4.096 en Gemini.
El montaje de la prueba y lo que costó
La prueba usó como contexto una política de aerolínea de unos 21k tokens y una pregunta detrás, enviada seis veces a cada modelo. Tras cada llamada se registró el número de tokens cacheados que informaba el proveedor, y cuatro proveedores usan cuatro nombres de campo distintos para ello. Después, el puntuador noncontradiction de UQLM valoró las seis respuestas, usando un modelo NLI para comparar cada una con las otras cinco. Ese paso se ejecuta en local a posteriori y no añade llamadas a la API.
La creencia popular es 6x. Con el caché caliente, el coste de una petición puntuada dividido entre el de una sin puntuar quedó entre 1,55x y 2,5x en la mayoría de modelos, medido el 31 de julio de 2026.
Dos resultados enfrían el optimismo. Qwen no registró ningún acierto de caché en ninguna de sus seis llamadas, lo que lo deja exactamente en 6x, así que para ese modelo la objeción se cumple tal cual. Llama cacheó el 99,4 % del prompt y aun así no ahorró nada, porque Together ofrece tarifa reducida de caché para algunos modelos, pero no para este. Acertar en el caché es un hecho técnico y obtener descuento es una decisión comercial, y necesitas que ocurran las dos cosas.
Más contexto, menos recargo
Para poner a prueba lo de «contexto largo», el barrido fue de 1,4k a 440k tokens, tres llamadas por tamaño, cada tamaño con su propio prefijo en frío para que nada heredara un caché caliente de la ejecución anterior.
Todas las curvas bajan y luego se estabilizan en un suelo. Es una asíntota de verdad y no un descenso lento. OpenAI mide 1,51x, 1,51x, 1,50x y 1,50x de 55k a 440k tokens, así que multiplicar por ocho el contexto mueve el resultado una centésima. Para bajar del suelo harían falta menos muestras (tres muestras tocan fondo en 1,20x) o un descuento de caché mayor.
Dos proveedores se desvían, cada uno a su manera. Anthropic toca fondo en 1,75x y no en 1,50x, porque cada llamada en frío paga el 1,25x de escritura en caché. Los bloques de 8.192 tokens de Gemini hacen que su multiplicador oscile cada vez que el prefijo cruza un límite de bloque: 2,07x en 28k, sube a 2,31x en 50k y luego 1,63x en 84k, todos camino del mismo suelo.
Por debajo de unos 7k tokens, Gemini no cacheó nada y se quedó fijo en 6,00x. Eso marca dónde deja de funcionar el argumento: con prompts pequeños, la objeción de siempre es sencillamente correcta.
Una ecuación lo resume todo
Todo se reduce a una línea. Para N muestras del mismo prompt:
C cached context tokens
c cached / input rate (~0.1; 1.0 if no cached price)
Q uncached input per call
w write / input rate (1.0; 1.25 on Anthropic)
O output tokens
k output / input price (6 Terra · 5 Opus, Gemini · 2 DeepSeek)
En esta fórmula, f mide qué parte del coste de la petición puede ir sobre el caché, y M es lineal en ella: igual a N cuando no hay nada cacheado e igual al suelo cuando todo lo está. Los seis modelos caen sobre esa recta con un margen de 0,005.
Lo que merece atención es la ponderación por coste. Los tokens de salida cuentan en f tras multiplicarse por k, porque cuestan k veces más y nunca se cachean. En Terra, un solo token de salida erosiona la parte cacheable tan rápido como seis tokens de contexto la aumentan, lo que explica casi toda la dispersión observada. DeepSeek llega a 1,86x incluso con un 99 % de aciertos, porque cada respuesta incluía 656 tokens de razonamiento. Llama queda exactamente en 6,00x con f = 0,99: sin precio de caché, c = 1, y la recta no le deja margen.
La regla práctica es que el contexto cacheado C debe superar con creces k veces la salida O. El contexto largo ayuda y las respuestas largas perjudican k veces más rápido. Una superficie trazada sobre la longitud del contexto y de la salida sitúa el punto de equilibrio de 2x donde esas dos fuerzas se compensan.
Para tu propio stack, esto es aritmética y no un benchmark:
# pip install r2c2 — Reuse Context, Recheck Consistency
from r2c2 import estimate, required_context
estimate(context_tokens=21_000, output_tokens=40, model="gpt-5.6-terra").multiplier
# 1.56 — matches the 1.55 measured
required_context(output_tokens=40, model="gpt-5.6-terra", threshold=1.8)
# 4060 — under ~4k context tokens, six samples cost more than 1.8x
La segunda función aplica la fórmula al revés. Dale un tope de coste y devuelve el tamaño de contexto a partir del cual la puntuación empieza a cumplir ese tope. Devuelve None si ningún tamaño de contexto lo consigue, lo que ocurre cuando el tope está en el suelo de ese proveedor o por debajo.
Qué detecta el coste extra
Muestrear barato no sirve de nada si la puntuación no señala algo, así que la pregunta de prueba era difícil. La política permite reembolsos en tarifas no reembolsables dentro de las 24 horas siguientes a la reserva, y no dice quién canceló. El caso: un pasajero reservó una tarifa no reembolsable hace 30 horas y luego la aerolínea canceló el vuelo. ¿Le corresponde reembolso?
En una pregunta de control que la política responde directamente, los seis modelos puntuaron 0,99 o más. La redacción cambia cada vez y el veredicto nunca, porque reformular es precisamente lo que hace el muestreo y no cuenta como desacuerdo.
En esa pregunta, sacada de las mismas seis llamadas usadas para las cifras de coste, los modelos discreparon. Qwen alternó no, sí, no, sí, no, sí, una moneda al aire en una decisión de reembolso, y puntuó 0,40. Gemini se repartió 4 a 2, y sus respuestas afirmativas citaban «normativa del Departamento de Transporte» que el prompt no menciona en ningún momento. Terra y DeepSeek se repartieron 5 a 1 cada uno. Claude Opus 5 dijo que sí seis de seis veces, tras decidir, de forma verosímil pero sin apoyo en el texto, que la regla de las 24 horas solo cubre cancelaciones iniciadas por el pasajero. Llama sacó un 1,00 perfecto dando seis veces la misma evasiva («puede considerarse una excepción... podría tener derecho»). Evadir de forma consistente también es una señal, pero este puntuador no la marca.
Las treinta y seis respuestas suenan fluidas y seguras, y todas citan la política. Mirando una sola respuesta, nunca sabrías que la siguiente muestra podría decir lo contrario. El 0,40 es el único aviso visible y, donde domina la entrada, conseguirlo cuesta más o menos media llamada adicional.
Los repartos además cambian de una ejecución a otra. En otra ejecución, Terra se repartió 3 a 3 y Gemini se negó a responder las seis veces. Probar de antemano no lo arregla, y ese es el argumento para puntuar en vivo y no auditar una vez offline.
Cómo ponerlo en práctica
Si ya muestreas N respuestas, la puntuación en sí es gratis, porque .score() se ejecuta a posteriori sobre respuestas que ya tienes:
from uqlm import BlackBoxUQ
# six answers you already collected; calls 2-6 hit the prompt cache
scorer = BlackBoxUQ(scorers=["noncontradiction"], use_best=False)
result = scorer.score(responses=[answers[0]], sampled_responses=[answers[1:]])
confidence = result.to_df()["noncontradiction"][0] # 0.99 = agrees; 0.40 = coin flip
El puntuador ejecuta un modelo NLI local (microsoft/deberta-large-mnli), así que no hay tarifa de modelo juez. Las puntuaciones bajas pueden ir a una persona, a otro intento de recuperación o a un modelo más grande.
Tres hábitos deciden si de verdad ves el 1,55x. Envía la primera llamada sola y lanza el resto después en abanico, porque una entrada de caché no se puede leer hasta que la primera respuesta empieza a transmitirse, y seis peticiones idénticas simultáneas fallarían todas. Mantén las muestras idénticas hasta el último byte y pon todo lo variable después del contexto, porque una sola marca de tiempo interpolada estropea todo lo que va detrás. Por último, muestrea con temperatura mayor que cero; si no, seis respuestas idénticas te dan una puntuación perfecta que no dice nada.
Hacia dónde va esto
Entre los métodos para detectar alucinaciones, la estimación de incertidumbre de caja negra siempre fue la más fácil de desplegar: sin logprobs ni etiquetas, y funciona en cualquier parte. Su único inconveniente serio era el precio, y se desdibujó cuando los proveedores introdujeron lecturas cacheadas con un 90 % de descuento, ya que el muestreo por consistencia reenvía bytes idénticos por diseño. El ciclo es: cachear la lectura, volver a muestrear la respuesta, puntuar el acuerdo y mandar las puntuaciones bajas a una persona. En las plataformas que concentran la mayor parte del tráfico de producción, cuesta en torno a media llamada extra.
Nada de esto se traslada sin cambios a cualquier configuración. Las cifras dependen del tamaño del contexto, del proveedor y del precio de los tokens. Un prompt de 2k tokens no se cachea en absoluto en Gemini, y un chatbot con prompts cortos y respuestas largas no llegará a 1,55x. La ecuación te da tu propio multiplicador en medio minuto, y el repositorio de reproducción lo rehace todo con cuatro claves de API y unos dos dólares.
Aun así, la tendencia favorece a esta técnica, y el motivo son los agentes. Sus contextos son los prompts que más rápido crecen en producción, porque cada llamada a una herramienta alarga el historial y cada turno lo reenvía entero, y ni siquiera una compactación cuidadosa impide que los totales suban. El crecimiento no debilita el argumento: te desplaza más a lo largo de la curva. Los proveedores crearon el caché de prompts porque los agentes reenvían prefijos enormes, y la puntuación de consistencia usa esa misma maquinaria. La verificación se está abaratando justo en las cargas de agentes, donde más falta hace.
Código y figuras: https://github.com/mohitcek/r2c2 (el repositorio de reproducción) y https://github.com/cvs-health/uqlm (UQLM).