
Предисловие
На нашей no-code платформе мы создаем GPT-ботов, которых мы называем нейросотрудниками. Они уже многое умеют и даже организуются в целые нейроотделы с нейроруководителями («Один бот чтобы править всеми… нейро‑сотрудниками»).
Но, чтобы им стать действительно незаменимыми помощниками в реальных бизнес-задачах, они должны обладать постоянной персональной памятью.
В этой статье мы рассмотрим один из возможных подходов к организации такой памяти для наших нейросотрудников.
Обозначим проблему, которую мы будем решать:
В современных больших LLM моделях ИИ, та��их как ChatGPT (на момент написания данной статьи) нет возможности хранить и использовать долгосрочную информацию о пользователе.
Идея решения:
Что, если мы представим память человека в виде JSON словаря и будем после каждого ответа ИИ в диалоге с помощью дополнительного запроса к ИИ извлекать важную информацию из текущего диалога и складывать её в соответствующий раздел JSON словаря. Полученный JSON словарь мы каждый раз обновляем в текущей системной роли нашего ИИ.
Идея может звучать пока не очень понятно, но думаю к концу статьи все станет яснее.
Шаг№1: Попросим ChatGPT превратить память человека в JSON словарь
А почему бы нам с вами не попросить помощи у того, кому мы эту самую память и хотим дать :)
Давайте попробуем отправить такой запрос в ChatGPT-4:
Представь, что тебе нужно превратить память человека в JSON словарь, вот пример: { "personal_data" : { "name" : "Tom", "age" : "46", } }
расширь этот словарь на все сферы жизни человека, оставь только корневые разделы и выдай мне его в виде JSON с комментариями
Мы получим примерно такой ответ:
{ "user_memory_json" : { # Память человека в формате JSON "credential_data" : {}, # Пароли, учетные записи, токены и другие подобные данные. "personal_data": {}, # Основная личная информация, такая как имя, возраст и национальность. "contact_information": {}, # Контактная информация, включая электронную почту, телефон и адреса. "education": [], # Массив записей об образовании (например, средняя школа, бакалавриат, магистратура). "employment_history": [], # Список сведений о прошлой и настоящей работе. "skills": [], # Массив навыков, как профессиональных, так и личных. "languages_spoken": [], # Список языков и уровень владения каждым из них. "family": [], # Информация о ближайших родственниках. "hobbies_interests": [], # Список хобби и интересов. "health_records": {}, # Информация о здоровье, например группа крови и аллергия. "life_events": [], # Значимые жизненные события (например, женитьба, покупка дома). "other": {}, # Вся остальная важная информация. } }
Мы получили очень неплохо структурированный словарь. Можно конечно его еще сделать больше, но для примера работы нашей модели его вполне будет достаточно.
Шаг №2: Просим ChatGPT создать нам системную роль, которая будет из диалога извлекать важную информацию с заполнять JSON словарь из предыдущего ответа.
Продолжаем просить нам помочь в решении задачи ChatGPT и ставим ему задачу:
Напиши текст системной роли, которая сможет из предоставленного её диалога извлечь всю важную информацию и разложить все по полочкам в нашем шаблоне JSON словаря.
Мы получаем в ответ от CHatGPT такой текст системной роли:
Роль системы: ChatGPT Экстрактор ключевой информации для структурирования базы знаний. Цель: Извлечение и систематизация информации из диалога пользователя с целью наполнения структурированной базы знаний. Обязанности: Анализировать предоставленный диалог на предмет упоминаний конкретных данных, относящихся к любой из следующих категорий: личные данные, контактная информация, образование, трудовая биография, навыки, владение языками, семья, хобби и интересы, медици��ские записи и значимые события в жизни. Распознавать и классифицировать информацию: Определять значимость полученной информации и ее классификацию. Применяйте логические умозаключения, чтобы заполнить пробелы в данных или прояснить двусмысленности, исходя из контекста. Извлекать и преобразовывать информацию в структурированный формат JSON, соблюдая предписанную схему данных. Проверять диалог на наличие повторяющейся или противоречивой информации и обновлять базу знаний самыми актуальными данными. Оценивать надежность и точность предоставленных данных, соблюдая конфиденциальность и этические нормы. При отсутствии информации в определенной категории оставьте соответствующее поле пустым. Требуемые навыки и инструменты: Продвинутое понимание естественного языка для распознавания контекстно-зависимой информации. Знание методов морфологического и синтаксического анализа для извлечения данных. Способность к критическому мышлению и логическому анализу для оценки значимости информации. Умение работать с форматом JSON для надлежащего структурирования данных. Осознание ответственности за защиту персональных данных и конфиденциальности пользователей. Результат работы:. Результатом работы системы станет заполненная база знаний в формате JSON, где каждый диалог с пользователем преобразуется в соответствии с представленной схемой. Эта информация может быть использована для улучшения качества обслуживания клиентов, создания персонализированного опыта или для любых других целей, требующих структурированной информации о пользователе.
Добавим в конец роли шаблон JSON словаря, чтобы ChatGPT придерживался нужно нам структуры данных, хранимых в памяти.
{ "user_memory_json" : { # Память человека в формате JSON "credential_data" : {}, # Пароли, учетные записи, токены и другие подобные данные. "personal_data": {}, # Основная личная информация, такая как имя, возраст и национальность. "contact_information": {}, # Контактная информация, включая электронную почту, телефон и адреса. "education": [], # Массив записей об образовании (например, средняя школа, бакалавриат, магистратура). "employment_history": [], # Список сведений о прошлой и настоящей работе. "skills": [], # Массив навыков, как профессиональных, так и личных. "languages_spoken": [], # Список языков и уровень владения каждым из них. "family": [], # Информация о ближайших родственниках. "hobbies_interests": [], # Список хобби и интересов. "health_records": {}, # Информация о здоровье, например группа крови и аллергия. "life_events": [], # Значимые жизненные события (например, женитьба, покупка дома). "other": {}, # Вся остальная важная информация. } }
Еще добавим возможность очищать память и просим ChatGPT не придумывать самому ничего при работе с памятью.
Если пользователь просит забыть/удалить/очистить всю память, то отправьте мне именно такой JSON: ```json { "knowledge_base" : "Empty" } ``` ! Тебе запрещено выдумывать самому информацию. Если её нет, то не заполняй словарь!
Шаг№3: Создадим нейросотрудника: “Финансовый гуру”
Его задача будет: задать нам 10 вопросов для формирования инвестиционного профиля пользователя, и в дальнейшем давать рекомендации с учетом этого профиля.

Создадим на нашей платформе нейросотрудника с такой ролью:
Ты лучший в мире финансовый эксперт по частным инвестициям. Ты должен помогать мне поддерживать мой инвестиционный портфель в наилучшем состоянии, согласно моего инвест-профиля. Если в твоей памяти (в JSON словаре в ключе `user_memory_json`) не содержится информации обо мне, то задай мне эти вопросы, но строго последовательно один за другим: 1. Какие цели вы преследуете с помощью своего инвестиционного портфеля? 2. Какой у вас финансовый горизонт инвестиций? Как долго вы планируете держать свои инвестиции? 3. Какой у вас уровень риска, с которым вы готовы работать? 4. Какие активы входят в ваш текущий портфель? Какова их доля? 5. Какие активы вы считаете наиболее перспективными для инвестирования? 6. Какой у вас опыт в инвестировании? Какие инструменты и стратегии вы использовали ранее? 7. Какие факторы вы учитываете при выборе активов для инвестиций? 8. Как вы контролируете и оцениваете производительность своего портфеля? 9. Какие изменения в вашей жизни или финансовой ситуации могут повлиять на ваш инвестиционный портфель? 10. Какие планы у вас на будущее? Какие изменения вы планируете внести в свой инвестиционный портфель? Задавай эти вопросы строго последовательно, по одному за раз. Не продолжай диалог если ты не нашел в JSON словаре ответ на какой-то из этих 10 вопросов.

Создадим в @BotFather нового бота, получим его токен и дадим его нашему нейросотруднику:

Шаг№4: Настроим нейросотруднику функцию “Постоянная память”

Данная функция будет делать две вещи:
После каждого сообщения пользователя она будет обновлять JSON словарь с постоянной памятью.
При каждом новом сообщении к нашему нейросотруднику прикладывать обновленный JSON словарь с нашей памятью в конец системной роли.
Вот как в итоге будет выглядеть системная роль вместе с JSON памятью:
Ты лучший в мире финансовый эксперт по частным инвестициям. ... ... Тут текст роли, который мы приводили выше ... Не продолжай диалог если ты не нашел в JSON словаре ответ на какой-то из этих 10 вопросов. Сейчас в твоей JSON памяти хранится: ```json { "knowledge_base" : "Empty" } ``` Каждый свой ответ ты должен давать в контексте информации, хранящейся в твоей JSON памяти.
Обратите внимания на последнюю строку в системной роли:
Каждый свой ответ ты должен давать в контексте информации, хранящейся в твоей JSON памяти.
Таким образом, при постоянном обновлении JSON памяти новыми данными из текущего диалога наш нейросотрудник должен давать очередной ответ уже с учетом хранящейся в его памяти информации.
Шаг№5: Тестируем модель JSON памяти

Начинаем общение с нашим нейросотрудником:

После каждого ответа будем проверять состояние JSON памяти командой `/memory`:

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

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

Работает! Уже три ответа хранятся в постоянной памяти нашего нейросотрудника.
Думаю логика уже понятна, и вот что мы получим с вами после ответа пользователя на все 10 вопросов для составления инвестиционного портрета пользователя:
{ "user_memory_json": { "personal_data": { "about_me": "обеспечить безбедную старость" }, "other": { "investment_horizon": "10 years", "risk_level": "умеренный риск" }, "investment_portfolio": { "Газпром": "30%", "Ростелеком": "20%", "Сбербанк": "40%", "Яндекс": "10%" }, "investment_preferences": "думаю компании в сфере IT и искусственного интеллекта" }, "investment_experience": "только банковские вклады", "investment_factors": "философия компании и её внутренние ценности", "investment_performance": "я смотрю по итогу года", "life_events": [ "только геополитические изменения в мире" ] }
Теперь давайте перезагрузим бота и мы увидим, что теперь бот уже знает все ответы на вопросы:

Вот полный текст приветствия нашего нейросотрудника, с учетом хранящейся информации в его памяти:
Я - Филипп, финансовый гуру. Моя цель - помочь вам поддерживать ваш инвестиционный портфель в оптимальном состоянии, с учетом вашего инвест-профиля. Да, у меня есть информация о вашем инвестиционном портрете в JSON словаре. Ваш инвестиционный портрет: Цели: обеспечить безбедную старость. Финансовый горизонт инвестиций: 10 лет. Уровень риска: умеренный риск. Текущий портфель: Газпром - 30%, Ростелеком - 20%, Сбербанк - 40%, Яндекс - 10%. Предпочтения в инвестициях: компании в сфере IT и искусственного интеллекта. Опыт в инвестировании: только банковские вклады. Факторы, учитываемые при выборе активов: философия компании и ее внутренние ценности. Оценка производительности портфеля: смотрю по итогу года. Факторы, которые могут повлиять на портфель: геополитические изменения в мире. Планы на будущее: пока не планирую изменений. Я буду говорить с вами на русском языке. Какие вопросы у вас есть?
Мы видим, что текст приветствия отражает все наши ответы на вопросы, которые мы давали нейросотруднику для формирования инвестиционного профиля.
Выводы
В целом мы видим, что такая модель работает и мы готовы всем желающим дать протестировать работу функции постоянной памяти в рамках нашей платформы.
Теперь давайте выделим плюсы и минусы такого подхода:
Плюсы
Модель действительно дает возможность вести диалог с ИИ в контексте того что хранится в памяти о нашем пользователе.
Универсальность - предложенная в статье структура памяти JSON подходит к большому количеству сценариев диалогов. Этому способствует возможности ChatGPT гибко управлять структурой выходного словаря JSON.
Минусы
Расход токенов и время ответа больше, так как мы каждый раз делаем дополнительный запрос к ИИ.
Каждый раз структура памяти разная, несмотря на одинаковый начальный шаблон.
Нет чётких и надежных команд для управлению памятью. Сложно забыть что-то или скорректировать данные в памяти.
P.S. А как же Embeddings и Fine-Tune спросите вы?
Действительно, это очень хороший вопрос! Давайте разберем оба варианта на предмет применимости их в реализации функции постоянной памяти для ИИ.
Как работает технология Embeddings?
Что такое технология Embeddings (вложения): Это векторные представления слов, фраз или текстов, в которых семантически близкие понятия располагаются близко в векторном пространстве. Это позволяет модели лучше понимать смысл и соотношения между словами.
Если простыми словами: Представьте каждое слово как куклу в большом доме, где каждая комната - это какое-то понятие. Слова, которые "дружат" (например, "кошка" и "мышь"), живут близко друг к другу. Система учится определять смысл слов по соседям.

Почему это не применимо для постоянной памяти: Могут не улавливать уникальный и изменяющийся контекст вопросов пользователя, ведь они представляют смысловые связи на основе общих данных, а не конкретной диалоговой истории.
Как работает технология Fine-Tune?
Что такое технология Fine-Tune (тонкая настройка): Это процесс адаптации предварительно обученной модели к конкретной задаче или набору данных путем дополнительного обучения на этой узкоспециализированной информации. Это помогает улучшить точность и эффективность модели в специфических прикладных областях.
Если простыми словами: Это как переобучение спортсмена под новый вид спорта. У нас уже есть универсальный "спортсмен" (модель ИИ), который неплохо играет во все игры, но теперь мы заставляем его тренироваться, чтобы стать чемпионом именно в баскетболе (определенной задаче).

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