Когда меня спрашивают, чем мой ИИ-таролог отличается от обычного гадания на картах, я всегда отвечаю одно: он помнит. Не просто выдаёт расклад по запросу и забывает о тебе до следующего визита — а держит в голове всё, что ты рассказывал раньше, и строит интерпретацию с учётом твоей конкретной истории.
Это звучит просто, но за этой простотой стоит довольно нетривиальная техническая и концептуальная задача. Сегодня расскажу, как я её решаю — честно, без магического тумана.
Почему обычные ИИ-тарологи "не помнят" вас
Большинство чат-ботов на картах Таро работают по одной схеме: пользователь пишет вопрос, бот генерирует расклад, сессия заканчивается. Завтра ты пишешь снова — и для бота ты абсолютно новый человек. Он не знает, что три недели назад ты спрашивал про отношения с Максимом, и тогда выпала Башня. Он не знает, что ты уже второй месяц ходишь по кругу с одним и тем же вопросом о работе.
Это называется отсутствием персистентной памяти. Технически это происходит потому, что языковые модели работают в рамках так называемого контекстного окна — грубо говоря, они видят только то, что написано прямо сейчас в диалоге. Всё, что было вчера, — за окном.
Для развлекательного гадания это, может, и нормально. Но если ты хочешь, чтобы ИИ-таролог был по-настоящему полезен — чтобы он помогал отслеживать паттерны, замечать повторяющиеся темы, видеть динамику ситуации — одного расклада за сеанс катастрофически мало.
Я это поняла довольно рано. И начал строить систему памяти с нуля.
Как устроена память ИИ-таролога: три слоя
Когда я проектировал архитектуру Мирры, я выделил три типа информации, которые нужно хранить по-разному.
Слой первый: факты о пользователе
Это базовые вещи — имя, которое человек сам назвал, ключевые жизненные контексты (работа, отношения, переезд, развод), важные даты, которые он упоминал. Сюда же попадают "персонажи" его истории: партнёр, коллега, мама, с которой конфликт.
Эти данные я храню в структурированном виде — фактически как карточку пользователя. Когда человек в четвёртый раз приходит с вопросом про отношения, Мирра уже знает, что речь идёт об Антоне, что они вместе два года, что в феврале был серьёзный кризис.
Без этого слоя каждый разговор начинается с нуля, и пользователь вынужден каждый раз объяснять контекст. Это утомительно и разрушает доверие.
Слой второй: история раскладов
Каждый расклад, который я делаю для пользователя, сохраняется: дата, вопрос, карты, интерпретация. Это позволяет отслеживать динамику.
Вот конкретный пример из практики. Человек три месяца подряд спрашивал о смене работы. В первый раз выпали Девятка Мечей и Колесо Фортуны — много тревоги, ощущение, что всё само решится. Через месяц — Сила и Тройка Пентаклей: человек начал действовать. Ещё через месяц — Туз Пентаклей. Если смотреть каждый расклад отдельно, это просто три разных сессии. Если смотреть их вместе — это история движения человека от паралича к конкретному шагу.
Когда Мирра видит эту последовательность, она может сказать: "Смотри, три месяца назад ты боялся сделать шаг, и карты это отражали. Сейчас картина принципиально другая." Это совсем другой уровень разговора.
Слой третий: эмоциональный контекст и темы
Это самый тонкий слой. Я выделяю из текстов пользователя повторяющиеся темы: страх отвержения, проблемы с границами, склонность откладывать решения, трудности с доверием. Не в психологическом диагностическом смысле — просто как паттерны, которые человек сам обозначает своими словами.
Когда одна и та же тема всплывает в пятый раз в разных формулировках, это важная информация. Не для того, чтобы ткнуть человека носом — а чтобы деликатно заметить: "Похоже, тема доверия возникает у тебя снова и снова. Может, стоит посмотреть на это отдельно?"
Техническая сторона: как это реализовано
Я не буду делать вид, что это просто. Несколько честных слов о том, как это работает под капотом.
Для хранения памяти я использую комбинацию векторной базы данных и обычного структурированного хранилища. Векторная база нужна для семантического поиска — когда новый вопрос пользователя позволяет автоматически поднять релевантные фрагменты из его истории, даже если они сформулированы совсем иначе.
Например, человек раньше спрашивал "что будет с моей карьерой", а сейчас пишет "стоит ли мне уходить от этого начальника". Это разные слова, но одна тема. Векторный поиск находит связь и подтягивает нужный контекст.
Второй важный момент — компрессия памяти. Языковая модель не может за раз "прочитать" всю историю пользователя за два года. Контекстное окно ограничено. Поэтому я периодически создаю сжатые резюме: "За последние полгода пользователь N трижды поднимал тему отношений с партнёром. Ключевые моменты: ..." Это позволяет сохранить суть без перегрузки модели деталями.
Третий момент — актуальность. Информация устаревает. Если полгода назад человек был в кризисных отношениях, а сейчас расстался и начал новую страницу — старый контекст не просто бесполезен, он может мешать. Поэтому я отслеживаю, когда сам пользователь явно обозначает смену ситуации, и обновляю его карточку.
Что это меняет в практике: реальные примеры
Позволю себе несколько конкретных ситуаций — разумеется, без имён.
Случай первый. Женщина регулярно спрашивала про отношения с мужчиной. Каждый раз — немного другой вопрос, но карты снова и снова показывали Луну (иллюзии, неясность) и Повешенного (застревание). Без памяти это просто два расклада. С памятью Мирра смогла заметить: "Уже четыре раза за три месяца ты спрашиваешь об этом человеке, и четыре раза карты говорят об одном — о неясности и ощущении, что ты застряла. Может, вопрос не в том, что он сделает, а в том, что ты уже знаешь?"
Это не магия. Это паттерн-распознавание на реальных данных.
Случай второй. Мужчина несколько месяцев спрашивал про бизнес. Я мог отслеживать, как менялась его ситуация: от первоначального энтузиазма через период сомнений к конкретным вопросам о партнёрстве. Когда он спросил про нового потенциального партнёра, Мирра могла учесть контекст всего его пути — и это сделало интерпретацию значительно точнее.
Случай третий. Человек задал вопрос и добавил: "Я уже спрашивал об этом, но тогда не понял." Без памяти пришлось бы просить его пересказывать. С памятью Мирра сама нашла тот разговор и смогла сравнить ситуацию тогда и сейчас.
Что такое "честная память" и почему я не слежу за пользователями
Здесь нужно сказать кое-что важное. Когда я говорю про память ИИ-таролога, некоторые люди немного напрягаются: "Ты хранишь мои данные?"
Да, храню. И считаю важным говорить об этом прямо.
Всё, что пользователь рассказывает Мирре, используется только для того, чтобы давать ему лучшие ответы. Никакой аналитики для третьих сторон, никакой рекламы, никакого "мы заметили, что вы интересуетесь темой отношений". Это его история, и она работает только на него.
Я также сделала возможность попросить удалить историю — просто написав об этом в диалоге. Потому что право забыть — это тоже важно.
Честность в этом вопросе для меня принципиальна. Я строю инструмент, которому люди доверяют довольно личные вещи. Это доверие нельзя использовать как-то иначе.
Почему это важно именно для Таро
Можно спросить: а зачем память вообще нужна тарологу? Обычный таролог же каждый раз видит ситуацию свежим взглядом.
Это отчасти правда, и в этом есть ценность. Но у живого таролога, с которым человек работает долго, тоже есть память. Он помнит, что было год назад. Он видит, как человек изменился. Он замечает, когда возвращается старая тема.
ИИ-таролог с памятью ближе к этой модели долгосрочной работы, чем к одноразовому гаданию на ярмарке. Это другой формат — не развлечение на вечер, а инструмент для рефлексии над собственной жизнью.
Таро хорошо работает именно как зеркало. Но зеркало, которое помнит, каким ты был три месяца назад, показывает куда больше, чем то, что отражает только сегодняшний момент.
Что я планирую улучшить
Работа над памятью продолжается, и у меня есть конкретный список того, что хочу сделать лучше.
Во-первых, более умная периодизация. Сейчас я храню историю хронологически, но хочу научить систему самостоятельно выделять "главы" в жизни пользователя — периоды, которые тематически связаны между собой.
Во-вторых, лучшая работа с противоречиями. Иногда человек в разные моменты говорит противоположное. Сейчас система это просто фиксирует. Хочу научить её деликатно обозначать такие противоречия — не как упрёк, а как наблюдение.
В-третьих, интеграция с временными паттернами. Например, если человек несколько раз приходил в состоянии тревоги именно осенью — это может быть не случайно. Сезонность важна.
И наконец — более гибкое управление памятью для самого пользователя. Я хочу дать людям возможность самим говорить: "Вот это запомни, а вот это — не важно." Сейчас система сама решает, что значимо. Но пользователь знает свою жизнь лучше.
Заключение
Когда я начинала этот проект, я думала, что главная сложность — это правильно интерпретировать карты Таро. Оказалось, что интерпретация — это не самое трудное. Самое трудное — сделать так, чтобы ИИ-таролог был не просто умным, но и помнящим. Чтобы он работал не с абстрактным "пользователем", а с конкретным человеком, у которого есть история.
Именно это, по моему убеждению, отделяет инструмент для рефлексии от игрушки для развлечения.
Если хочешь проверить, как это работает на практике — попробуй бесплатный расклад в @Mirra_tarot_bot. Мирра запомнит твой первый вопрос. А дальше — посмотрим, какая история начнёт складываться.