Всем привет! На связи Настя Шахматова из команды Нейронавыков SberDevices. Мы делаем развлекательные навыки на основе GigaChat для виртуального ассистента Салют.

Под занавес 2023 года наша команда представила релиз детского навыка «Сочини сказку» на умных колонках SberBoom и SberBoom Mini на базе GigaChat Lite. Этим летом семейство умных устройств пополнили также колонки SberBoom Home и SberBoom Mini 2.

Сегодня мы провели релиз версии для экранов на новых платформах Салют ТВ, SberBox, SberBox 2, SberBox Top, SberBox Time на модели GigaChat Pro. Для запуска навыка, как и прежде, нужно сказать ассистенту: «Сочини сказку». Далее ассистент предложит выбрать героя, и пользователь сможет стать соавтором сказочной истории.

Если у пользователя есть конкретная идея, какую сказку он хочет услышать, запрос может быть контекстно расширенным, например: «Салют, сочини сказку о том, как князь Гвидон отправился в супермаркет на поиски чудодейственного зелья» или «Сочини сказку про Бабу Ягу, у которой сбежала избушка». В ином случае навык предложит двух героев на выбор.

После выбора героя начнётся генерация интерактивной истории, на протяжении которой будут предлагаться возможные развития событий. Также можно проявить креативность и развивать сюжет именно так, как захочется. К 5–8 шагу история подойдёт к логическому завершению, а герой достигнет своей сказочной цели. Затем появится возможность прослушать сказку целиком, а также сохранить её в личную коллекцию (раздел «Мои сказки») для повторного воспроизведения. После этого можно сочинить новую увлекательную сказочную историю.

Аудиальный и визуальный канал требуют разных подходов к удержанию внимания пользователя, поэтому для версии на экранах сказки сопровождают картинки главного героя истории и его окружения, сгенерированные моделью Kandinskiy-3.0.

Посмотрим на пример автоматической генерации текста интерактивной сказки по шагам!

Запрос пользователя: Салют, сочини сказку про Тигрулю

Ответ модели: Жила-была на свете Тигруля. Она была самой жизнерадостной кошкой в лесу. Однажды она услышала крик о помощи из ближайшего пруда. Это был Водяной, который попал в беду. Его дом начал разрушаться, и ему нужна была помощь, чтобы выбраться из воды. У Тигрули возникло желание спасти Водяного. И так началось её невероятное приключение...

Что будет дальше? Можем Вытащить Водяного самостоятельно или Попросить помощи у друзей

Запрос пользователя: Попытаться вытащить Водяного самостоятельно

Ответ модели: Тигруля попробовала вытащить Водяного самостоятельно, но пруд был слишком глубоким, а Водяной слишком тяжёлым. Водяной продолжал тонуть, и его дом разрушался всё больше.

Что будет дальше? Можем Найти волшебные предметы для создания корабля или Позвать на помощь

Запрос пользователя: Попроси помощи у друзей

Ответ модели: Тигруля решила попросить помощи у своих друзей. Она собрала Бурого Медвежонка, Белочку и Зайчика, и они все вместе отправились к пруду. Там они увидели, что Водяной уже почти утонул, а его дом превратился в груду обломков. Друзья пытались вытащить Водяного, но у них тоже не хватало сил.

Как продолжим историю? Можем сдаться или Придумать новый план спасения

Запрос пользователя: Найти волшебные предметы для создания корабля

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

Что будет дальше? Можем создать Летучий корабль из найденных предметов или Найти мудрого старца, чтобы он помог собрать корабль

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

Ответ модели: С помощью найденных волшебных предметов друзья начали создавать Летучий корабль. Они аккуратно прикрепили золотые перья к серебряному корпусу, а затем вставили магический кристалл в центр управления. Когда всё было готово, Летучий корабль ожил и засверкал в лучах солнца.

Друзья успешно спасли Водяного, и он поблагодарил их за своё спасение. Водяной пригласил всех к себе домой, где они отпраздновали свою победу и поделились историями о своих приключениях. С тех пор Тигруля и её друзья стали настоящими героями леса. И каждый раз, когда они смотрели на небо, они видели отражение своего Летучего корабля, напоминающего им о том, что нет ничего невозможного, если действовать вместе.

А таким может быть визуальный облик Тигрули в навыке:

