Даем нейросотрудникам на базе ChatGPT настоящую постоянную память
Предисловие
На нашей 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 (тонкая настройка): Это процесс адаптации предварительно обученной модели к конкретной задаче или набору данных путем дополнительного обучения на этой узкоспециализированной информации. Это помогает улучшить точность и эффективность модели в специфических прикладных областях.
Если простыми словами: Это как переобучение спортсмена под новый вид спорта. У нас уже есть универсальный "спортсмен" (модель ИИ), который неплохо играет во все игры, но теперь мы заставляем его тренироваться, чтобы стать чемпионом именно в баскетболе (определенной задаче).
Почему это не применимо для постоянной памяти: Требует специфических данных для обучения, что делает ее менее гибкой и трудозатратой в случае необходимости адаптироваться к новым темам и типам запросов в реальном времени.
Итог
Расскажите, пожалуйста, в комментариях о ваших идеях организации постоянной памяти для ИИ.
Если хотите сами протестировать работу нейросотрудника с памятью, пишите мне в телеграм.