Ir al contenido

Historial de conversación

Una conversación larga acaba chocando con un muro infranqueable: la ventana de contexto del modelo. Todo lo que hay en esta página existe por culpa de ese muro, y lo interesante es qué se descarta, qué se conserva y qué se puede recuperar.

Más que alternativas, son una escalera, empezando por lo más barato.

Mecanismo Coste Conserva Pierde
Elisión Nada Cada palabra de la narración Resultados de herramientas antiguos sin incidencias
Descarte de imágenes Nada El texto que las rodea Capturas de pantalla antiguas
Instantáneas Nada Cada palabra, como píxeles Legibilidad para un modelo sin visión
Resumen Una llamada al modelo Una narración Los detalles que no eligió

La elisión y el descarte se ejecutan primero porque son gratis y sin pérdidas en lo que importa: eliminan volumen que nadie iba a releer.

Un resumen es el único de los cuatro que gasta una llamada al modelo y el único que decide por ti qué importaba. Ambos son costes reales. La llamada es la más interesante, por cuándo ocurre.

La compactación suele ejecutarse por delante del muro, con un umbral. Pero también se ejecuta de forma reactiva, después de que el propio proveedor rechace una petición por ser demasiado grande: la estimación heurística subestimó lo que el proveedor midió en realidad. En esa situación, un compactador que resume tiene que hacer una petición para reducir el contexto, y la petición que hace es justo la que se acaba de desbordar.

La compactación por instantáneas representa el historial descartado en páginas densas de glifos en píxeles y lo devuelve como imágenes.

La premisa es una peculiaridad de la facturación: un modelo con visión cobra por una imagen a un precio fijo o proporcional al área, que no tiene nada que ver con cuántos caracteres contiene. Doce mil caracteres de conversación descartada cuestan el equivalente a doce mil caracteres en tokens de texto. Esos mismos caracteres representados en una sola página cuestan una imagen.

Lo que hace que merezca la pena, y no sea solo una astucia, es que no necesita ni llamada al modelo, ni clave, ni red. Es la única estrategia siempre disponible durante la recuperación de un desbordamiento.

La forma de la reconstrucción es cabecera literal, parte central como imagen y cola literal. La cabecera es la tarea y las restricciones a las que remite todo lo que viene después; la cola es donde está el trabajo en ese momento. La parte central es lo que menos se relee y más cuesta.

Las instantáneas se vuelven a representar a partir del texto de origen conservado en cada pasada, nunca a partir de los píxeles de la pasada anterior. Representar como imagen una imagen ya existente degrada los glifos una generación por compactación, hasta que nadie puede leerlos.

Históricamente, cada ejecución del arnés partía de un historial vacío y reconstruía la continuidad a partir de un bloque <context> del prompt: un resumen de la conversación en lugar de la conversación. De ahí se derivaban tres cosas:

  • Reanudar era volver a contarlo. El modelo nunca veía su propio razonamiento anterior ni los bytes reales que devolvían sus herramientas, solo una descripción de ellos.
  • Rebobinar moría con el proceso. Un checkpoint es un índice dentro de la lista de mensajes activos, así que un reinicio perdía todas las etiquetas que el modelo había puesto.
  • Reintentar no distinguía «no hay nada que reintentar» de «no se cargó nada». Tras un reinicio, el turno fallido desaparece del estado activo en ambos casos.

Los tres se resuelven persistiendo la transcripción. Se guarda en cada límite de turno y nunca a mitad de turno: un historial capturado entre una llamada a una herramienta y su resultado es uno que ningún proveedor aceptará, así que un fallo en ese instante restaura el turno anterior en lugar de un medio turno que no se puede reproducir.

Una ejecución reanudada se recorta a sus mensajes más recientes, cortando en un límite que no sea el resultado huérfano de una herramienta: un resultado cuya llamada se recortó es una petición que los proveedores rechazan de plano, y una transcripción que no se puede enviar es peor que una corta.

Cada mensaje registra aquel del que continúa, y cada conversación nombra su extremo de rama actual. Esa única decisión es toda la función.

Ramificar no escribe nada. Mueve el puntero. El camino que dejaste sigue ahí, así que volver a cambiar es otro movimiento de puntero en lugar de una restauración, y editar un prompt para volver a ejecutarlo deja de costarte la respuesta con la que estabas comparando.

Sin esto, cualquier forma de volver atrás tiene que ocultar o eliminar mensajes, y ocultar es una mentira que el siguiente lector no puede descubrir.

Rama Bifurcación
Qué ocurre El puntero se mueve Se copia el camino
Dónde va La misma conversación Una conversación nueva
Coste Nada Una copia de la rama

Una bifurcación copia con ids nuevos en lugar de compartir filas. Dos conversaciones que compartieran filas se mostrarían los mensajes posteriores de la otra, que es justo lo único que una bifurcación no debe hacer.

El par checkpoint / rewind dentro de la ejecución marca un límite de turno limpio y vuelve a él después de una exploración, conservando un resumen. Como los checkpoints se persisten junto a la transcripción, una etiqueta que el modelo puso antes de un reinicio sigue aterrizando donde se puso. Un checkpoint cuyo destino no sobrevivió a un recorte se descarta, no se ajusta: rebobinar «hasta la etiqueta» y aterrizar en otro sitio es exactamente el fallo que una etiqueta existe para evitar.