Память

Суммаризация диалога: как сжимать не теряя нужного

Наивная сводка теряет ровно то, что потом спросят — имена, числа, решения. Даём структурированный формат, который это удерживает, и способ измерить потери на своём диалоге.

Сводка часового разговора, сделанная моделью по умолчанию, звучит так: «Обсудили проект, договорились о сроках, наметили следующие шаги». Ни одного имени, ни одной даты, ни одного решения. Через неделю вы спросите «какой мы поставили дедлайн» — и в памяти будет ровно то, что процитировано выше.

Это не плохая модель. Это плохая постановка задачи: «кратко перескажи» и «сохрани то, что потом спросят» — разные требования, и первое систематически убивает второе.

#Зачем и когда сжимать

Сжатие нужно в двух ситуациях, и только в них.

Диалог перерос окно. История одной беседы не помещается целиком, а обрезать начало нельзя: там договорённости.

Архив перерос полезность. Сообщений накопились тысячи, они дословно уже не нужны, но выводы из них нужны.

В остальных случаях сжимать не надо. Сводка вместо доступного дословного текста — чистая потеря: она не экономит ничего важного и лишает вас формулировок. Если история помещается — держите её как есть, а нужное доставайте поиском; общая механика слоёв разобрана в статье о том, как работает память у ИИ.

#Что понадобится

  • Языковая модель, которой можно доверить один вызов на каждые несколько десятков сообщений. Тяжёлая не нужна: задача не творческая.
  • Порог срабатывания — сколько сообщений накопить, прежде чем сворачивать.
  • Хвост, который остаётся дословным. Последние N сообщений не сворачиваются никогда, иначе ассистент теряет нить прямо посреди разговора.
  • Отметка, до какого места уже свёрнуто. Без неё вы будете пересказывать одно и то же по кругу.

#Шаг 1. Выбрать порог и размер хвоста

Правило: хвост должен покрывать текущую тему разговора целиком, порог — быть заметно больше хвоста, чтобы сворачивание случалось редко.

В Persona это тридцать и шестнадцать: сессия сворачивается, когда сообщений становится больше тридцати, и последние шестнадцать остаются дословными (maybe_summarise в app/chat/sessions.py). Дальше в промпт идёт сводка как отдельная системная реплика плюс дословный хвост.

Ошибка, которую делают чаще всего, — маленький хвост. Восемь сообщений — это четыре обмена репликами; в живом разговоре тема живёт дольше, и ассистент начинает переспрашивать то, что вы сказали пять минут назад.

#Шаг 2. Сворачивать накопительно, а не заново

Два способа обновить сводку.

Пересобрать всё с нуля. Взять весь диалог, попросить новую сводку. Качество выше, стоимость растёт линейно с длиной беседы, и на длинной сессии становится неприемлемой.

Обновить существующую. Дать модели текущую сводку и только новые сообщения, попросить обновлённую версию. Стоимость постоянна.

Второй способ обязателен для длинных диалогов, но у него есть накопительный дефект: сводка сводки сводки постепенно теряет детали, которые не упоминались в последних сообщениях. Через десять итераций от исходных договорённостей может остаться одна строчка.

Практическая защита — просить не «обновить», а «обновить, сохранив все ранее зафиксированные факты, имена и числа». Формулировка звучит очевидно, но именно она отличает сводку, которая помнит апрельский дедлайн, от сводки, которая его теряет на шестой итерации.

#Шаг 3. Дать структуру вместо «перескажи кратко»

Главный приём этого гайда. Свободный пересказ теряет конкретику; заполнение полей — нет, потому что пустое поле видно.

Формат, который стоит требовать:

Участники и роли: кто упоминался и кем является
Решения: что решено, кем, когда
Числа и даты: суммы, сроки, версии, объёмы
Открытые вопросы: что не решено и от чего зависит
Договорённости о следующем шаге: кто что делает
Контекст: одна-две фразы, о чём вообще был разговор

Шесть полей вместо одного абзаца. Почему это работает: модель, которой велено заполнить поле «Числа и даты», вынуждена просмотреть диалог на предмет чисел. Модель, которой велено «кратко пересказать», оптимизирует связность текста, а числа связность не улучшают — и выпадают первыми.

Порядок полей тоже не случаен: то, что чаще спрашивают, идёт выше. Общий контекст стоит последним, потому что он и так восстанавливается по любому фрагменту.

#Шаг 4. Проверка результата

