logo
Desarrollo
Buscar
Estrategia de compresión de contexto en 5 capas

Estrategia de compresión de contexto en 5 capas

Descripción general

En escenarios de conversaciones largas, la cantidad de tokens del contexto se acerca progresivamente al límite de la ventana de contexto del modelo. El sistema adopta un esquema en cascada de tres capas de arquitectura y cinco estrategias de compresión, que gestiona de forma inteligente la longitud del contexto sin comprometer la calidad de la conversación.


Resumen de estrategias

Estrategia de compresión de contexto-CN

Número Capa Nombre de la estrategia Condición de activación Modo de procesamiento
Layer 1 Truncamiento del resultado de una sola herramienta El resultado de una sola herramienta supera el 50 % del contexto Truncar hasta el presupuesto, cortando en un límite de salto de línea
Layer 1 Compactación de resultados de herramientas antiguos La entrada total supera el 75 % del contexto Sustituir los resultados de herramientas de la lista blanca por marcadores de posición
Layer 2 Poda del historial de mensajes El LLM devuelve un error de desbordamiento de contexto Conservar los mensajes clave y podar el historial intermedio
Layer 3 Resumen completo con LLM La Layer 2 no basta para aliviar la presión Resumen por bloques + fusión, formato estructurado de 9 secciones
Layer 3 Degradación con resumen parcial El resumen con LLM falla Reintentar tras excluir los mensajes muy grandes y, finalmente, degradar a una notificación en texto plano

Layer 1: Truncamiento preventivo de resultados de herramientas

Momento de activación: se ejecuta automáticamente antes de cada llamada al LLM (de forma preventiva, sin esperar a que se produzca el desbordamiento).

Estrategia ① — Truncamiento del resultado de una sola herramienta

Cuando el resultado de una sola herramienta supera el 50 % de la ventana de contexto, se trunca hasta el presupuesto:

Salida original de la herramienta (demasiado larga) │ ├── Conservar los primeros N caracteres (cortando en un límite de salto de línea) └── Añadir la marca: [truncated: output exceeded context limit]
                      
                      Salida original de la herramienta (demasiado larga)
│
├── Conservar los primeros N caracteres (cortando en un límite de salto de línea)
└── Añadir la marca: [truncated: output exceeded context limit]

                    
Este bloque de código en una ventana flotante

Constante clave:

  • SINGLE_TOOL_RESULT_CONTEXT_SHARE = 0.5 (proporción máxima de una sola herramienta)

Estrategia ② — Compactación de resultados de herramientas antiguos

Cuando la entrada total supera el 75 % de la ventana de contexto, se compactan los resultados empezando por la herramienta más antigua:

Historial de llamadas a herramientas (secuencia temporal) │ ├── Resultado de herramienta más reciente → conservar el contenido completo ├── Resultado de herramienta más nuevo → conservar el contenido completo ├── Resultado de herramienta más antiguo → [compacted: tool output removed to free context] └── Resultado de herramienta más viejo → [compacted: tool output removed to free context]
                      
                      Historial de llamadas a herramientas (secuencia temporal)
│
├── Resultado de herramienta más reciente → conservar el contenido completo
├── Resultado de herramienta más nuevo → conservar el contenido completo
├── Resultado de herramienta más antiguo → [compacted: tool output removed to free context]
└── Resultado de herramienta más viejo → [compacted: tool output removed to free context]

                    
Este bloque de código en una ventana flotante

Mecanismo de lista blanca: la compactación solo se aplica a las siguientes herramientas de salida elevada:

  • Read File, Bash, Grep, Glob, Search Files, Web Fetch, Edit

La salida de herramientas del tipo Write/Create se conserva siempre, porque su salida es la base de operaciones posteriores.

Constante clave:

  • CONTEXT_INPUT_HEADROOM_RATIO = 0.75 (proporción máxima de la entrada total)

Layer 2: Detección de desbordamiento y poda del historial de mensajes

Momento de activación: se activa de forma pasiva cuando el LLM devuelve un error de desbordamiento de contexto.

Estrategia ③ — Poda del historial de mensajes

Se podan los mensajes intermedios del historial y se conservan los mensajes clave:

Historial de mensajes │ ├── System Prompt ← se conserva siempre ├── Primer mensaje del usuario ← se conserva siempre ├── Mensajes con _pin: true ← se conserva siempre ├── ........ historial intermedio ........ ← se poda (se sustituye por una notificación) ├── [context compacted: X earlier messages removed] ├── Últimos N mensajes ← se conservan (N = min(6, ⌊total/3⌋)) └── Mensaje actual ← se conserva
                      
                      Historial de mensajes
│
├── System Prompt                    ← se conserva siempre
├── Primer mensaje del usuario        ← se conserva siempre
├── Mensajes con _pin: true           ← se conserva siempre
├── ........ historial intermedio ........       ← se poda (se sustituye por una notificación)
├── [context compacted: X earlier messages removed]
├── Últimos N mensajes                ← se conservan (N = min(6, ⌊total/3⌋))
└── Mensaje actual                    ← se conserva

                    
Este bloque de código en una ventana flotante

Tras la poda se reparan automáticamente los pares de herramientas huérfanos (un tool_use sin su tool_result correspondiente, o viceversa) para garantizar que el formato de los mensajes sea válido.


Layer 3: Resumen inteligente con LLM

Momento de activación: se activa cuando, tras la poda de la Layer 2, sigue sin bastar para aliviar la presión del contexto.

Estrategia ④ — Resumen completo

Se utiliza una llamada independiente al LLM para resumir de forma estructurada los mensajes del historial:

Formato de resumen de 9 secciones:

  1. Intención y objetivos del usuario
  2. Conceptos y términos clave
  3. Archivos y rutas implicados
  4. Errores encontrados y sus soluciones
  5. Enfoque de resolución de problemas
  6. Mensajes clave del usuario
  7. Tareas pendientes
  8. Progreso actual del trabajo
  9. Plan para el siguiente paso

Estrategia de fragmentación: cuando los mensajes superan los 50 000 caracteres, se dividen en un máximo de 4 bloques que se resumen por separado y luego se fusionan en el resumen final.

Estrategia ⑤ — Degradación con resumen parcial

Cuando el resumen completo falla, se ejecuta una degradación en tres niveles:

Nivel de degradación Modo de procesamiento
Level 1 Excluir los mensajes muy grandes (>50 000 caracteres) y reintentar el resumen con los mensajes restantes
Level 2 Añadir la nota [Note: X oversized message(s) were excluded]
Level 3 Devolver una notificación en texto plano [Summary unavailable — X messages could not be summarized]

Resumen de constantes clave

Constante Valor Descripción
CONTEXT_INPUT_HEADROOM_RATIO 0.75 Proporción máxima de la entrada total de la Layer 1
SINGLE_TOOL_RESULT_CONTEXT_SHARE 0.5 Proporción máxima de una sola herramienta de la Layer 1
MAX_OVERFLOW_COMPACTION_ATTEMPTS 5 Número máximo de reintentos de compresión
COMPACT_MAX_OUTPUT_TOKENS 20,000 Límite de salida de la llamada al LLM de resumen
COMPACT_BUFFER_TOKENS 13,000 Búfer del umbral de compactación
CHARS_PER_TOKEN 4 Caracteres por token del texto normal
TOOL_RESULT_CHARS_PER_TOKEN 2 Caracteres por token de los resultados de herramientas (más densos)

Calibración de tokens con EMA

El sistema utiliza una media móvil exponencial para calibrar dinámicamente la estimación de chars-per-token:

Fase Método de calibración
Inicial 3.0 chars/token (conservador, adaptado al chino + código)
Primeras 3 llamadas al LLM Convergencia por media
Posteriores Seguimiento suavizado con EMA α=0.15
Filtrado de anomalías Se ignora todo lo que quede fuera del rango 0.5 < observed < 8

Diagrama de flujo de compresión

Antes de cada llamada al LLM │ ├── Layer 1: enforceToolResultBudget() │ ├── Truncamiento de una sola herramienta (>50 % del contexto) │ └── Compactación de herramientas antiguas (entrada total >75 % del contexto) │ ├── shouldPreemptiveCompact() ? │ └── Sí → compact() (poda de la Layer 2) │ └── Llamada al LLM │ ├── Éxito → continuar └── Error de desbordamiento → getRetryStrategy() │ ├── compact() (Layer 2) │ │ │ └── Sigue sin bastar → compactWithSummary() (Layer 3) │ ├── summarizeMessagesFull() (estrategia ④) │ ├── Fallo → summarizeMessagesPartial() (estrategia ⑤ Level 1-2) │ └── Fallo total → bare notice (estrategia ⑤ Level 3) │ └── Reintentar la llamada al LLM (hasta 5 veces)
                      
                      Antes de cada llamada al LLM
    │
    ├── Layer 1: enforceToolResultBudget()
    │   ├── Truncamiento de una sola herramienta (>50 % del contexto)
    │   └── Compactación de herramientas antiguas (entrada total >75 % del contexto)
    │
    ├── shouldPreemptiveCompact() ?
    │   └── Sí → compact() (poda de la Layer 2)
    │
    └── Llamada al LLM
        │
        ├── Éxito → continuar
        └── Error de desbordamiento → getRetryStrategy()
            │
            ├── compact() (Layer 2)
            │   │
            │   └── Sigue sin bastar → compactWithSummary() (Layer 3)
            │       ├── summarizeMessagesFull() (estrategia ④)
            │       ├── Fallo → summarizeMessagesPartial() (estrategia ⑤ Level 1-2)
            │       └── Fallo total → bare notice (estrategia ⑤ Level 3)
            │
            └── Reintentar la llamada al LLM (hasta 5 veces)

                    
Este bloque de código en una ventana flotante


Qué significa para ti

La compresión de contexto es la razón del fenómeno de que "el Agente olvida lo anterior" que puedes percibir en conversaciones largas. No es un bug, sino el mecanismo mediante el cual el sistema gestiona la información de forma inteligente dentro de una ventana de contexto limitada.

Fenómenos que podrías observar:

  • En una conversación larga, el Agente de repente "no recuerda" el requisito que mencionaste al principio → esto se debe a que la Layer 2/3 ha comprimido los mensajes iniciales
  • El Agente dice "según lo comentado antes...", pero los detalles pueden no ser del todo exactos → tras la compresión solo se conservó el resumen
  • Los resultados históricos de las llamadas a herramientas se convirtieron en [compacted] → esto se debe a que la Layer 1 ha compactado las salidas de herramientas antiguas

Cómo puedes afrontarlo:

  • Di "recuerda esto" para la información clave: activa el sistema de memoria para almacenarla, sin verse afectada por la compresión de contexto
  • Reformula los requisitos clave: en conversaciones largas, reformula periódicamente tus requisitos esenciales
  • Elige modelos con contexto grande: GPT-4.1 (1M) o Claude (200K) pueden conservar más contexto que DeepSeek (64K)
  • Abre una conversación nueva: si la conversación ya es muy larga y caótica, abrir una nueva puede ser más eficiente que continuar

Documentos relacionados