Как видно, сказка логично завершилась, когда главный герой достиг цели.

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

«Скоро сказка сказывается, да не скоро дело делается»

Теперь расскажем о том, как создавался этот навык.

В 2022 у нашей команды существовал интерактивный проект Нейроквестов, ориентированный на взрослую аудиторию. В основе было 3 генеративных компонента:

  • стартовый абзац в выбранном жанре;

  • варианты продолжения истории;

  • эпилог.

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

Затем мы применили подход с конечным автоматом: разбили сюжет сказки на основные события, основываясь на «Морфологии сказки» В. Проппа, зафиксировали часть текста и оставили слоты под генеративное творчество модели.

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

Сочини сказку!

Чёткое видение продукта и целевой аудитории сформировались летом 2023 года, когда мы проанализировали общий трафик «сказочных» запросов в виртуальный ассистент Салют и изучили имеющиеся в российской индустрии решения от коллег по рынку.

Каким мы видели свой навык?

  • Как продукт: волшебные, добрые, сказочные истории с характерной лексикой, понятные современному ребёнку.

  • Целевая аудитория: дети дошкольного возраста, школьники младших классов (6-9 лет) и их родители.

  • Поверхность реализации: для MVP выбрали аудиальный канал — умные колонки семейства Sberboom.

Далее нам было необходимо грамотно сформировать пайплайн разработки от выбора формата до релиза.

Формат навыка

Для определения оптимального формата взаимодействия с детьми вместе с командой UX-исследований мы провели эксперимент, участниками которого стали дети различных возрастных категорий.

Детям было предложено два альтернативных формата работы навыка:

  1. прослушивание цельных текстов сказок, не требующих активного участия;

  2. интерактивная сказка, предполагающая совместное творчество с моделью.

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

При этом больше интереса и вовлечённости дети проявили при тестировании интерактивного режима. Оптимальная длина сказки, которая не успевала наскучить, составила 5–8 шагов.

Таким образом, реализация навыка должна была включать:

  • короткий онбординг с выбором героя;

  • 5–8 шагов генерации, после каждого из которых ребёнок решает, какое действие совершит главный герой сказки дальше.

Однако, отказываться от возможности прослушать сказку целиком мы не стали: при желании после окончания истории, пользователь может услышать её ещё раз.

Реализация

Подготовка данных

Весной 2023 года состоялся первый релиз GigaChat. Ожидаемо, даже без дообучения, текстовые генерации отличались лучшим качеством, чем те, что мы видели в ходе работы с ruGPT или FRED-T5.

Для первой реализации навыка мы решили интегрироваться в процесс дообучения GigaChat Lite. Наши данные с особым инструктивным системным промптом для навыка вошли в состав датасета на SFT.

  • Системный промпт — это набор инструкций, направленный на настройку поведения и ответов модели. Инструкции могут включать указания по формату, стилю общения и другим параметрам, важным для точного выполнения задачи. Использование системного промпта позволяет большим языковым моделям предоставлять более релевантные и точные ответы.

Для более глубокого понимания концепции системных промптов и их применения можно ознакомиться, например, с исследованием «Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing» (Liu et al., 2021).

  • SFT (Supervised FineTuning) — это этап, на котором предварительно обученная языковая модель (pretrain) дообучается на наборе данных пар «запрос-ответ», сопровождаемых инструкцией (системным промптом) и примерами поведения пользователя (для нас — возможное поведение пользователя в навыке) и ответами модели (продолжение генераций).

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

Сочини сказку на устройствах

Для раскатки диалогового навыка на колонках мы реализовали Chat-App проект в SmartApp Studio. В его основе Graph — low-code-инструмент, который позволяет описать всю логику приложения в чат-бот-конструкторе с минимальным количеством кода.

Для релиза на экранах ТВ проект был переработан в формат Canvas-App и теперь вместо графа, уже написано полноценное Next.js-приложение.

