Lección 4: Compactación y notas: gestión de contexto para tareas largas
Objetivos de aprendizaje:
- Enunciar qué es la compactación y cómo se implementa: cuando una conversación se acerca al límite de la ventana, se le entrega el historial de mensajes al modelo para que lo resuma y luego se reinicia una ventana nueva a partir de ese resumen
- Escribir la instrucción de resumen y la lista de qué conservar y qué descartar de una compactación, siguiendo la regla: preservar decisiones arquitectónicas y bugs sin resolver, descartar resultados de herramientas redundantes
- Distinguir los papeles de la compactación y de las notas estructuradas, y diseñar un esquema de notas escritas sobre la marcha para un agente de tarea larga
Requisitos: Terminaste las Lecciones 1 a 3 de este curso y sabes escribir a mano el bucle del arnés del curso 7 de esta serie, «Fundamentos del arnés de agente: bucles y control» | Anterior: Lección 3 << | Siguiente: Lección 5 >>
Una tarea que una sola ventana no aguanta
Empecemos por una escena con la que vas a toparte pronto. Tomas el arnés que escribiste a mano en el curso 7 de esta serie, «Fundamentos del arnés de agente: bucles y control», y lo apuntas a una tarea de depuración: arreglar una condición de carrera que solo aparece bajo concurrencia. El agente lee archivos, ejecuta pruebas, edita código, vuelve a ejecutar las pruebas — cuarenta y tantos turnos después la tarea sigue sin terminar, pero el historial de mensajes se ha hinchado más allá de los cien mil tokens y la ventana está a punto de llenarse.
Las cuatro válvulas de control del curso 7 (turnos máximos, presupuesto, detección de giro en vacío, la válvula de aprobación) no sirven de nada aquí. Gobiernan el «no dejes que el bucle se desboque», pero el bucle se está portando bien: la tarea misma es simplemente larga. Eso no es un accidente; es la naturaleza del bucle: "An agent running in a loop generates more and more data that could be relevant for the next turn of inference"1 (un agente que se ejecuta en un bucle genera cada vez más datos que podrían ser relevantes para el siguiente turno de inferencia) — resultados de herramientas, conclusiones intermedias, intentos fallidos, todo amontonándose en el historial de mensajes.
Y la ventana no es gratis. Un modelo que analiza grandes volúmenes de contexto echa mano de un «presupuesto de atención», y "Every new token introduced depletes this budget by some amount."1 (cada nuevo token introducido agota ese presupuesto en cierta medida). Cuantos más tokens se acumulan, peor se le da al modelo recordar con precisión: "as the number of tokens in the context window increases, the model's ability to accurately recall information from that context decreases"1 (a medida que aumenta el número de tokens en la ventana de contexto, la capacidad del modelo de recordar con precisión información de ese contexto disminuye) — una pendiente suave hacia abajo más que un precipicio, pero cuesta abajo al fin y al cabo, así que "context, therefore, must be treated as a finite resource with diminishing marginal returns."1 (el contexto, por tanto, debe tratarse como un recurso finito con rendimientos marginales decrecientes). La documentación de buenas prácticas de Claude Code lo dice de forma más directa — "Claude's context window fills up fast, and performance degrades as it fills," y "The context window is the most important resource to manage."2 (la ventana de contexto de Claude se llena rápido y el rendimiento se degrada a medida que se llena; la ventana de contexto es el recurso más importante que hay que gestionar).
Cuando una tarea se alarga más de lo que una sola ventana aguanta, tienes dos armas: la compactación y las notas estructuradas. Esta lección trabaja las dos.
Compactación: resumir y luego abrir una ventana nueva
La compactación es exactamente lo que dice el nombre: "taking a conversation nearing the context window limit, summarizing its contents, and reinitiating a new context window."1 (tomar una conversación que se acerca al límite de la ventana de contexto, resumir su contenido y reiniciar una ventana de contexto nueva). Fíjate en la última parte: no metes el resumen de vuelta en la conversación vieja para seguir apretujando; reinicias. La ventana vieja se abandona entera y la nueva viaja ligera, cargando solo el prompt del sistema y el resumen.
La implementación es más llana de lo que suena: es "passing the message history to the model to summarize and compress the most critical details."1 (pasarle el historial de mensajes al modelo para que resuma y comprima los detalles más críticos). Lo que significa que la compactación es en sí misma una llamada extra al modelo. En código se ve más o menos así (formatHistory solo une el arreglo de mensajes en texto plano legible; se omite la implementación):
Empalmarlo en aquel bucle del curso 7 requiere una sola idea más: al inicio de cada turno, revisa el uso de tokens del historial de mensajes y, en cuanto se acerque al límite, llama a compact() y reemplaza el arreglo messages entero con el valor de retorno. Construir esto de verdad dentro del arnés — cómo fijar el umbral de disparo, qué hacer cuando la compactación falla — es el material práctico de la Lección 6; por ahora, basta con tener clara la mecánica.
El arte de la compactación: qué conservar, qué descartar
La parte difícil de la compactación no es «cómo resumir», sino «qué conservar y qué descartar». La dirección en realidad está clara: "preserves architectural decisions, unresolved bugs, and implementation details while discarding redundant tool outputs."1 (preserva decisiones arquitectónicas, bugs sin resolver y detalles de implementación, mientras descarta resultados de herramientas redundantes).
¿Por qué esa disyuntiva? Imagina al agente «despertando» en la ventana nueva; ese resumen es toda su memoria. El costo de comprimir en la dirección equivocada es concreto: digamos que tu instrucción de resumen solo dice «resume brevemente el contenido de la conversación», y el modelo deja caer sin darle importancia que «hay una condición de carrera sin terminar en orders/service.js» — el agente despierta viendo únicamente registros marcados como «completo», así que o declara el trabajo terminado o hurga en cosas que ya arreglaste. Una compactación, y cuarenta turnos de trabajo se acaban de descarrilar.
Dale la vuelta: los resultados de herramientas redundantes es el blanco más jugoso. Un grep devuelve 200 líneas coincidentes; la señal útil ya quedó capturada en la conclusión del paso siguiente, «acotado a la función updateStatus». Las 200 líneas crudas que se quedan ahí solo queman presupuesto de atención y no le agregan casi ningún valor de decisión al siguiente movimiento.1
Una autocomprobación práctica: después de escribir la instrucción de resumen, toma una conversación larga real y compáctala una vez; luego responde tres preguntas usando solo el resumen — «qué debería pasar a continuación», «qué decisiones están cerradas», «qué huecos siguen sin tapar». Si las tres salen limpias, las reglas de conservar y descartar de tu instrucción aprueban; si alguna se queda en blanco, vuelve y parchea esa regla de conservación.
La compactación en producción: autocompactación y /clear
La herramienta que usas a diario tiene una referencia lista. Claude Code "automatically compacts conversation history when you approach context limits, which preserves important code and decisions while freeing space"2 (compacta automáticamente el historial de conversación cuando te acercas a los límites de contexto, lo que preserva código y decisiones importantes mientras libera espacio) — la misma mecánica del compact() escrito a mano de arriba, solo que productizada, con el disparo y las reglas de conservar y descartar ya resueltos.
Pero la compactación no es la única opción. Si estás cambiando a una tarea nueva sin relación con la anterior, el contexto viejo no solo es inútil: es dañino, porque "Long sessions with irrelevant context can reduce performance."2 (las sesiones largas con contexto irrelevante pueden reducir el rendimiento). Llegado ese punto, la documentación dice "Run /clear between unrelated tasks to reset the context window entirely"2 (ejecuta /clear entre tareas sin relación para reiniciar por completo la ventana de contexto) — sin resumir, sin preservar, un reinicio total. El razonamiento es simple: la compactación cuesta una llamada al modelo y carga con el riesgo de equivocarse al decidir qué conservar y qué descartar; para una tarea sin relación, limpiar de plano sale más barato y más limpio. La compactación sirve al «la misma tarea todavía no termina», mientras que /clear sirve al «ahora estoy haciendo otra cosa».
Esa documentación tiene además una línea que vale la pena tener a mano: "A clean session with a better prompt almost always outperforms a long session with accumulated corrections."2 (una sesión limpia con un mejor prompt casi siempre supera a una sesión larga con correcciones acumuladas). Traducido: cuando el historial de una sesión es sobre todo «no, inténtalo otra vez» y «sigue mal», el valor histórico para el paso siguiente es probablemente negativo — reabrir una sesión y incorporar la lección directamente en un prompt nuevo suele ganarle a arrastrar todo ese lastre.
Notas estructuradas: escribir el estado clave fuera de la ventana
La compactación tiene una debilidad de fábrica: es reactiva. Esperas a que la ventana esté casi llena y solo entonces miras atrás y resumes, así que lo que sobrevive depende por entero del juicio de ese momento — y el juicio puede fallar. ¿Hay alguna manera de preservar la información mientras está fresca?
Sí, y es llana: "the agent regularly writes notes persisted to memory outside of the context window."1 (el agente escribe con regularidad notas que se persisten en memoria fuera de la ventana de contexto). "Like Claude Code creating a to-do list, or your custom agent maintaining a NOTES.md file."1 (como Claude Code creando una lista de pendientes, o tu agente propio manteniendo un archivo NOTES.md). Retoma aquella tarea inicial de la condición de carrera; un juego de notas que aprueba se ve más o menos así:
El cableado es algo que aprendiste en el curso 7: dale al agente una herramienta de escritura de archivos y luego agrega un requisito al prompt del sistema — «cada vez que tomes una decisión importante, descubras un problema nuevo o termines una etapa, actualiza NOTES.md primero y después continúa». De ahí en adelante, el estado clave de la ventana tiene una copia de respaldo fuera de la ventana. No importa cómo se compacte o se reinicie la ventana: las notas están en disco, y lo primero que hace la ventana nueva es leerlas de vuelta.
Este truco no es exclusivo de tareas de programación. "Claude playing Pokémon demonstrates how memory transforms agent capabilities in non-coding domains."1 (Claude jugando Pokémon demuestra cómo la memoria transforma las capacidades del agente en dominios que no son de programación). El sistema de investigación multiagente de Anthropic hace lo mismo para tareas largas: "agents summarize completed work phases and store essential information in external memory."3 (los agentes resumen las fases de trabajo completadas y guardan la información esencial en memoria externa).
División del trabajo: la compactación como red, las notas como rutina
Pon las dos armas lado a lado y la división del trabajo se aclara. La compactación es pasiva: se dispara cuando la ventana se acerca a su límite, en un momento que tú no eliges, y pierde información — lo que sobrevive depende del juicio de conservar y descartar de ese instante. Las notas son activas: escribes el estado clave en el momento en que nace, el contenido no se pierde, y el costo son unas pocas líneas de escritura a archivo cada vez. En una frase: las notas son la rutina diaria, la compactación es la red de seguridad.
Las dos no chocan; se refuerzan. Cuanto más diligentes sean tus notas, más leve es la consecuencia de que la compactación deje caer algo — si el resumen se salta un detalle, las notas todavía lo tienen. Yendo en la otra dirección, tener a la compactación como red significa que las notas no tienen que ser exhaustivas, solo cubrir las pocas categorías que «el agente debe saber al despertar».
El sentido de la proporción también importa. No toda tarea se gana esta maquinaria: la guía de Anthropic es "you should consider adding complexity only when it demonstrably improves outcomes."4 (habría que considerar agregar complejidad solo cuando mejora los resultados de forma demostrable). Fíjate en el verbo: considerar. Es una postura de sopesar, no una prohibición. Para una tarea que termina en diez turnos, tanto la compactación como las notas son piezas de repuesto; empieza con el bucle más simple y agrégalas cuando de verdad choques con el techo.
Dos límites finales, para que no pierdas tiempo buscando respuestas que esta lección no cubre:
- La persistencia entre sesiones de los archivos de notas — cómo organizarlos, cómo recuperarlos en una sesión nueva, el mantenimiento a largo plazo — es el tema del curso 5 de esta serie, «Memoria y estado del agente». Esta lección solo se ocupa de cómo las notas aligeran la carga de la ventana dentro de una misma tarea larga.
- Manejar tareas de horizonte largo tiene en realidad tres movimientos: "compaction, structured note-taking, and multi-agent architectures,"1 (compactación, toma de notas estructurada y arquitecturas multiagente), todos apuntados a que los agentes puedan "maintain coherence, context, and goal-directed behavior over sequences of actions."1 (mantener coherencia, contexto y comportamiento dirigido a objetivos a lo largo de secuencias de acciones). Los dos primeros ya están; el tercero — repartir la tarea entre subagentes que llevan ventanas limpias — es la Lección 5.
Resumen
- Compactación = cuando una conversación se acerca al límite de la ventana, "passing the message history to the model to summarize and compress the most critical details,"1 y luego "reinitiating a new context window"1 a partir de ese resumen — reiniciar, no anexar de vuelta a la conversación vieja
- El arte de la compactación está en la elección de qué conservar y qué descartar: "preserves architectural decisions, unresolved bugs, and implementation details while discarding redundant tool outputs";1 comprime en la dirección equivocada y el agente despierta sin recordar qué estaba haciendo
- Claude Code "automatically compacts conversation history when you approach context limits, which preserves important code and decisions"2; entre tareas sin relación se usa
/clearpara un reinicio total — "A clean session with a better prompt almost always outperforms a long session with accumulated corrections"2 - Notas estructuradas: "the agent regularly writes notes persisted to memory outside of the context window" (lista de pendientes,
NOTES.md);1 la compactación es red de seguridad pasiva y con pérdidas, las notas son externalización activa escrita sobre la marcha - Los tres movimientos para tareas de horizonte largo son "compaction, structured note-taking, and multi-agent architectures";1 los dos primeros ya están en mano, el tercero es la Lección 5. La persistencia de notas entre sesiones es el tema del curso 5 de esta serie, «Memoria y estado del agente»
>> Lección 5: Subagentes y aislamiento de contexto
Footnotes
-
Effective context engineering for AI agents — Anthropic Engineering — https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18
-
Best practices for Claude Code — Claude Code Docs — https://code.claude.com/docs/en/best-practices ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
How we built our multi-agent research system — Anthropic Engineering — https://www.anthropic.com/engineering/multi-agent-research-system ↩
-
Building Effective AI Agents — Anthropic Engineering — https://www.anthropic.com/engineering/building-effective-agents ↩
Ejercicios
Alguien escribió esta función de «compactación» para el arnés y la llama cuando la ventana está casi llena:
Nivel 2: Diagnosticar la «amnesia después de compactar»Después de engancharla, el agente disparó la compactación en el turno 45. Entonces observaste dos síntomas: primero, en el turno 47 volvió a abrir el debate sobre «si el framework de pruebas debería ser node:test o vitest», una pregunta ya decidida en el turno 3 a favor de vitest; segundo, nunca volvió a mencionar el bug de carrera sin resolver registrado en el turno 5, y unos turnos después declaró la tarea terminada. Explica la causa de ambos síntomas y da un arreglo en dos capas.