Чат персонажа со встроенной средне- и долговременной памятью
Проверьте это здесь!
В последнее время я экспериментировал (и получал удовольствие) со многими различными сервисами искусственного интеллекта для ролевых игр персонажей. Мои фавориты — это Character.ai, Doppel.ai и Poly.ai от Cloud Whale Interactive Technology (не путать с Poly.ai, разработчиками чат-ботов службы поддержки клиентов).
Однако каждая из этих систем имеет ограничения, которые могут усугубляться. Я попытался рассмотреть некоторые из них в этом проекте.
Чаты с персонажами великолепны и увлекательны, но у них короткая память. Они часто теряют из виду обстановку, ситуацию и важные предшествующие события. Хотя использование более длинных контекстных окон может помочь в этом, токены стоят дорого! Как мы можем дать персонажу долгую память, но ограничить количество жетонов, отправляемых за каждое завершение? Однако Doppel.ai в этом плане гораздо лучше остальных. Их персонажи имеют более длительную память.
Персонажи со временем теряют свою индивидуальность или склонны застревать в повторяющихся циклах реагирования. Некоторые сервисы справляются с этим лучше, чем другие, но я видел, как в той или иной степени это происходило со всеми из них.
Персонажи статичны после создания. Некоторые сервисы позволяют добавлять персонажу дополнительные «воспоминания», но я пока не нашел ни одного, который позволял бы изменить базовую личность персонажа, не возобновляя разговор.
Агенту предоставляется многоуровневая «память» или динамически изменяющаяся системная подсказка, которая включает уровни информации из предыдущих раундов разговора, начиная от очень конкретного для самых последних до более обобщенных для большинства дистанционных тем и информации.
Окно чата с кратковременной памятью Каждый вызов модели включает в себя довольно короткий список предыдущих сообщений дословно. Это помогает модели отслеживать контекст текущего разговора и последних сообщений.
Среднесрочный блокнот Meory Кроме того, я создал блокнот, который ИИ-агент мог использовать для заметок и отслеживания последних основных моментов разговора. Этот блокнот обновляется по мере поступления новой информации, добавляемой или обновляемой, а старая, уже не актуальная информация удаляется. Однако на самом деле никакая информация не теряется, поскольку снимки его блокнота сохраняются как записи в векторной базе данных.
Поскольку эта информация суммируется, она сжимает недавнюю информацию, позволяя модели использовать преимущества более длинного окна чата и большего контекста, при этом минимизируя количество фактических токенов, включенных в подсказку.
Имена персонажей (а не только «пользователь» и «помощник») включаются в каждое сообщение, чтобы облегчить обобщение. Это также помогает модели отслеживать, кто что говорит. Это значительно снижает вероятность того, что агент ИИ запутается в том, кто что сказал (что в противном случае является проблемой). Это также помогает соблюдать этикет очередности в диалоге и не позволяет агенту говорить от имени пользователя (что также может быть проблемой).
Долговременная память векторного хранилища Я использую сводки разговоров, чтобы извлечь из разговоров важную информацию, а затем сохранить ее в векторной базе данных. Каждый пользовательский запрос запускает семантический поиск в базе данных векторов для извлечения соответствующей информации из сводок предыдущих разговоров. Эта информация включена в подсказку к модели, а также в несколько последних сообщений.
Таким образом, память агента ИИ может значительно превосходить его контекст. Фактически, поскольку хранилища векторов могут занимать относительно мало места на диске, потенциальный эффективный размер памяти агента функционально не ограничен.
Когда воспоминания сохраняются, они сохраняются с временными метками, а при вызове они располагаются в хронологическом порядке. Агенту дано указание отдавать предпочтение более свежей информации, если воспоминания противоречат друг другу.
Результат Большую часть времени модель способна точно вспомнить информацию, полученную ранее в разговоре. Поиск в хранилище векторов обычно успешен в получении соответствующей информации, но модель не всегда фактически использует эту информацию в своих ответах. Однако в целом я доволен результатами.
Следующие шаги
Я бы хотел, чтобы модель более активно ссылалась на предыдущие события. В большинстве случаев он вспоминает успешно, если я напрямую задаю ему вопросы о предыдущих разговорах, но редко спонтанно ссылаюсь на предыдущие события. Он живет настоящим моментом. Я работаю над быстрым проектированием для создания такого поведения, но оно все еще в разработке.
Я также рассматриваю возможность использования распознавания именованных объектов, чтобы позволить агенту создавать профили персонажей или мест и хранить информацию, относящуюся к конкретным объектам. Это поможет модели организовать информацию по объектам, а не просто представлять собой снимки разговоров.
Я заметил, что, хотя персонажи часто начинали с уникального стиля речи, со временем их стиль стал очень мягким и стал походить на их базовый ИИ. Я поэкспериментировал с несколькими решениями, в том числе с написанием уведомления в виде символов. Однако это привело к потере большого количества токенов в памяти из-за создания заметок с меньшей плотностью токенов.
Вместо этого я сохраняю образец первого ответа, предоставляемого моделью, в качестве примера стиля. Этот первый ответ затем передается агенту на каждое приглашение в качестве примера стиля речи для каждого приглашения. Я обнаружил, что это ОЧЕНЬ эффективно помогает модели поддерживать стиль речи даже в длительных разговорах (более 100 завершений).
Следующие шаги Хотя тон сообщений одинаков, я хотел бы придать моделям еще более сильные, детальные и последовательные личности. Я подозреваю, что это может потребовать тонкой настройки.
Во многих ролевых системах LLM персонажи после создания статичны. Однако в моей реализации описания персонажей и даже имена можно менять на лету. Особой полезностью является возможность изменения местоположения и имени пользователя.
Описания персонажей Иногда вы хотите, чтобы ваши персонажи менялись в зависимости от недавних событий или чтобы их цели или мотивация менялись с течением времени. Это легко сделать, непосредственно корректируя описание персонажа на лету.
Местоположение Разговоры и ролевые игры часто могут происходить в воображаемом мире. Вы можете пойти из города в темницу, из общежития в кафе или домой на работу. Мой сайт позволяет менять место разговора на лету.
Имя пользователя Еще одной проблемой большинства систем ролевых игр с персонажами является включение нескольких персонажей. В моей системе вы можете на лету изменить имя персонажа, от которого говорите. Это позволяет имитировать несколько персонажей в разговоре или ситуации.
Изменение имени персонажа на самом деле не очень полезно. Заставить персонажа играть разных персонажей не получится, и это вызовет путаницу, когда модель попытается связать текущие разговоры с сводками предыдущих разговоров.
Следующие шаги