109 — Compresión de contexto y cachés semánticos
Parte: 08 — Recuperación, contexto, memoria y conocimiento
Nivel: avanzado · Horas estimadas: 6
Laboratorio: retrieval · Estado: EXECUTABLE_CORE
🎯 Propósito
Comprender compresión de contexto y cachés semánticos dentro de la evolución de la inteligencia artificial, implementar un experimento mínimo verificable y distinguir qué parte constituye evidencia frente a una afirmación todavía no comprobada.
📚 Resultados de aprendizaje
Al finalizar podrás:
- Explicar compresión de contexto y cachés semánticos usando los conceptos
compression,cache,context,budget. - Ejecutar el laboratorio con una semilla explícita y revisar su contrato JSON.
- Identificar al menos un supuesto, una limitación y un riesgo de aplicación.
- Comparar el enfoque con la etapa anterior de la ruta de aprendizaje.
- Producir una evidencia reproducible y una conclusión que no exceda los datos.
🧩 Conceptos centrales
compression, cache, context, budget
🗺️ Ubicación en el mapa de la IA
Cuando RAG y memoria (102-105) funcionan, el problema pasa a ser económico: cada token del contexto cuesta dinero y latencia en cada llamada, y los pipelines maduros repiten una enorme fracción de su contexto (instrucciones, documentos, historial). Esta clase aplica dos ideas clásicas de sistemas —compresión y caché— al contexto de los LLMs. Son las técnicas que separan un prototipo que funciona de un servicio cuyo coste por consulta permite operarlo, y preparan la evaluación coste/calidad de las clases 107-108.
📖 Fundamentos
💰 El presupuesto de contexto
Cada llamada paga O(tokens de entrada) en coste y latencia (el prefill procesa todo
el prompt antes del primer token de salida). Un presupuesto de contexto reparte la
ventana entre partes con valor desigual:
contexto = instrucciones (fijas) + herramientas + memoria + top-k recuperado + turno
prioridad: lo que cambia la respuesta > lo que la decora
La pregunta de diseño no es "¿cuánto cabe?" sino "¿qué aporta cada token a la calidad de la respuesta?" — y medirla (clase 110) es lo único que legitima recortar. Esta pregunta es el núcleo de lo que la industria llama hoy context engineering (el menor conjunto de tokens de alta señal por llamada); la clase 118 la retoma para el caso agéntico, donde el contexto además crece con cada iteración del bucle.
🗜️ Compresión de contexto
Dos familias:
- Compresión dura (extractiva): eliminar tokens de baja información conservando los demás. LLMLingua (arXiv:2310.05736) usa un modelo de lenguaje pequeño para estimar la perplejidad de cada token y descarta los más predecibles (artículos, redundancias): ratios de 2-10× con degradación pequeña en tareas de QA. LongLLMLingua (arXiv:2310.06839) añade compresión guiada por la pregunta: conserva lo relevante para esta consulta.
- Compresión blanda (abstractiva): resumir con un LLM (la compactación de la clase 105 es el caso conversacional). Más fluida, pero puede parafrasear mal un dato crítico y es más cara de producir.
En RAG, comprimir los pasajes recuperados ataca además el problema "lost in the middle" (arXiv:2307.03172): menos tokens irrelevantes entre la pregunta y la evidencia.
⚡ Prompt caching (caché exacto de prefijos)
Los proveedores de LLM cachean el estado de atención (KV-cache) de un prefijo exacto del prompt: si la siguiente llamada comparte ese prefijo token a token, el prefill se salta esa parte (en la API de Anthropic, la lectura de caché cuesta ~10 % del token normal). Consecuencia arquitectónica directa: el prompt se ordena de estable a volátil — instrucciones y herramientas primero, documentos después, el turno del usuario al final. Un solo token cambiado invalida todo lo que le sigue.
🧲 Caché semántico (aproximado, por similitud)
Un caché semántico reutiliza la respuesta final cuando llega una consulta
equivalente, no idéntica: se embebe la consulta (clase 100) y se busca en el caché por
similitud; si sim ≥ τ, se devuelve la respuesta almacenada sin llamar al LLM
(GPTCache implementa este patrón).
consulta q:
v ← E(q); (q', r', s) ← vecino más cercano en caché
si s ≥ τ: return r' # HIT: coste ≈ un embedding
si no: r ← pipeline_completo(q); insertar (q, r); return r
El umbral τ gobierna el trade-off: bajo → más aciertos pero falsos aciertos
(responder otra pregunta, el peor fallo posible); alto → caché casi inútil. Además exige
invalidación: si el corpus cambió, las respuestas cacheadas quedan obsoletas aunque
la consulta sea idéntica.
🧮 Ejemplo trabajado
Caché semántico con τ = 0.92. En caché: q' = "¿cómo reinicio mi contraseña?" con su
respuesta r'.
Llegan tres consultas (similitud coseno con q'):
q1 "¿cómo restablezco mi contraseña?" sim = 0.96 ≥ 0.92 → HIT correcto
q2 "¿cómo cambio mi contraseña?" sim = 0.93 ≥ 0.92 → HIT ¿correcto?
q3 "¿cómo reinicio mi router?" sim = 0.85 < 0.92 → MISS → pipeline
q2 es el caso frontera: "cambiar" (conociendo la actual) y "restablecer" (olvidada)
pueden tener procedimientos distintos → falso acierto potencial que τ = 0.92 no detecta.
Economía con 10 000 consultas/día, 40 % hit-rate, 0.9 s y $0.004 por llamada LLM:
ahorro diario ≈ 10 000 · 0.40 · $0.004 = $16/día (~$480/mes)
latencia en hit: ~50 ms (embedding + búsqueda) frente a ~900 ms.
Coste del error: si el 2 % de los hits son falsos → 80 respuestas equivocadas/día.
¿Vale $480/mes ese riesgo? Esa es la decisión real, y depende del dominio.
📊 Propiedades y comparación
| Técnica | Qué reutiliza/reduce | Ahorro típico | Condición de validez | Riesgo principal |
|---|---|---|---|---|
| Presupuesto de contexto | tokens de entrada | proporcional al recorte | medir calidad tras recortar | recortar señal, no ruido |
| LLMLingua (dura) | tokens poco informativos | 2-10× en contexto | tarea tolerante a texto no fluido | perder el dato crítico |
| Resumen (blanda) | historial/documentos | variable | el resumen preserva lo consultado | paráfrasis errónea |
| Prompt caching | prefill de prefijo exacto | ~90 % del coste del prefijo | prefijo idéntico token a token | ordenar mal el prompt |
| Caché semántico | la llamada completa | hit-rate × coste por llamada | sim ≥ τ implica misma intención |
falso acierto |
flowchart TD
Q[Consulta] --> E["embedding E(q)"]
E --> C{"¿sim ≥ τ en caché?"}
C -->|HIT| R0["respuesta cacheada<br/>~50 ms, sin LLM"]
C -->|MISS| P["pipeline RAG completo"]
P --> COMP["compresión de contexto<br/>(LLMLingua / resumen)"]
COMP --> LLM["LLM<br/>prefijo estable cacheado (KV)"]
LLM --> R1[respuesta]
R1 --> INS["insertar (q, r) en caché"]
X["cambio en el corpus"] -.->|invalidación| C
⚠️ Errores conceptuales frecuentes
- Confundir prompt caching con caché semántico. El primero es exacto, por prefijo, ahorra prefill y lo gestiona el proveedor; el segundo es aproximado, por similitud, ahorra la llamada entera y lo gestiona tu sistema. Resuelven problemas distintos y conviven.
- "Comprimir no pierde información". Toda compresión de contexto es con pérdida; la pregunta es si lo perdido afectaba la respuesta, y eso solo lo dice una evaluación antes/después (clase 110).
- Elegir τ sin medir falsos aciertos. Un hit-rate de 60 % es inútil si incluye 5 % de respuestas a otra pregunta; τ se calibra sobre pares etiquetados (equivalente/no equivalente), no a ojo.
- Cachear sin invalidación. Corpus actualizado + caché viejo = respuestas obsoletas servidas con confianza y a máxima velocidad.
- Poner lo volátil al principio del prompt. Un timestamp o el nombre del usuario en la primera línea invalida el KV-cache de todo lo que sigue en cada llamada.
🚀 Del aprendizaje a la operación
Entre este núcleo y una capa de eficiencia operativa faltan: métricas por segmento (hit-rate, tasa de falsos aciertos muestreada por humanos, ahorro neto tras el coste de embeddings y almacenamiento), invalidación conectada al pipeline de ingesta (qué entradas del caché tocan qué documentos), aislamiento del caché por usuario/tenant cuando las respuestas dependen de permisos, calibración periódica de τ con deriva de consultas, y pruebas de regresión de calidad cada vez que se ajusta el ratio de compresión.
🧪 Laboratorio
python lab.py
El laboratorio llama a ai_evolution.labs.run_lab("retrieval"). Esta
decisión evita 183 implementaciones divergentes: cada clase tiene un entrypoint
propio, pero los motores didácticos se prueban como una biblioteca común.
🔍 Evidencia esperada
- tipo de laboratorio y semilla;
- entradas o decisiones observables;
- resultado estructurado;
- lista
evidencecon hechos que pueden inspeccionarse; - lista
limitationsque impide presentar la demo como producción.
📓 Notebooks
- 📓
notebook.ipynb: recorrido guiado con la materia resumida. - ✍️
notebook_student.ipynb: ejercicios para resolver. - ✅
notebook_solution.ipynb: solución de referencia explicada.
📝 Evaluación
| Criterio | Peso |
|---|---|
| Comprensión conceptual | 25 % |
| Ejecución reproducible | 25 % |
| Interpretación basada en evidencia | 25 % |
| Riesgos, límites y mejora propuesta | 25 % |
Consulta assessment.md para preguntas y criterio de aceptación.
⚠️ Errores comunes
| Síntoma | Causa probable | Corrección |
|---|---|---|
| El código corre, pero no hay conclusión | Se confundió ejecución con aprendizaje | Explica qué demuestra y qué no demuestra |
| El resultado cambia sin explicación | No se registró semilla o configuración | Conserva semilla, versión y parámetros |
| Se promete uso real | Se extrapoló desde una demo educativa | Declara entorno, datos, límites y revisión humana |
| Se copia una métrica aislada | No existe baseline ni costo de error | Añade comparación y criterio de decisión |
❓ Preguntas frecuentes
¿Debo usar una API comercial?
No. El núcleo funciona localmente. Las extensiones LIVE se documentan por separado.
¿El laboratorio representa una implementación industrial?
No por sí solo. Enseña el contrato y el patrón; producción exige integración,
seguridad, observabilidad, pruebas y operación.
¿Dónde profundizo?
Revisa las especializaciones enlazadas en el README raíz y la ruta siguiente.
🔗 Referencias
- Jiang, H. et al. (2023). LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models. arXiv:2310.05736 — uso: fuente primaria del mecanismo estudiado
- Jiang, H. et al. (2023). LongLLMLingua: Accelerating and Enhancing LLMs in Long Context Scenarios via Prompt Compression. arXiv:2310.06839 — uso: fuente primaria del mecanismo estudiado
- Liu, N. et al. (2023). Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 — uso: fuente primaria del mecanismo estudiado
- Documentación de Anthropic, Prompt caching: https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching — uso: referencia consultada en su fuente original
- Documentación de GPTCache: https://gptcache.readthedocs.io/ — uso: referencia consultada en su fuente original
📜 Papers que fundamentan esta clase
Bloque generado por
python scripts/link_papers_to_classes.py. La fuente espapers/catalog/papers.json.
| Paper | Año | Qué desbloqueó | Miniatura |
|---|---|---|---|
| P36 · Perdidos en el medio: cómo usan los modelos de lenguaje los contextos largos | 2023 | Tener contexto largo no es usarlo: el rendimiento cae en forma de U cuando el dato relevante está en el medio. | notebook |
| P37 · MemGPT: modelos de lenguaje como sistemas operativos | 2023 | Aplica al contexto la idea de memoria virtual: una jerarquía que da la ilusión de memoria grande sobre una pequeña y rápida. | notebook |
Cada ficha explica el problema anterior, la matemática mínima, los límites y los errores de atribución más frecuentes. Para leerlas con método: cómo leer un paper de IA · anexos matemáticos.
📚 Bibliografía de apoyo
Bloque generado por
python scripts/link_sources_to_classes.py. Cada obra lleva su localizador verificado ensources/bibliography.json.
Los papers dicen de dónde salió el mecanismo. Estas obras lo desarrollan con el espacio que una clase no tiene: teoría completa, demostraciones y ejercicios.
| Obra | Edición | Localizador | Papel en esta clase |
|---|---|---|---|
| Manning, Christopher D., Raghavan, Prabhakar y Schütze, Hinrich — Introduction to Information Retrieval | 2008 | ISBN 9780521865715 · web de la obra | obra de referencia de la parte 08 · toda la parte |
| Jurafsky, Daniel y Martin, James H. — Speech and Language Processing | 2.ª (la 3.ª circula como borrador abierto sin ISBN) · 2009 | ISBN 9780131873216 · web de la obra | obra de referencia de la parte 08 · representaciones vectoriales de significado |
⬅️ Clase anterior
108 — Memoria de corto y largo plazo
➡️ Siguiente clase
110 — Evaluación de fidelidad, cobertura y atribución
📝 Evaluación completa
❓ Preguntas
- Define compresión de contexto y cachés semánticos sin usar una marca o framework como definición.
- Explica la relación entre compression, cache, context, budget.
- Ejecuta
lab.pydos veces con la misma semilla. ¿Qué debe conservarse? - Identifica una afirmación permitida y una afirmación exagerada sobre el resultado.
- Propón una prueba negativa o un caso límite.
🏆 Reto verificable
Amplía el resultado del laboratorio con una clave student_extension que incluya:
- el supuesto que estás probando;
- una medición o comprobación;
- la conclusión;
- una limitación.
✅ Criterio de aceptación
- [ ]
lab.pytermina con código 0. - [ ] El resultado contiene
kind,seed,evidenceylimitations. - [ ] La extensión no modifica el comportamiento de otras clases.
- [ ] La interpretación referencia datos impresos por el laboratorio.
- [ ] Se declara al menos un riesgo o condición de no uso.