Автор научил локального ИИ-агента не терять память в длинном разговоре
Автор научил локального ИИ-агента не терять память в длинном разговоре Автор habr-публикации под ником netricks собрал для локально работающих ИИ-агентов способ сжимать память разговора без заметных провалов. Проблема знакома каждому: контекст модели — то, что она «помнит» из диалога, — конечен, и когда память обрезают или пересобирают, агент на несколько десятков секунд замолкает, перечитывает документы и «забывает» даже шутку, сказанную минуту назад. Идея решения опирается на свойство модели: внутреннее состояние после каждого кусочка текста (автор называет его латентом — скрытое представление, которое модель хранит о прочитанном) содержит информацию обо всей предыдущей теме. Эксперименты в статье показывают, что модель может воспроизводить факты даже из замаскированной или подменённой части истории. Поэтому часть диалога можно заменить кратким пересказом — суммаризацией, — а остальное просто передвинуть ближе к началу, и смысл разговора не развалится. Как это устроено, в двух словах: когда заполненность контекста доходит до заранее заданной отметки («рубикона»), старая часть копируется в отдельную ветку, где модель в фоновом режиме готовит краткий пересказ и пересчитанный кеш — хранилище внутреннего состояния модели. Диалог при этом не прерывается: пересказ готовится во время пауз, а с новой репликой пользователя работа приостанавливается и вычисления переключаются на основной разговор. Подмену старая часть получает только при полном заполнении контекста — так переход происходит без паузы, и, по словам автора, агент «будто ничего не заметил». В деталях всё сложнее: современные модели хранят позицию каждого токена — кусочка текста, которым модель измеряет объём, — через механизм RoPE (вращающиеся кодировки позиций), а у моделей qwen3.8-27b и qwen3.8-flash-next есть ещё слои линейного внимания и механизм QSA — сжатый индекс внимания. Всё это при сдвиге истории нужно переносить и согласовывать, что автор и реализовал. Результат: на основе инструментов llama.cpp и strata написаны два раннера — программы, которые запускают модель, — с открытой выкладкой на GitHub (llama-ring и strata-ring). Автор сообщает, что в быту («включи свет, сходи Хабр почитай») работает без нареканий уже много циклов сжатия, а тестики на нескольких десятках ротаций существенных проблем не выявили. Сложные задачи он не гонял, цифр производительности и денежного эффекта не приводит. Ограничения автор называет сам. Во-первых, «вообще-то так делать нельзя»: модели не обучались на выдёргивание и перестановку кусков памяти, и нет гарантии, что на 115-м цикле сжатия накопленные «ошмётки» информации не отправят систему в разнос. Во-вторых, хранить полный кеш долго — это гигабайты, поэтому технология годится для локального применения, а крупные компании, скорее всего, возьмут её не в таком виде. В-третьих, стандартные локальные обвязки вроде hermes и qwen-code не подойдут: там суммаризацией управляет надстройка, а здесь — сам раннер, нужна кастомизация. Автор выложил наработки бесплатно. Источник: https://habr.com/ru/articles/1094558/