История разговоров
Долгий разговор упирается в глухую стену — окно контекста модели. Всё на этой странице существует из-за этой стены, и самое интересное — что выбрасывается, что сохраняется и что можно вернуть.
Четыре способа освободить контекст
Заголовок раздела «Четыре способа освободить контекст»Это не столько альтернативы, сколько лестница, начиная с самого дешёвого.
| Механизм | Стоимость | Сохраняет | Теряет |
|---|---|---|---|
| Элизия | Ничего | Каждое слово повествования | Непримечательные старые результаты инструментов |
| Сброс изображений | Ничего | Текст вокруг них | Старые скриншоты |
| Снимки | Ничего | Каждое слово, в виде пикселей | Читаемость для модели без зрения |
| Суммаризация | Один вызов модели | Повествование | Детали, которые она не отобрала |
Элизия и сброс изображений идут первыми, потому что они бесплатны и без потерь в том смысле, который важен: они выбрасывают объём, который никто не собирался перечитывать.
Почему суммаризация — крайняя мера
Заголовок раздела «Почему суммаризация — крайняя мера»Суммаризация — единственная из четырёх, что тратит вызов модели, и единственная, что решает за вас, что было важно. Оба — настоящие издержки. Вызов интереснее, потому что важен момент, когда он происходит.
Обычно компакция запускается заранее, до стены, по порогу. Но она запускается и реактивно — после того как провайдер сам отклоняет запрос как слишком большой: эвристическая оценка недосчитала то, что провайдер измерил на самом деле. В такой ситуации суммаризирующему компактору приходится делать запрос, чтобы сжать контекст, и этот запрос — тот самый, что только что переполнился.
Компакция снимками отрисовывает отброшенную историю на плотные страницы пиксельных глифов и возвращает их в виде изображений.
В основе — особенность биллинга: модель со зрением берёт за изображение фиксированную плату или плату пропорционально площади, которая никак не связана с тем, сколько в нём символов. Двенадцать тысяч символов отброшенного разговора стоят столько текстовых токенов, сколько приходится на двенадцать тысяч символов. Те же символы, отрисованные на одной странице, стоят одно изображение.
Ценность этого подхода не в остроумии, а в том, что ему нужны ни вызов модели, ни ключ, ни сеть. Это единственная стратегия, которая всегда доступна при восстановлении от переполнения.
Форма восстановления — дословное начало, середина в виде изображения, дословный конец. Начало — это задача и ограничения, к которым отсылает всё последующее; конец — там, где сейчас идёт работа. Середину перечитывают реже всего, но стоит она дороже всего.
Снимки при каждом проходе отрисовываются заново из сохранённого исходного текста, а не из пикселей предыдущего прохода. Отображение изображения ухудшает глифы на одно поколение за каждую компакцию, пока их не сможет прочитать никто.
Из чего на самом деле возобновляется запуск
Заголовок раздела «Из чего на самом деле возобновляется запуск»Исторически каждый запуск харнесса начинался с пустой истории и восстанавливал непрерывность из блока <context> в промпте — сводки разговора, а не самого разговора. Из этого следовали три вещи:
- Возобновление было пересказом. Модель никогда не видела собственные прежние рассуждения или реальные байты, которые вернули её инструменты, — только их описание.
- Перемотка умирала вместе с процессом.
checkpoint— это индекс в списке живых сообщений, поэтому перезапуск терял каждую метку, поставленную моделью. - Повтор не мог отличить «нечего повторять» от «ничего не загружено». После перезапуска неудавшийся ход в любом случае исчезает из живого состояния.
Все три проблемы решает сохранение транскрипта. Он сохраняется на каждой границе хода и никогда посреди хода: история, снятая между вызовом инструмента и его результатом, — это то, что не примет ни один провайдер, поэтому сбой в этот момент восстанавливает ход до, а не половинчатый ход, который невозможно воспроизвести.
Возобновлённый запуск обрезается до новейших сообщений, причём обрезка приходится на границу, которая не является осиротевшим результатом инструмента: результат, чей вызов был обрезан, — это запрос, который провайдеры отвергают сразу, а транскрипт, который нельзя отправить, хуже короткого.
Дерево сессии
Заголовок раздела «Дерево сессии»Каждое сообщение записывает то, от которого оно продолжается, и каждый разговор называет свою текущую верхушку ветки. Это единственное решение и есть вся функция.
Ветвление ничего не записывает. Оно перемещает указатель. Оставленный вами путь никуда не исчезает, поэтому возврат к нему — это ещё одно перемещение указателя, а не восстановление, и редактирование промпта для повторного запуска перестаёт стоить вам ответа, с которым вы сравнивали.
Без него любая форма возврата вынуждена скрывать или удалять сообщения, а скрытие — это ложь, которую следующий читатель не может распознать.
Ветка против форка
Заголовок раздела «Ветка против форка»| Ветка | Форк | |
|---|---|---|
| Что происходит | Указатель перемещается | Путь копируется |
| Куда ведёт | Тот же разговор | Новый разговор |
| Стоимость | Ничего | Одна копия ветки |
Форк копирует с новыми идентификаторами, а не делит строки. Два разговора, делящие строки, показывали бы друг другу более поздние сообщения — а это как раз то, чего форк не должен допускать.
Перемотка едет по тому же указателю
Заголовок раздела «Перемотка едет по тому же указателю»Пара checkpoint / rewind внутри запуска отмечает чистую границу хода и возвращается к ней после исследования, сохраняя дайджест. Поскольку чекпойнты сохраняются вместе с транскриптом, метка, поставленная моделью до перезапуска, всё равно ведёт туда, где она была поставлена. Чекпойнт, цель которого не пережила обрезку, отбрасывается, а не подтягивается до ближайшей границы: перемотка «к метке» с приземлением в другом месте — это ровно тот сбой, ради предотвращения которого метка и существует.
См. также
Заголовок раздела «См. также»- Ответвить разговор — навигатор по дереву, форк и экспорт
- Контекст инструментов и кэш промптов — вторая половина того, что заполняет окно контекста
- Slash-команды —
/compact,/shake,/context,/tree