Аналитика:

  • Специально для навыка была создана с нуля система оценки качества сказочных генераций. Каждый эксперимент с промптами или параметрами модели оценивается группой разметчиков по специализированному ТЗ.

  • Рассчитываются метрики продакшна, такие как DAU, WAU, Retention, распределение по поверхностям, процент технических ошибок, среднее количество запросов на пользователя и другое.

  • Оценивается вовлечённость пользователей и их активность на различных этапах сценария навыка. Выяснилось, что чем привычнее навык для посетителя, тем более творчески он себя ведёт: скорее называет собственных героев и сам придумывает сюжетные повороты.

  • Собирается обезличенная статистика по популярности героев. На её основе изменяется список предлагаемых на старте навыка героев — в «Сочини сказку» мы стремимся быть на одной волне с детьми и следовать их трендам.

Точки роста и промежуточные релизы

  • Ожидаемой «болезненной» точкой после первого релиза оказался вопрос фильтрации контента: пользователи стремились и стремятся прощупать границы дозволенного. Однако, детский навык накладывает определённые обязательства по безопасности. Поэтому мы добавили в него фильтр, который постоянно улучшается.

  • В рамках MVP было принято осознанное решение принудительно заканчивать истории после 5-го шага — мы хотели оценить, сколько пользователей доходят до конца сказки с такой длиной. Аналитика показала, что дети вовлечены в истории и хотят сочинять более продолжительные сказки.

Решением стала проработка «ансамбля» промптов. Для различных этапов сценария сказки в ходе экспериментов был подобран свой промпт:

  1. стартовый — в нём формируются требования к лексической и жанровой составляющей сказки, вводится герой и увлекательная цель, требующая разрешения к эпилогу;

  2. игровой — с его помощью после каждого шага генерации предлагается 2 варианта развития истории;

  3. сюжетный — благодаря ему сюжет сказки развивается консистентно на основе решений пользователя;

  4. завершающий — отвечает за генерацию конца сказки при достижении героем заданной на старте цели.

Такой подход повысил интересность и логичность сказочных историй в навыке.

Релиз на экранах

О текстовых моделях

Релиз навыка на экранах открыл перед нами возможность работы с GigaChat Pro. Генеративная способность модели и более высокая чувствительность к системным промптам позволили нам получить лучшие показатели по метрикам оценке качества генераций.

В отличие от устройств Sberboom, где максимальное время ожидания ответа модели составляет ≈7 секунд, и дальше наступает таймаут, на экранах мы можем обойти эту проблему, используя polling запросов (использование SSE или другого протокола невозможно, так как виртуальный ассистент Салют поддерживает только HTTP запросы).

Таким образом, в навыке на колонках используется GigaChat Lite — самая быстрая модель, а на поверхностях с экраном — GigaChat Pro — с самыми качественными генерациями.

Визуальная составляющая

В начале статьи мы уже немного продемонстрировали интерфейс, с которым встретится пользователь «Сочини сказку».

Поговорим о визуале — как и для каких этапов сценария мы генерировали картинки.

Подготовка галереи изображений началась до релиза Kandinskiy-3.1. К тому же, одной из особенностей этой версии является функция «улучшения промпта» на базе модели Neural-Chat-v3-1. Для нашей задачи основу для генераций составляли именные сущности (главные герои сказок), многие из которых модель не способна отрисовать по одному лишь наименованию (попробуйте самостоятельно сгенерировать картинку по запросу «Хагги Вагги», «Трубадурочка» или, например, «Чиполлино»). Поэтому для сохранения единой стилистики и качественных фиксированных промптов все генерации были сделаны на модели 3.0.

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

Примеры генерации по запросу «Чиполлино» с разными версиями модели Kandinskiy:

Пример генерации по нашему промпту, описывающему внешний вид Чиполлино:

Можно предположить, что в обучающих данных картиночной модели изображение сопровождается расширенными дескриптивными характеристиками, а не (или не только) верхнеуровневым наименованием.

Вероятно, сущности, у которых в датасете встречалось большое количество примеров с неймингом, модель могла выучить «в лицо» (например, Чебурашку или Гарри Поттера). Однако, менее популярных героев сказок и мультфильмов по одному лишь имени отрисовать возможно уже не всегда. Тем не менее, в некоторых случаях промпт с расширенным описанием внешности давал почти абсолютное сходство с известными всем персонажами.

Для формирования галереи «Сочини сказку» мы взяли героев, которых предлагаем пользователю на старте, а также наиболее популярных у детей.

Сущности можно классифицировать на четыре типа:

  1. абстрактные персонажи (мама, девочка Катя, котёнок, фея и др.);

  2. персонажи народных сказок;

  3. персонажи авторских сказок;

  4. персонажи мультфильмов (российских и зарубежных).

