В первой части я рассказал, как собрал английского бота с памятью в Redis. Схема простая: копим 40 сообщений, сжимаем первые 20, обновляем центральный блок.
По идее, должно работать. На практике — сломалось через две недели.
Проблема: модель забывает
После двух недель общения заметил — работает коряво. Модель забывает то, о чём я рассказывал. Переспрашивает одно и то же.
Причина простая: информация попадала в центральную память и при следующем сжатии — затиралась.
Бывало так: в день у меня до 20 сообщений. Получается, все предыдущие дни просто пропадали.
Перепробовал разные подходы: суммаризацию, выдёргивание определённых фактов, безграничный промпт. Всё равно после сжатия и добавления основного промпта работало некорректно.
Каждый день подбирал разные промпты и разные варианты сжатия. В итоге одно и то же — какие-то вещи модель считала неважными и выбрасывала.
Это прям никуда не годилось.
Решение №1: Векторная память
Следующий этап — прикрутить векторную память.
Стал смотреть, как реализуется в n8n. План был: после выдёргивания ключевых фактов из 20 сообщений — запихивать в векторную базу.
Что получилось: немножко ошибся и сохранил просто все сообщения. Всё скопом — всё общение — запихнул в векторную базу.
Результат: охренеть как круто оказалось.
Модель теперь помнит вообще всё. Всё, о чём мы говорили. Можно спросить: «Слушай, мы там тогда о чём-то говорили, помнишь? Поищи». И всё лезет из векторной базы. Свободно находит.
Инфраструктура: Qdrant добавлен в тот же Docker-контейнер, где работает n8n. Всё поднимается вместе и работает максимально быстро.
Про объём данных: если загрузить в векторную базу «Войну и мир» — она будет весить около 80 мегабайт. Чтобы наговорить с моделью столько же текста, должно пройти очень много времени. Так что переживать за память вообще не обязательно.
Как это будет работать в дальнейшем — узнаю только через месяц-два-три.
Решение №2: Кратковременная память
Есть ключевые моменты, которые запихивать в системный промпт постоянно — не совсем удобно. Но и терять их нельзя.
Прикрутил к агенту кратковременную память.
Хранение: MySQL. Или можно использовать таблицы прямо в n8n.
Как работает:
- Есть таблица, к которой имеет доступ сам агент
- Агент может: удалить запись, изменить или вставить новую
- Эта таблица подгружается сразу в системный промпт
Модель видит ключевые моменты и помнит контекст между сессиями.
Решение №3: Память промта
Буквально сегодня добавил ещё один блок — память промта.
Идея: агент может сам себе добавлять инструкции.
Как работает:
Допустим, я его прошу что-то сделать определённым образом. Говорю: «Запомни вот это». Агент добавляет это в свою таблицу инструкций.
В следующий раз — он уже знает, как действовать. Не нужно повторять.
Разница с кратковременной памятью:
- Кратковременная память — факты и контекст (что происходило)
- Память промта — инструкции и правила (как действовать)
По сути, агент сам себя обучает через диалог.
Итого: четыре уровня памяти
- Векторная память — всё общение, полный поиск по истории
- Кратковременная память — таблица с ключевыми фактами
- Память промта — инструкции, которые агент добавляет сам себе
- Контекстное окно — последние 40 сообщений в оперативке
Каждый уровень решает свою задачу. Вместе — дают ощущение, что модель реально помнит всё.
Продолжение: интеграция с LifeTrend, проблема с токенами и как я её решил через ассистента-помощника.