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

Предисловие

На нашей 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 вопросов для формирования инвестиционного профиля пользователя, и в дальнейшем давать рекомендации с учетом этого профиля.

Интерфейс (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 словаре

Работает! Уже три ответа хранятся в постоянной памяти нашего нейросотрудника.

Думаю логика уже понятна, и вот что мы получим с вами после ответа пользователя на все 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 вопросов

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

Я - Филипп, финансовый гуру. Моя цель - помочь вам поддерживать ваш инвестиционный портфель в оптимальном состоянии, с учетом вашего инвест-профиля.
Да, у меня есть информация о вашем инвестиционном портрете в 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)

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

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

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

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

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

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

Итог

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

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