Для каждого героя с помощью few-shot промпта-инструкции на базе GigaChat Pro было получено описание внешности, которое проверялось и редактировалось вручную. Затем по ним генерировались картинки, и лучшие из них попали в галерею.

Процесс продолжался до тех пор, пока для каждого героя в галерее не оказалась как минимум пара красивых иллюстраций. На них удалялся фон — так герои становились более живыми, словно в 3D-эффекте.

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

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

В настоящий момент матчинг картинки из галереи с текстом на экране осуществляется по ключу-названию изображения (Баба Яга, сказочный лес и т.п) с помощью Sbert-large-mt-nlu-ru.

Спеши сочинять!

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

Пока предлагаем запустить навык на устройствах с экраном: Салют ТВ, SberBox, SberBox Top, SberBox Time и на колонках SberBoom, SberBoom Mini, SberBoom Mini 2 или SberBoom Home и погрузиться в мир сказочных грёз. Просто скажите: «Салют, сочини сказку»!

До новых встреч!

Наша команда

Комментарии (5)


  1. webhamster
    09.09.2024 11:40

    Выбор без выбора для детей - как это прекрасно. Плюс полное отключение фантазии навязанными образами.

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


  1. averkij
    09.09.2024 11:40

    А какой системный промпт лучше использовать, если хочется погенерировать сказки через API GigaChat'а?


    1. drozhzhinastya Автор
      09.09.2024 11:40
      +1

      Ответ зависит от задачи.

      Использование одного системного промпта и генерация цельной (не интерактивной сказки) как правило накладывает ограничение на длину генерации. В некоторых случаях сказкам также может не хватать глубины. 

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

      Пример цельной генерации детской сказки через API с фиксацией вышесказанного:

      Жили-были в одном доме попугайчик Лёвка да девочка Марья. Лёвка был птенцом зелёным, ярким, а Марья - девочкой любопытной и наблюдательной. Все дни они проводили вместе: Лёвка болтал без умолку, а Марья слушала его внимательно, словно волшебные сказки. Но однажды случилось нечто странное.

      Лёвка, будучи большим модником, обожал смотреться в зеркало. И вот, однажды, он так увлёкся своей красотой, что, заглядевшись в зеркальную гладь, не заметил, как попал в Зазеркалье. Испуганный и растерянный, он оказался в незнакомом мире, полном загадок и тайн.

      Марья заметила пропажу своего друга и сильно расстроилась. Она обыскала весь дом, но попугайчика нигде не было. "Куда же ты запропастился, мой маленький друг?" - спрашивала она, но ответа не было. Девочка была уверена, что Лёвка просто куда-то улетел, но никак не могла понять, почему он не возвращается.

      Но Марья не сдавалась. Она села на стульчик и задумалась. "Если бы я была на месте Лёвки, то что бы я сделала?", - спросила она сама себя. И тут её осенило: "Зазеркалье!" Да, именно туда мог попасть её попугайчик.

      Марья знала, что вернуться из Зазеркалья можно только с помощью голоса того, кто тебя любит. Поэтому она решила помочь своему другу. Она взяла свою любимую игрушку и стала звать Лёвку. "Лёвка, вернись домой! Мы тебя ждем!", - кричала она изо всех сил.

      Долго ли, коротко ли, но её усилия были вознаграждены. Из Зазеркалья послышался слабый голосок Лёвки: "Марья, это ты? Я здесь!". Девочка продолжала звать его, пока наконец он не появился перед ней, слегка потрепанный, но счастливый.

      Лёвка понял, что самое важное в жизни - это не красота, а те, кто тебя любят и ждут. И хотя он иногда и смотрелся в зеркало, он всегда помнил этот урок. А Марья была счастлива, что смогла вернуть своего маленького друга домой.

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


  1. NutsUnderline
    09.09.2024 11:40
    +1

    Сказка ложь да ней намек. Нейросеточка уже умеет добрым молодцам урок?


    1. drozhzhinastya Автор
      09.09.2024 11:40
      +4

      Добрый день!

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

      Конфликтная линия при этом может строиться как вокруг появления в сюжете явного антагониста, так и других проблем вроде недостачи (невесты, человека, магического средства и др.), также свойственным сказкам.