Как научить ИИ помнить день рождения своей бабушки
Не так давно я решил для своего YouTube-канала сделать бота. Не простого, а максимально похожего на человека. Мне захотелось воссоздать личность со всеми повадками, привычками, реакциями и маленькими микропаттернами поведения.
Вот, чтобы скинул ему мем — он понял и как-то отреагировал. Попросил селфи — прислал, и всегда одинаковый, потому что референсный образ генерируется исходя из предпочтений пользователя, заданных при создании. Плюс голосовые: можно разговаривать с ним как с живым собеседником в классическом представлении этого.
Но всё это рушится в тот момент, когда у бота нет нормальной памяти. Если он не понимает, что происходило раньше, не помнит детали, не опирается на собственную историю, общение разваливается. Исчезает ощущение связности, осознанности, «человечности». И тут появляется главный вопрос: как дать память тому, у кого её по умолчанию нет?
Коммерческие модели вроде ChatGPT или Grok не умеют дообучаться под конкретного персонажа или набор данных по-умолчанию. Вы можете создать GPTs, но не сможет обращаться к нему через API и дообогащать образ. Это просто невозможно — у них нет такой функции. Всё, что не помещается в контекстное окно, здесь же и исчезает. Долгие диалоги, многодневные переписки, повторяющиеся темы — модель ничего из этого не помнит. Передавать прошлое промтом бессмысленно: промт разрастается, ответы становятся хуже, стоимость растёт.
Мне нужно было добиться эффекта долгосрочной памяти, не имея самой памяти. И здесь как раз пригодился RAG. RAG если объяснять человеческим языком — это способ хранить отдельные фрагменты «жизни» отдельно от модели и доставать их по смыслу. Не по словам, а по тому, что пользователь имеет в виду.
Каждое важное сообщение, факт, событие (embeddings) или реакцию я превращаю в вектор (vector) — такое числовое представление смысла — и кладу в базу (PostgreSQL). Это даёт возможность искать ближайшие по смыслу штуки, когда пользователь задаёт новый вопрос. Если он спрашивает: «Как прошла твоя неделя?», бот смотрит в свою память, находит все связанные фрагменты и рассказывает. Причём делает это одинаково хорошо и сегодня, и через год. Потому что эти события он не «генерирует», а действительно «прожил» и сохранил как факты.
Под такой подход идеально подходит сценарий, где у бота есть собственная жизнь. Я встроил расписание: он ходит на работу, на пилатес, в кофейню, в клуб, на день рождения подруги. Это не просто декоративные действия — каждое такое событие попадает в память и становится частью истории персонажа. Он сам обогащает свой персональный слой без участия пользователя. Если человек не общался с ботом неделю, он всё равно сможет спросить: «Ну что, как у тебя всё прошло?» — и бот расскажет по фактам, а не фантазируя. И через неделю расскажет то же самое. И через год — тоже. Потому что для него это действительно произошло.
Вся эта история работает только если память организована как надо. Я разделил её на три слоя. Личные знания конкретного персонажа (Character RAG) — всё, что касается его прошлого, характера, отношений, событий и истории взаимодействий с конкретным пользователем. Профессиональный слой (Profession RAG) — чтобы речь специалиста звучала как речь специалиста, а не как пересказ учебника. И третий слой (Global RAG) — поведенческие паттерны: как реагировать на повторные вопросы, как сокращать ответ, как корректно поправить собеседника. Эти слои работают по приоритетам, чтобы бот не путался и не противоречил себе.
Так появляется эффект живого диалога. Не за счёт модели, не за счёт дообучения, которого попросту нет (точнее оно есть, только реализовано другими методами и об этом как-нибудь потом), а за счёт правильно построенной памяти вокруг неё. Это похоже на «Чёрное зеркало», но в хорошем смысле: бот ведёт свою жизнь, помнит её, не искажает события и не теряет связность. И только так можно получить поведение, которое действительно напоминает осознанное общение, а не набор случайных ответов.
Если вам интересна тема построения человекоподобных ИИ-ассистентов, то буду рад продолжить рассказывать про свой проект.