Сводка часового разговора, сделанная моделью по умолчанию, звучит так: «Обсудили проект, договорились о сроках, наметили следующие шаги». Ни одного имени, ни одной даты, ни одного решения. Через неделю вы спросите «какой мы поставили дедлайн» — и в памяти будет ровно то, что процитировано выше.
Это не плохая модель. Это плохая постановка задачи: «кратко перескажи» и «сохрани то, что потом спросят» — разные требования, и первое систематически убивает второе.
#Зачем и когда сжимать
Сжатие нужно в двух ситуациях, и только в них.
Диалог перерос окно. История одной беседы не помещается целиком, а обрезать начало нельзя: там договорённости.
Архив перерос полезность. Сообщений накопились тысячи, они дословно уже не нужны, но выводы из них нужны.
В остальных случаях сжимать не надо. Сводка вместо доступного дословного текста — чистая потеря: она не экономит ничего важного и лишает вас формулировок. Если история помещается — держите её как есть, а нужное доставайте поиском; общая механика слоёв разобрана в статье о том, как работает память у ИИ.
#Что понадобится
- Языковая модель, которой можно доверить один вызов на каждые несколько десятков сообщений. Тяжёлая не нужна: задача не творческая.
- Порог срабатывания — сколько сообщений накопить, прежде чем сворачивать.
- Хвост, который остаётся дословным. Последние N сообщений не сворачиваются никогда, иначе ассистент теряет нить прямо посреди разговора.
- Отметка, до какого места уже свёрнуто. Без неё вы будете пересказывать одно и то же по кругу.
#Шаг 1. Выбрать порог и размер хвоста
Правило: хвост должен покрывать текущую тему разговора целиком, порог — быть заметно больше хвоста, чтобы сворачивание случалось редко.
В Persona это тридцать и шестнадцать: сессия сворачивается, когда сообщений становится больше тридцати, и последние шестнадцать остаются дословными (maybe_summarise в app/chat/sessions.py). Дальше в промпт идёт сводка как отдельная системная реплика плюс дословный хвост.
Ошибка, которую делают чаще всего, — маленький хвост. Восемь сообщений — это четыре обмена репликами; в живом разговоре тема живёт дольше, и ассистент начинает переспрашивать то, что вы сказали пять минут назад.
#Шаг 2. Сворачивать накопительно, а не заново
Два способа обновить сводку.
Пересобрать всё с нуля. Взять весь диалог, попросить новую сводку. Качество выше, стоимость растёт линейно с длиной беседы, и на длинной сессии становится неприемлемой.
Обновить существующую. Дать модели текущую сводку и только новые сообщения, попросить обновлённую версию. Стоимость постоянна.
Второй способ обязателен для длинных диалогов, но у него есть накопительный дефект: сводка сводки сводки постепенно теряет детали, которые не упоминались в последних сообщениях. Через десять итераций от исходных договорённостей может остаться одна строчка.
Практическая защита — просить не «обновить», а «обновить, сохранив все ранее зафиксированные факты, имена и числа». Формулировка звучит очевидно, но именно она отличает сводку, которая помнит апрельский дедлайн, от сводки, которая его теряет на шестой итерации.
#Шаг 3. Дать структуру вместо «перескажи кратко»
Главный приём этого гайда. Свободный пересказ теряет конкретику; заполнение полей — нет, потому что пустое поле видно.
Формат, который стоит требовать:
Участники и роли: кто упоминался и кем является
Решения: что решено, кем, когда
Числа и даты: суммы, сроки, версии, объёмы
Открытые вопросы: что не решено и от чего зависит
Договорённости о следующем шаге: кто что делает
Контекст: одна-две фразы, о чём вообще был разговор
Шесть полей вместо одного абзаца. Почему это работает: модель, которой велено заполнить поле «Числа и даты», вынуждена просмотреть диалог на предмет чисел. Модель, которой велено «кратко пересказать», оптимизирует связность текста, а числа связность не улучшают — и выпадают первыми.
Порядок полей тоже не случаен: то, что чаще спрашивают, идёт выше. Общий контекст стоит последним, потому что он и так восстанавливается по любому фрагменту.
#Шаг 4. Проверка результата
Единственная честная проверка — не читать сводку, а спросить по ней.
- Возьмите реальный диалог, который вы помните.
- Выпишите пять вопросов, ответы на которые в нём есть: имя, число, решение, срок, причина отказа.
- Сверните диалог — сначала запросом «кратко перескажи», потом по структуре из шага 3.
- Ответьте на пять вопросов, глядя только на сводку.
- Сравните: сколько вопросов закрывает свободный пересказ и сколько — структурная сводка.
Разницу вы увидите на пятом вопросе, а не на первом: общие вопросы закрывают оба формата, конкретные — только структурный.
Второй способ измерения, если диалогов много: считать не полноту сводки, а число переспросов. Сколько раз за неделю ассистент переспросил то, что уже обсуждалось. Это косвенная метрика, зато она собирается сама.
#Шаг 5. Не сжимать то, что должно стать фактом
Важное разграничение. Сводка — это память о разговоре. Факт о вас — это память о вас, и она живёт отдельно, дольше и в другом хранилище.
Фраза «я перешёл в другую компанию», попавшая только в сводку сессии, исчезнет вместе с сессией. Она должна подняться уровнем выше — в отобранные факты, где у неё будет своя жизнь, версионирование и возможность отмены. Устройство этих уровней разобрано в материале про иерархическую память.
Отсюда правило: из сводки не должны выпадать кандидаты в факты. Если модель в поле «Участники и роли» написала «Олег — новый техлид», это кандидат; если написала «обсудили команду» — кандидат потерян навсегда.
#Что может пойти не так
Сводка «уплывает» от исходного смысла. Накопительное обновление без требования сохранять прежние факты. Лечится формулировкой промпта, а не сменой модели.
Сводка дублирует хвост. Порог и хвост пересекаются, и одно и то же уходит в промпт дважды. Проверяется отметкой, до какого сообщения свёрнуто: сворачивать надо строго то, что новее прошлой отметки и старше хвоста.
Модель придумывает то, чего не было. Сжатие — это генерация, и она галлюцинирует так же, как любая другая. Опасность здесь выше обычной: выдуманная деталь попадает в память как факт и дальше подтверждается сама собой. Механика этого цикла разобрана в материале про галлюцинации в памяти.
Сводка не пишется вовсе. Если языковая модель не настроена, шаг просто пропускается — в Persona отсутствие клиента модели тихо прерывает сворачивание. Диалог при этом продолжает работать на дословном хвосте, но старое содержание в промпт не попадает.
Сжали то, что стоило нарезать. Для документов и длинных текстов сжатие — не всегда правильный инструмент; иногда нужно просто резать на куски и индексировать. Разница разобрана в материале про стратегии чанкинга.
#Частые вопросы
#Насколько сильно можно сжимать?
Ориентир — двести-триста слов на сводку сессии независимо от её длины. Это не потому, что больше нельзя, а потому, что сводка идёт в промпт при каждом ответе: длинная сводка ест то же место, ради экономии которого её делали.
#Какой моделью сжимать?
Достаточно небольшой локальной: задача сводится к извлечению и переформулированию, а не к рассуждению. Более того, для сжатия лучше низкая температура — вам нужна точность, а не разнообразие формулировок.
#Куда девать сводку в промпте?
Отдельным блоком, ближе к началу системной части, а дословный хвост — ближе к концу. Причина в неравномерности внимания модели по длине контекста: середина используется хуже краёв, и туда не стоит класть то, что важно. Подробнее — в разборе потери в середине контекста.
#Можно ли сжимать несколько диалогов в один конспект?
Можно, но это уже другой уровень: сводка недели или месяца, а не сессии. У неё другая цель — не удержать нить разговора, а выделить повторяющееся. И делать её надо фоново, а не в момент ответа.
#Что делать со старыми сводками?
Держать: они компактны и полезны дольше, чем дословные сообщения, из которых сделаны. Удалять имеет смысл в последнюю очередь и по политике, а не по случаю — стратегии разобраны в материале про то, как ИИ забывает.
#Вывод
Сжимайте только тогда, когда дословное уже не помещается или больше не нужно, и никогда не формулируйте задачу как «перескажи кратко». Требуйте структуру с полями под имена, числа, решения и открытые вопросы — пустое поле заметно, потерянная деталь нет. Обновляйте сводку накопительно, но всегда с явным требованием сохранить ранее зафиксированное. И проверяйте результат не чтением, а пятью вопросами по памяти: сводка, которая читается хорошо, и сводка, которая отвечает на вопросы, — это обычно разные тексты.