Aller au contenu

Historique des conversations

Une longue conversation finit par se heurter à un mur : la fenêtre de contexte du modèle. Tout ce qui figure sur cette page existe à cause de ce mur, et ce qui est intéressant, c’est ce qui est jeté, ce qui est conservé et ce qu’on peut récupérer.

Ce ne sont pas tant des solutions de rechange qu’une échelle, classée du moins cher au plus cher.

Mécanisme Coût Conserve Perd
Élision Rien Chaque mot du récit Les anciens résultats d’outils anodins
Abandon des images Rien Le texte qui les entoure Les anciennes captures d’écran
Instantanés Rien Chaque mot, sous forme de pixels La lisibilité pour un modèle sans vision
Résumé Un appel de modèle Un récit Les détails qu’il n’a pas retenus

L’élision et l’abandon des images passent en premier parce qu’ils sont gratuits et sans perte là où ça compte : ils suppriment du volume que personne n’allait relire.

Pourquoi le résumé est la solution de dernier recours

Section intitulée « Pourquoi le résumé est la solution de dernier recours »

Un résumé est le seul des quatre qui dépense un appel de modèle et le seul qui décide à votre place de ce qui comptait. Ce sont deux coûts bien réels. L’appel est le plus intéressant des deux, à cause du moment où il survient.

Le compactage s’exécute généralement avant le mur, sur un seuil. Mais il s’exécute aussi de façon réactive, après que le fournisseur a lui-même rejeté une requête jugée trop volumineuse — l’estimation heuristique avait sous-estimé ce que le fournisseur a réellement mesuré. Dans ce cas, un compacteur qui résume doit émettre une requête pour réduire le contexte, et la requête qu’il émet est justement celle qui vient de dépasser.

Le compactage par instantanés rend l’historique écarté sur des pages denses de glyphes en pixels et les renvoie sous forme d’images.

Le principe repose sur une particularité de facturation : un modèle de vision facture une image à un tarif forfaitaire ou proportionnel à sa surface, sans aucun rapport avec le nombre de caractères qu’elle contient. Douze mille caractères de conversation écartée coûtent la valeur en jetons de texte de douze mille caractères. Les mêmes caractères rendus sur une seule page coûtent une image.

Ce qui la rend utile, et pas seulement astucieuse, c’est qu’elle ne nécessite aucun appel de modèle, aucune clé et aucun accès réseau. C’est la seule stratégie qui reste toujours disponible pendant la reprise après dépassement.

La forme de reconstruction est la suivante : tête mot pour mot, milieu imagé, queue mot pour mot. La tête, c’est la tâche et les contraintes auxquelles tout ce qui suit se réfère ; la queue, c’est là où se trouve actuellement le travail. Le milieu est ce qui est relu le moins souvent et ce qui coûte le plus cher.

Les instantanés sont rendus à nouveau à partir du texte source conservé à chaque passe, jamais à partir des pixels de la passe précédente. Le fait d’imager une image dégrade les glyphes d’une génération par compactage, jusqu’à ce que plus personne ne puisse les lire.

Ce à partir de quoi une exécution reprend réellement

Section intitulée « Ce à partir de quoi une exécution reprend réellement »

Historiquement, chaque exécution du harnais partait d’un historique vide et reconstruisait la continuité à partir d’un bloc <context> du prompt — un résumé de la conversation plutôt que la conversation. Trois conséquences en découlaient :

  • La reprise était une redite. Le modèle ne voyait jamais son propre raisonnement antérieur ni les octets réellement renvoyés par ses outils, seulement leur description.
  • Le retour en arrière mourait avec le processus. Un checkpoint est un index dans la liste des messages en direct : un redémarrage perdait donc toutes les étiquettes que le modèle avait posées.
  • La relance ne distinguait pas « rien à relancer » de « rien de chargé ». Après un redémarrage, le tour échoué a de toute façon disparu de l’état en direct.

Ces trois points sont corrigés en conservant la transcription de la conversation. Elle est enregistrée à chaque limite de tour, jamais au milieu d’un tour : un historique capturé entre un appel d’outil et son résultat est un historique qu’aucun fournisseur n’acceptera, si bien qu’un plantage à cet instant restaure le tour précédent plutôt qu’un demi-tour impossible à rejouer.

Une exécution reprise est tronquée à ses messages les plus récents, avec une coupure sur une limite qui n’est pas un résultat d’outil orphelin — un résultat dont l’appel a été tronqué est une requête que les fournisseurs rejettent d’emblée, et une transcription impossible à envoyer vaut moins qu’une transcription courte.

Chaque message enregistre celui dont il découle, et chaque conversation nomme sa pointe de branche actuelle. Cette seule décision constitue toute la fonctionnalité.

Créer une branche n’écrit rien. Cela déplace le pointeur. Le chemin que vous avez quitté est toujours là, si bien y revenir est un autre déplacement de pointeur plutôt qu’une restauration — et modifier un prompt pour le relancer cesse de vous coûter la réponse à laquelle vous vous compariez.

Sans cela, toute forme de retour en arrière doit masquer ou supprimer des messages, et le masquage est un mensonge que le lecteur suivant ne peut pas percer.

Branche Duplication
Ce qui se passe Le pointeur se déplace Le chemin est copié
Où cela mène La même conversation Une nouvelle conversation
Coût Rien Une copie de la branche

Une duplication copie avec de nouveaux identifiants plutôt que de partager des lignes. Deux conversations qui partageraient des lignes se montreraient mutuellement leurs messages ultérieurs, exactement ce qu’une duplication ne doit surtout pas faire.

La paire checkpoint / rewind en cours d’exécution marque une limite de tour propre et y revient après une exploration, en conservant une synthèse. Parce que les points de contrôle sont conservés aux côtés de la transcription, une étiquette posée par le modèle avant un redémarrage retombe encore là où elle a été posée. Un point de contrôle dont la cible n’a pas survécu à une troncature est abandonné, et non ramené de force — revenir « à l’étiquette » et atterrir ailleurs est exactement la défaillance qu’une étiquette existe pour empêcher.