# Caché de prompts en LLMs: Optimizando la caché KV para reducir costos y latencia
El caché de prompts reduce los costos de tokens de entrada de los LLMs en un factor de 10 y disminuye la latencia hasta un 85 % para prompts largos. OpenAI y Anthropic no almacenan en caché las respuestas; almacenan en caché cálculos intermedios en el mecanismo de atención del transformer, específicamente la caché KV. Esto guarda pares clave-valor para prefijos de prompts repetidos, acelerando la inferencia sin sacrificar la calidad de la generación.
La tecnología es ideal para tareas con contexto repetido: RAG, chatbots con historial de conversación, pipelines multinivel. Pruebas en proveedores de API muestran que aprovechar al máximo la caché proporciona un aumento significativo de velocidad para el primer token.
Arquitectura de los LLMs y el rol de la atención
Un LLM es una secuencia de bloques transformer, cada uno que toma embeddings como entrada y produce representaciones actualizadas. La inferencia se ejecuta en un bucle: el prompt se tokeniza, los embeddings pasan por las capas de atención y feed-forward, se genera el siguiente token y se añade al contexto.
prompt = "What is the meaning of life?";
tokens = tokenizer(prompt);
while (true) {
embeddings = embed(tokens);
for ([attention, feedforward] of transformers) {
embeddings = attention(embeddings);
embeddings = feedforward(embeddings);
}
output_token = output(embeddings);
if (output_token === END_TOKEN) {
break;
}
tokens.push(output_token);
}
print(decode(tokens));
El almacenamiento en caché ocurre en la atención. La autoatención calcula una suma ponderada de tokens anteriores para cada token en función de la similitud entre la consulta (token actual) y las claves (tokens anteriores). Para query_i: attention(Q_i, K, V) = softmax(Q_i K^T / sqrt(d)) V.
Al generar cada nuevo token, la caché KV para todos los tokens anteriores se expande, lo que lleva a una complejidad cuadrática O(n^2) con respecto a la longitud de la secuencia.
Tokenización y embeddings
El tokenizer divide el texto en unidades subpalabra y asigna IDs. Ejemplo para GPT: "Check out ngrok.ai" → [4383, 842, 1657, 17690, 75584]. Es determinista, sensible a mayúsculas y minúsculas, y usa algoritmos tipo BPE.
Los embeddings transforman los tokens en vectores n-dimensionales (n > 10k en modelos grandes). La matriz de embeddings es fija después del entrenamiento:
function embed(tokens) {
return tokens.map((token, i) => {
const embeddings = EMBEDDINGS[token];
return encodePosition(embeddings, i);
});
}
La codificación posicional añade información sobre el orden. Más dimensiones capturan mejor la semántica: tono, estilo, similitud.
Mecanismo de atención y caché KV
En la atención multi-cabeza:
- Proyecciones: Q = X W_Q, K = X W_K, V = X * W_V (X — matriz de embeddings).
- Puntuaciones: attention_scores = Q * K^T / sqrt(d_k).
- Softmax y suma ponderada: attention_output = softmax(scores) * V.
Para una secuencia de longitud n, la caché KV consiste en tensores K y V de tamaño [n, d_model]. Al generar el t-ésimo token, la atención usa toda la caché pasada más la actual.
El caché de prompts guarda la caché KV del prefijo del prompt a través de llamadas a la API. Si un nuevo prompt comienza con un prefijo almacenado en caché (acierto), se omiten los cálculos de atención para esos tokens: se usa la KV lista en su lugar. Los costos bajan porque se omite ~90 % del cómputo para contextos largos.
- Acierto de caché: prefijo > 1024 tokens (Anthropic), costo /10.
- Fallo de caché: recomputo completo.
- TTL: la caché vive ~5-10 min, depende del proveedor.
Beneficios y limitaciones
Ganancias en latencia: para prompts con 10k+ tokens, TTFB baja un 50-85 %.
Ahorros: tokens de entrada en caché — $0.0001/1k vs $0.001/1k (aprox).
Limitaciones:
- Emparejamiento solo de prefijo (no subcadenas arbitrarias).
- No almacena en caché embeddings de salida ni logits.
- Depende del tokenizer del proveedor.
En producción: úsalo para chats basados en sesiones donde el historial se repite.
Lecciones clave
- El caché de prompts almacena en caché pares KV de atención para prefijos, reduciendo el cómputo un 90 %+ para contextos largos.
- El tiempo hasta el primer token baja hasta un 85 %, costos de entrada /10.
- Requiere emparejamiento exacto de prefijo y tokenizer compatible.
- Perfecto para RAG, historiales de chat, tareas multiiteración.
- Sin impacto en la calidad: la generación sigue siendo estocástica.
— Editorial Team
Aún no hay comentarios.