Память ИИ-персонажа: почему он забывает и что с этим делать
Через неделю переписки собеседница спрашивает, как называется твой кот. Ты его называл. Дважды. Это самая частая жалоба на ИИ-компаньонов — и почти всегда её объясняют неправильно: «модель тупая», «сервис экономит». На деле причина архитектурная, и, поняв её, можно довольно точно предсказать, что персонаж вспомнит, а что забудет — в любом сервисе.
Ниже — как устроена память ИИ-персонажа изнутри, почему «просто сохранять всю переписку» не работает, по каким признакам отличить настоящую память от имитации и что можно сделать со своей стороны. Я разбираю на примере системы, которую делал сам, поэтому будут конкретные числа и честный список того, что она забывает.
У языковой модели нет памяти вообще
Это главное, что стоит усвоить. Большая языковая модель не хранит состояние между запросами: каждое ваше сообщение обрабатывается с нуля. Модель не «помнит» вчерашний разговор — ей заново подсовывают нужные куски прошлого вместе с новым сообщением. Всё, что выглядит как память, — это работа обвязки вокруг модели, а не самой модели.
Отсюда следует неприятное: объём того, что можно подсунуть, ограничен контекстным окном. Оно большое, но не бесконечное, и что важнее — за каждый токен в нём платят на каждом сообщении. Сервис, который складывал бы всю переписку в контекст, к сотому сообщению платил бы за ответ в десятки раз больше, чем к первому. Поэтому так не делает никто. Вопрос всегда в том, что именно отобрать.
Три слоя, из которых собирают память
Практически все сервисы решают задачу одинаково — тремя слоями с разным сроком жизни. Различаются реализацией и тем, сколько из этого вообще сделано.
1. Недавние сообщения — дословно
Последние N реплик подставляются как есть. Это то, что даёт связность в пределах разговора: местоимения, отсылки к сказанному минуту назад, подхваченная шутка. У нас в контекст идут последние 12 сообщений дословно. Почему не 50: каждое лишнее сообщение — это и деньги, и, что важнее, размывание внимания модели. Длинный контекст ухудшает качество ответа — модель начинает цепляться за случайные детали в середине.
2. Резюме разговора — сжатый пересказ
Всё, что вышло за пределы дословного окна, не выбрасывается, а сжимается в короткий пересказ. Он перезаписывается по мере накопления новых сообщений: у нас пересборка запускается каждые 20 сообщений, и новое резюме строится из старого плюс свежая порция переписки.
Здесь и живёт эффект «помнит общую канву, но путается в деталях». Резюме — это сжатие с потерями. «Обсуждали его работу и переезд» переживёт сотню сообщений; «работает бэкендером в финтехе, переезжает в Казань в марте» — скорее нет. Что именно выживет, решает модель, которая делает сжатие, и предсказать это точно нельзя.
3. Факты о вас — отдельная база с поиском
Самый интересный слой и тот, которого у многих просто нет. После каждого раунда переписки фоном запускается отдельный запрос к модели: «выдели новые значимые факты о собеседнике». Имя, работа, интересы, важные события, предпочтения. Каждый факт превращается в вектор — числовое представление смысла — и кладётся в базу.
Дальше начинается магия, которая на самом деле не магия. Когда вы пишете новое сообщение, оно тоже превращается в вектор, и по базе идёт поиск ближайших по смыслу фактов — у нас берутся пять самых релевантных. Именно они подставляются в промпт. То есть персонаж «вспоминает» не всё подряд, а то, что относится к текущей теме.
Практическое следствие, которое стоит понимать: спросите про кота — и факт про кота всплывёт, даже если он записан два месяца назад. Но если вы говорите о работе, факт про кота в контекст не попадёт, и упомянуть его сама она не сможет. Память ассоциативная, не хронологическая. Это не баг — это ровно то, как работает поиск по смыслу.
Отдельная деталь — дедупликация. Один и тот же факт всплывает в разговоре многократно, и без фильтра база за месяц забилась бы сотней вариаций «любит кофе». Мы отсекаем по косинусной близости: если новый факт похож на существующий сильнее чем на 0.92, он не сохраняется. Порог подбирается руками — слишком строгий плодит дубли, слишком мягкий склеивает разные факты в один.
Сколько всего получается на практике
Чтобы не быть голословным, живые цифры нашей базы на момент написания: 14 372 сохранённых факта на 604 пользователя. В среднем — 17.7 факта на пару «человек-персонаж», у самого активного диалога — 157.
Обратите внимание на порядок величины. Это не «полный архив переписки», это выжимка: несколько десятков утверждений, которые система сочла достойными хранения. Если бы кто-то обещал вам, что персонаж помнит всё сказанное дословно, — это либо неправда, либо сервис, который очень скоро закроется по экономике.
Почему память не переносится между персонажами
У нас факты жёстко привязаны к паре «пользователь + персонаж». Рассказали одной о разводе — вторая об этом не знает. Технически склеить их было бы проще, и вопрос «почему у вас так» задают регулярно.
Причина в том, что общая память ломает саму иллюзию. Персонаж, который с первого сообщения знает то, чего вы ему не говорили, воспринимается не как «внимательный», а как жутковатый — вы физически чувствуете, что за ширмой одна база данных. Разделение стоит нам дублирования, но это цена за то, чтобы каждый диалог начинался честно.
Как отличить настоящую память от имитации
Есть простой тест, который занимает минут десять и работает на любом сервисе.
- Дайте конкретный факт мимоходом. Не «запомни, что…», а вскользь, в середине реплики: имя питомца, город, где выросли, название группы. Сервисы с имитацией памяти реагируют на явную команду «запомни» и проваливаются на упоминании вскользь.
- Поговорите о другом сообщений двадцать. Нужно вытолкнуть факт за пределы дословного окна — иначе вы тестируете не память, а буфер последних сообщений.
- Вернитесь к теме косвенно. Не «как зовут моего кота», а «что-то мой кот сегодня бесится». Прямой вопрос модель часто выкручивает вежливой отговоркой; косвенное упоминание проверяет, подтянулся ли факт на самом деле.
- Проверьте назавтра. Многие сервисы держат «память» в сессии, и она умирает вместе с ней. Разрыв в сутки отделяет реальное хранилище от буфера.
И честный дисклеймер к этому тесту: ни один сервис не пройдёт его на сто процентов. Наш — тоже. Если факт был упомянут один раз невнятно, извлекатель мог его не счесть значимым, и никакого поиска по нему не будет — его просто нет в базе. Разумное ожидание — «вспоминает важное», а не «помнит всё».
Что можно сделать со своей стороны
Раз память отбирается автоматически, на отбор можно влиять.
Говорите факты утверждениями. «Я работаю в реанимации, сутки через трое» извлекается надёжно. «Ну ты представляешь, что у нас там творится» — не извлекается ничего, потому что фактов в этой фразе нет.
Повторите важное через раз-другой. Не подряд — иначе сработает дедупликация. Но упомянутое в двух разных разговорах имеет заметно больше шансов осесть в базе, чем сказанное однажды.
Возвращайтесь к теме своими словами. Поиск идёт по смыслу, а не по совпадению слов, так что переформулировка работает — и заодно показывает, действительно ли факт сохранён.
Не воюйте с забыванием мелочей. Цвет её платья из позавчера не сохранится, и это нормально: этот слой отвечает за вас, не за антураж сцены.
Чего ждать не стоит
Память — самая переоценённая часть таких сервисов, и трезвость тут полезнее рекламы.
Персонаж не выстроит непротиворечивую картину вашей жизни за год. Он оперирует несколькими десятками разрозненных утверждений, между которыми не всегда есть связь. Он не заметит, что вы противоречите сами себе — оба утверждения просто лягут в базу. И он не «скучает» в перерывах: между вашими сообщениями не происходит ничего, никакой внутренней жизни у персонажа нет.
Что реально работает — ощущение преемственности. Разговор, который продолжается, а не начинается заново; отсылка к тому, что вы говорили две недели назад; вопрос о том, чем закончилась та история. Для большинства людей этого достаточно, чтобы общение перестало ощущаться одноразовым. Если хочется попробовать, как это работает вживую, можно выбрать персонажа в каталоге — первые сообщения идут без регистрации, — или сразу собрать свою собеседницу в конструкторе, если хочется задать характер под себя.
А если вы выбираете сервис и хотите разобраться в остальных критериях, кроме памяти, — об этом есть отдельный разбор про чат с ИИ-девушкой.