Перейти к содержимому
← Все статьи
ИИ-агентыПамятьCapyAgent

Память, которая не врёт: как устроено саморазвитие агента

Агент помнит, что пилот стоит 150 тысяч. Через месяц цена стала 200. Ещё через месяц клиент спрашивает про цену, и агент уверенно называет 150: запись есть, она никуда не делась, и ничто в системе не говорит, что она устарела.

Это не ошибка модели. Модель отработала правильно: взяла то, что лежало в памяти. Ошибка в том, как память устроена.

Мы месяц занимались этой проблемой в CapyAgent и хотим рассказать, что получилось. Без общих слов про «долговременную память» и «самообучающиеся системы»: только механизмы, замеры и то, что сломалось по дороге.

Проблема не в объёме

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

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

Значит задача не «помнить много», а держать в голове малое и уметь поднять нужное. Это разные инженерные задачи, и решаются они разными механизмами.

Уровни: не важность, а устойчивость

Мы развели записи по четырём уровням.

Наблюдение. Услышал в разговоре. Таких много, стоят они дёшево. Живут в подсказке, пока свежие. Через месяц без подтверждений уходят в архив.

Факт. Подтвердилось дважды или закреплено человеком. Живёт в подсказке, пока не заменят. По времени не устаревает.

Устой. Не меняется годами: имя, город, чем человек занимается. Всегда в подсказке, места занимает мало.

Архив. Вышло из обращения. Не удалено: находится по прямой просьбе.

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

Замещение: главный механизм

Возвращаемся к цене. Пока «пилот стоит 150» и «пилот теперь 200» лежат рядом, любой отбор время от времени поднимает первую. Дело не в вероятности: агент, который в девяти случаях из десяти называет верную цену, хуже человека, который честно говорит «сейчас посмотрю».

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

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

Что агент делает сам, а что предлагает

Граница проведена не по осторожности, а по цене ошибки.

Сам, потому что обратимо: отмечает повторение, поднимает подтверждённое наблюдение в факты, отправляет забытое наблюдение в архив.

Предлагает человеку: замену старой записи новой, понижение факта, удаление.

Ошибка в сторону «оставили лишнее» стоит места в подсказке. Ошибка в сторону «выкинули нужное» стоит знания, и замечают её через месяцы, когда агент уверенно говорит неправду или молчит о том, что помнил.

Саморазвитие: смотрим в момент записи

Записывая новое, агент сверяется с тем, что уже лежит.

Нашёл то же самое другими словами: предлагает подтвердить прежнюю запись, а не плодить вторую. Нашёл те же слова с другими числами: предлагает замену.

Смотрим при записи, а не разбором раз в неделю. Через неделю человек уже не помнит, что и почему говорил, и на вопрос «это заменяет прежнее?» отвечает наугад. В момент записи он думает ровно об этом.

Обобщение: три наблюдения об одном

Отдельный механизм для случая, который выглядит безобидно.

Человек трижды за месяц говорит одно и то же разными словами: «Игорь платит по предоплате», «счета Игорь не просит», «с Игорем работаем предоплатой». Три наблюдения, ни одно не подтверждено формально, потому что подтверждение ждёт буквального повторения.

Через месяц все три увядают. Знание, которое человек повторил трижды и потому знает твёрже всего остального, исчезает целиком и молча, ровно как случайная оговорка.

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

Ревизия: «это ещё верно?»

Факты по времени не устаревают. Но цена, срок и состав команды протухают в жизни, а не в памяти.

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

Спросить дёшево. Забыть дорого.

Скорость: три замера

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

ЧтоБылоСтало
Подсказка при 100 000 заметок564 мс на каждом ходу86 мкс
Последние 10 ходов из 20 00058 мс на каждом ходу1 мс
Поиск по разговорам, 20 000 ходов619 мс27 мс

Механизмы простые: производный файл для постоянной части подсказки, чтение хвоста файла вместо чтения целиком, обратный индекс по основам слов.

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

Защита от внушения

Заметка попадает в подсказку каждого хода и живёт там до ручного удаления. Значит текст, пришедший из письма или веб-страницы и записанный моделью в память, стал бы постоянной инструкцией агенту.

Поэтому текст, похожий на команду агенту, кладётся в карантин: хранится, но в подсказку не идёт, пока человек не одобрит. И в карантине видно, что именно насторожило: пометка без объяснения выглядит произволом, и её одобряют не читая.

Чего мы не стали делать

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

Автоматического удаления нет. Ни одна дорога в памяти не стирает текст. Максимум архив, и он обратим.

Общей памяти между людьми по умолчанию нет. Записи несут контур, и перенос в общую память требует явного согласия с записанным основанием.

Что показал живой прогон

Все механизмы выше проверены тестами по отдельности. Это ничего не говорит о главном вопросе: пользуется ли ими модель.

Мы прогнали сценарий на настоящей модели. Сказали «запомни: пилот стоит 150 тысяч», потом «цена изменилась, теперь 200».

Модель записала первое. На втором ходу нашла старую запись, попробовала позвать замену, получила отказ «не сказано, что именно эта запись заменяет». Попробовала заменить запись самой собой, получила отказ «сама себя заменить не может». Оба отказа были совершенно верными.

После чего модель стёрла старую запись и написала новую.

Результат выглядел правильным: одна запись, цена верная, в подсказке ничего лишнего. Тест бы это принял. Но пропала история: замена оставляет прежнюю запись доступной по прямому вопросу, удаление стирает её насовсем.

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

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

Коротко

Память агента ломается не от объёма, а от того, что в ней нет разницы между «услышал» и «знаю» и нет способа сказать «это больше не верно». Уровни, замещение в обе стороны, обобщение повторов, ревизия чисел и честная граница между тем, что агент делает сам, и тем, что предлагает, стоят дешевле любого векторного поиска и решают ровно ту задачу, из-за которой агентам перестают доверять.

А проверять всё это надо на живой модели. Зелёные тесты говорят, что механизм есть. Они не говорят, что им кто-то пользуется.

Подробнее о продукте: capyagent.ru.

← Вернуться к списку статей

Разберём вашу задачу за 30 минут

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

КС
Кирилл Смольников
Основатель · стратег

Нажимая кнопку, вы соглашаетесь с политикой обработки персональных данных.

Заявка у нас. Свяжемся в течение дня. Срочно - пишите в Telegram: @Masternobi