Единственная честная проверка — не читать сводку, а спросить по ней.

  1. Возьмите реальный диалог, который вы помните.
  2. Выпишите пять вопросов, ответы на которые в нём есть: имя, число, решение, срок, причина отказа.
  3. Сверните диалог — сначала запросом «кратко перескажи», потом по структуре из шага 3.
  4. Ответьте на пять вопросов, глядя только на сводку.
  5. Сравните: сколько вопросов закрывает свободный пересказ и сколько — структурная сводка.

Разницу вы увидите на пятом вопросе, а не на первом: общие вопросы закрывают оба формата, конкретные — только структурный.

Второй способ измерения, если диалогов много: считать не полноту сводки, а число переспросов. Сколько раз за неделю ассистент переспросил то, что уже обсуждалось. Это косвенная метрика, зато она собирается сама.

#Шаг 5. Не сжимать то, что должно стать фактом

Важное разграничение. Сводка — это память о разговоре. Факт о вас — это память о вас, и она живёт отдельно, дольше и в другом хранилище.

Фраза «я перешёл в другую компанию», попавшая только в сводку сессии, исчезнет вместе с сессией. Она должна подняться уровнем выше — в отобранные факты, где у неё будет своя жизнь, версионирование и возможность отмены. Устройство этих уровней разобрано в материале про иерархическую память.

Отсюда правило: из сводки не должны выпадать кандидаты в факты. Если модель в поле «Участники и роли» написала «Олег — новый техлид», это кандидат; если написала «обсудили команду» — кандидат потерян навсегда.

#Что может пойти не так

Сводка «уплывает» от исходного смысла. Накопительное обновление без требования сохранять прежние факты. Лечится формулировкой промпта, а не сменой модели.

Сводка дублирует хвост. Порог и хвост пересекаются, и одно и то же уходит в промпт дважды. Проверяется отметкой, до какого сообщения свёрнуто: сворачивать надо строго то, что новее прошлой отметки и старше хвоста.

Модель придумывает то, чего не было. Сжатие — это генерация, и она галлюцинирует так же, как любая другая. Опасность здесь выше обычной: выдуманная деталь попадает в память как факт и дальше подтверждается сама собой. Механика этого цикла разобрана в материале про галлюцинации в памяти.

Сводка не пишется вовсе. Если языковая модель не настроена, шаг просто пропускается — в Persona отсутствие клиента модели тихо прерывает сворачивание. Диалог при этом продолжает работать на дословном хвосте, но старое содержание в промпт не попадает.

Сжали то, что стоило нарезать. Для документов и длинных текстов сжатие — не всегда правильный инструмент; иногда нужно просто резать на куски и индексировать. Разница разобрана в материале про стратегии чанкинга.

#Частые вопросы

#Насколько сильно можно сжимать?

Ориентир — двести-триста слов на сводку сессии независимо от её длины. Это не потому, что больше нельзя, а потому, что сводка идёт в промпт при каждом ответе: длинная сводка ест то же место, ради экономии которого её делали.

#Какой моделью сжимать?

Достаточно небольшой локальной: задача сводится к извлечению и переформулированию, а не к рассуждению. Более того, для сжатия лучше низкая температура — вам нужна точность, а не разнообразие формулировок.

#Куда девать сводку в промпте?

Отдельным блоком, ближе к началу системной части, а дословный хвост — ближе к концу. Причина в неравномерности внимания модели по длине контекста: середина используется хуже краёв, и туда не стоит класть то, что важно. Подробнее — в разборе потери в середине контекста.

#Можно ли сжимать несколько диалогов в один конспект?

Можно, но это уже другой уровень: сводка недели или месяца, а не сессии. У неё другая цель — не удержать нить разговора, а выделить повторяющееся. И делать её надо фоново, а не в момент ответа.

#Что делать со старыми сводками?

Держать: они компактны и полезны дольше, чем дословные сообщения, из которых сделаны. Удалять имеет смысл в последнюю очередь и по политике, а не по случаю — стратегии разобраны в материале про то, как ИИ забывает.

#Вывод

Сжимайте только тогда, когда дословное уже не помещается или больше не нужно, и никогда не формулируйте задачу как «перескажи кратко». Требуйте структуру с полями под имена, числа, решения и открытые вопросы — пустое поле заметно, потерянная деталь нет. Обновляйте сводку накопительно, но всегда с явным требованием сохранить ранее зафиксированное. И проверяйте результат не чтением, а пятью вопросами по памяти: сводка, которая читается хорошо, и сводка, которая отвечает на вопросы, — это обычно разные тексты.

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт