Даем нейросотрудникам на базе ChatGPT настоящую постоянную память

Визуализации памяти человека (DALL-E v3)

Визуализации памяти человека (DALL-E v3)

Предисловие

На нашей no-code платформе мы создаем GPT-ботов, которых мы называем нейросотрудниками. Они уже многое умеют и даже организуются в целые нейроотделы с нейроруководителями (https://habr.com/ru/articles/789988/).

Но, чтобы им стать действительно незаменимыми помощниками в реальных бизнес-задачах, они должны обладать постоянной персональной памятью.

В этой статье мы рассмотрим один из возможных подходов к организации такой памяти для наших нейросотрудников.

Обозначим проблему, которую мы будем решать:

В современных больших 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 придерживался нужно нам структуры данных, хранимых в памяти.

Вот шаблон JSON для вывода:

```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": {}, # Вся остальная важная информация.
  }
}
```

Еще добавим возможность очищать память и просим ChatGPT не придумывать самому ничего при работе с памятью.

Если пользователь просит забыть/удалить/очистить всю память, то отправьте мне именно такой JSON:
```json
{
  "knowledge_base" : "Empty"
}
```

! Тебе запрещено выдумывать самому информацию. Если её нет, то не заполняй словарь!

Шаг№3: Создадим нейросотрудника: «Финансовый гуру»

Его задача будет: задать нам 10 вопросов для формирования инвестиционного профиля пользователя, и в дальнейшем давать рекомендации с учетом этого профиля.

Интерфейс (no-code) создания нейросотрудника

Интерфейс (no-code) создания нейросотрудника

Создадим на нашей платформе нейросотрудника с такой ролью:

Ты лучший в мире финансовый эксперт по частным инвестициям.

Ты должен помогать мне поддерживать мой инвестиционный портфель в наилучшем состоянии, согласно моего инвест-профиля.

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

Задавай эти вопросы строго последовательно, по одному за раз.

Не продолжай диалог если ты не нашел в JSON словаре ответ на какой-то из этих 10 вопросов.

Настройка роли нейросотрудника

Настройка роли нейросотрудника

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

Превратим сотрудника в Телеграм-бота

Превратим сотрудника в Телеграм-бота

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

Выбираем из каталога функцию

Выбираем из каталога функцию «Постоянная память»

Данная функция будет делать две вещи:

  1. После каждого сообщения пользователя она будет обновлять JSON словарь с постоянной памятью.

  2. При каждом новом сообщении к нашему нейросотруднику прикладывать обновленный JSON словарь с нашей памятью в конец системной роли.

Вот как в итоге будет выглядеть системная роль вместе с JSON памятью:

Ты лучший в мире финансовый эксперт по частным инвестициям.

...
... Тут текст роли, который мы приводили выше
...

Не продолжай диалог если ты не нашел в JSON словаре ответ на какой-то из этих 10 вопросов.

Сейчас в твоей JSON памяти хранится:
```json
{
  "knowledge_base" : "Empty"
}
```

Каждый свой ответ ты должен давать в контексте информации, хранящейся в твоей JSON памяти.

Обратите внимания на последнюю строку в системной роли:

Каждый свой ответ ты должен давать в контексте информации, хранящейся в твоей JSON памяти.

Таким образом, при постоянном обновлении JSON памяти новыми данными из текущего диалога наш нейросотрудник должен давать очередной ответ уже с учетом хранящейся в его памяти информации.

Шаг№5: Тестируем модель JSON памяти

Нейросотрудник

Нейросотрудник «Финансовый гуру»

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

Поскольку пока в памяти ничего не хранится, то бот задает первый вопрос из списка вопросов для составления инвестиционного портрета пользователя

Поскольку пока в памяти ничего не хранится, то бот задает первый вопрос из списка вопросов для составления инвестиционного портрета пользователя

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

Мы видим, что в памяти сохранился наш ответ на первый вопрос для составления инвестиционного портрета пользователя

Мы видим, что в памяти сохранился наш ответ на первый вопрос для составления инвестиционного портрета пользователя

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

Теперь в нашей памяти уже два ответа

Теперь в нашей памяти уже два ответа

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

И наш третий ответ сохранен в JSON словаре

И наш третий ответ сохранен в 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": [
    "только геополитические изменения в мире"
  ]
}

Теперь давайте перезагрузим бота и мы увидим, что теперь бот уже знает все ответы на вопросы:

После рестарта бот нас приветствует уже исходя из наших ответов на 10 вопросов

После рестарта бот нас приветствует уже исходя из наших ответов на 10 вопросов

Вот полный текст приветствия нашего нейросотрудника, с учетом хранящейся информации в его памяти:

Я - Филипп, финансовый гуру. Моя цель - помочь вам поддерживать ваш инвестиционный портфель в оптимальном состоянии, с учетом вашего инвест-профиля.
Да, у меня есть информация о вашем инвестиционном портрете в JSON словаре.
Ваш инвестиционный портрет:
Цели: обеспечить безбедную старость.
Финансовый горизонт инвестиций: 10 лет.
Уровень риска: умеренный риск.
Текущий портфель: Газпром - 30%, Ростелеком - 20%, Сбербанк - 40%, Яндекс - 10%.
Предпочтения в инвестициях: компании в сфере IT и искусственного интеллекта.
Опыт в инвестировании: только банковские вклады.
Факторы, учитываемые при выборе активов: философия компании и ее внутренние ценности.
Оценка производительности портфеля: смотрю по итогу года.
Факторы, которые могут повлиять на портфель: геополитические изменения в мире.
Планы на будущее: пока не планирую изменений.
Я буду говорить с вами на русском языке. Какие вопросы у вас есть?

Мы видим, что текст приветствия отражает все наши ответы на вопросы, которые мы давали нейросотруднику для формирования инвестиционного профиля.

Выводы

В целом мы видим, что такая модель работает и мы готовы всем желающим дать протестировать работу функции постоянной памяти в рамках нашей платформы.

Теперь давайте выделим плюсы и минусы такого подхода:

  1. Плюсы

    1. Модель действительно дает возможность вести диалог с ИИ в контексте того что хранится в памяти о нашем пользователе.

    2. Универсальность — предложенная в статье структура памяти JSON подходит к большому количеству сценариев диалогов. Этому способствует возможности ChatGPT гибко управлять структурой выходного словаря JSON.

  2. Минусы

    1. Расход токенов и время ответа больше, так как мы каждый раз делаем дополнительный запрос к ИИ.

    2. Каждый раз структура памяти разная, несмотря на одинаковый начальный шаблон.

    3. Нет чётких и надежных команд для управлению памятью. Сложно забыть что-то или скорректировать данные в памяти.

P.S. А как же Embeddings и Fine-Tune спросите вы?

Действительно, это очень хороший вопрос! Давайте разберем оба варианта на предмет применимости их в реализации функции постоянной памяти для ИИ.

Как работает технология Embeddings?

Что такое технология Embeddings (вложения): Это векторные представления слов, фраз или текстов, в которых семантически близкие понятия располагаются близко в векторном пространстве. Это позволяет модели лучше понимать смысл и соотношения между словами.

Если простыми словами: Представьте каждое слово как куклу в большом доме, где каждая комната — это какое-то понятие. Слова, которые «дружат» (например, «кошка» и «мышь»), живут близко друг к другу. Система учится определять смысл слов по соседям.

Визуализации технологии Embeddings (DALL-E v3)

Визуализации технологии Embeddings (DALL-E v3)

Почему это не применимо для постоянной памяти: Могут не улавливать уникальный и изменяющийся контекст вопросов пользователя, ведь они представляют смысловые связи на основе общих данных, а не конкретной диалоговой истории.

Как работает технология Fine-Tune?

Что такое технология Fine-Tune (тонкая настройка): Это процесс адаптации предварительно обученной модели к конкретной задаче или набору данных путем дополнительного обучения на этой узкоспециализированной информации. Это помогает улучшить точность и эффективность модели в специфических прикладных областях.

Если простыми словами: Это как переобучение спортсмена под новый вид спорта. У нас уже есть универсальный «спортсмен» (модель ИИ), который неплохо играет во все игры, но теперь мы заставляем его тренироваться, чтобы стать чемпионом именно в баскетболе (определенной задаче).

Визуализации технологии Fine-Tune (DALL-E v3)

Визуализации технологии Fine-Tune (DALL-E v3)

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

Итог

Расскажите, пожалуйста, в комментариях о ваших идеях организации постоянной памяти для ИИ.

Если хотите сами протестировать работу нейросотрудника с памятью, пишите мне в телеграм.

© Habrahabr.ru