Всем привет! На связи Настя Шахматова из команды Нейронавыков SberDevices. Мы делаем развлекательные навыки на основе GigaChat для виртуального ассистента Салют.
Под занавес 2023 года наша команда представила релиз детского навыка «Сочини сказку» на умных колонках SberBoom и SberBoom Mini на базе GigaChat Lite. Этим летом семейство умных устройств пополнила также колонка SberBoom Home.
Сегодня мы провели релиз версии для экранов на новых платформах Салют ТВ, SberBox, SberBox Top, SberBox Time на модели GigaChat Pro. Для запуска навыка, как и прежде, нужно сказать ассистенту: «Сочини сказку». Далее ассистент предложит выбрать героя, и пользователь сможет стать соавтором сказочной истории.
Если у пользователя есть конкретная идея, какую сказку он хочет услышать, запрос может быть контекстно расширенным, например: «Салют, сочини сказку о том, как князь Гвидон отправился в супермаркет на поиски чудодейственного зелья» или «Сочини сказку про Бабу Ягу, у которой сбежала избушка». В ином случае навык предложит двух героев на выбор.
После выбора героя начнётся генерация интерактивной истории, на протяжении которой будут предлагаться возможные развития событий. Также можно проявить креативность и развивать сюжет именно так, как захочется. К 5–8 шагу история подойдёт к логическому завершению, а герой достигнет своей сказочной цели. Затем появится возможность прослушать сказку целиком, а также сохранить её в личную коллекцию (раздел «Мои сказки») для повторного воспроизведения. После этого можно сочинить новую увлекательную сказочную историю.
Аудиальный и визуальный канал требуют разных подходов к удержанию внимания пользователя, поэтому для версии на экранах сказки сопровождают картинки главного героя истории и его окружения, сгенерированные моделью Kandinskiy-3.0.
Посмотрим на пример автоматической генерации текста интерактивной сказки по шагам!
Запрос пользователя: Салют, сочини сказку про Тигрулю
Ответ модели: Жила-была на свете Тигруля. Она была самой жизнерадостной кошкой в лесу. Однажды она услышала крик о помощи из ближайшего пруда. Это был Водяной, который попал в беду. Его дом начал разрушаться, и ему нужна была помощь, чтобы выбраться из воды. У Тигрули возникло желание спасти Водяного. И так началось её невероятное приключение...
Что будет дальше? Можем Вытащить Водяного самостоятельно
или Попросить помощи у друзей
Запрос пользователя: Попытаться вытащить Водяного самостоятельно
Ответ модели: Тигруля попробовала вытащить Водяного самостоятельно, но пруд был слишком глубоким, а Водяной слишком тяжёлым. Водяной продолжал тонуть, и его дом разрушался всё больше.
Что будет дальше? Можем Найти волшебные предметы для создания корабля
или Позвать на помощь
Запрос пользователя: Попроси помощи у друзей
Ответ модели: Тигруля решила попросить помощи у своих друзей. Она собрала Бурого Медвежонка, Белочку и Зайчика, и они все вместе отправились к пруду. Там они увидели, что Водяной уже почти утонул, а его дом превратился в груду обломков. Друзья пытались вытащить Водяного, но у них тоже не хватало сил.
Как продолжим историю? Можем сдаться
или Придумать новый план спасения
Запрос пользователя: Найти волшебные предметы для создания корабля
Ответ модели: Тогда Тигруля предложила найти волшебные предметы, которые помогут им создать Летучий корабль. Друзья разделились и отправились на поиски. Они искали по всему лесу, заглядывали под каждый куст и дерево. Наконец, после долгих поисков, они нашли всё необходимое: золотые перья для крыльев, серебряные струны для корпуса и магический кристалл для управления кораблём.
Что будет дальше? Можем создать Летучий корабль из найденных предметов
или Найти мудрого старца, чтобы он помог собрать корабль
Запрос пользователя: Пусть создадут из найденных предметов Летучий корабль
Ответ модели: С помощью найденных волшебных предметов друзья начали создавать Летучий корабль. Они аккуратно прикрепили золотые перья к серебряному корпусу, а затем вставили магический кристалл в центр управления. Когда всё было готово, Летучий корабль ожил и засверкал в лучах солнца.
Друзья успешно спасли Водяного, и он поблагодарил их за своё спасение. Водяной пригласил всех к себе домой, где они отпраздновали свою победу и поделились историями о своих приключениях. С тех пор Тигруля и её друзья стали настоящими героями леса. И каждый раз, когда они смотрели на небо, они видели отражение своего Летучего корабля, напоминающего им о том, что нет ничего невозможного, если действовать вместе.
А таким может быть визуальный облик Тигрули в навыке:
Как видно, сказка логично завершилась, когда главный герой достиг цели.
Также в рамках автоматической генерации действия, развивающие сюжет, были выбраны случайным образом из предложенных или сгенерированы моделью — в реальных условиях пользователь может назвать любое следующее действие, проявляя свою креативность.
Теперь расскажем о том, как создавался этот навык.
В 2022 у нашей команды существовал интерактивный проект Нейроквестов, ориентированный на взрослую аудиторию. В основе было 3 генеративных компонента:
стартовый абзац в выбранном жанре;
варианты продолжения истории;
эпилог.
Уже тогда мы хотели сделать Нейроквесты доступными и для детской аудитории и экспериментировали с жанром сказки. Однако, генераций, которые бы отражали характерные особенности жанра, не получалось: сказкам не хватало волшебства, фольклорной стилистики и, самое главное, осмысленности сюжета.
Затем мы применили подход с конечным автоматом: разбили сюжет сказки на основные события, основываясь на «Морфологии сказки» В. Проппа, зафиксировали часть текста и оставили слоты под генеративное творчество модели.
От продукта мы по-прежнему оставались далеки, однако, продолжали стремиться реализовать детский сказочный навык.
Чёткое видение продукта и целевой аудитории сформировались летом 2023 года, когда мы проанализировали общий трафик «сказочных» запросов в виртуальный ассистент Салют и изучили имеющиеся в российской индустрии решения от коллег по рынку.
Каким мы видели свой навык?
Как продукт: волшебные, добрые, сказочные истории с характерной лексикой, понятные современному ребёнку.
Целевая аудитория: дети дошкольного возраста, школьники младших классов (6-9 лет) и их родители.
Поверхность реализации: для MVP выбрали аудиальный канал — умные колонки семейства Sberboom.
Далее нам было необходимо грамотно сформировать пайплайн разработки от выбора формата до релиза.
Для определения оптимального формата взаимодействия с детьми вместе с командой UX-исследований мы провели эксперимент, участниками которого стали дети различных возрастных категорий.
Детям было предложено два альтернативных формата работы навыка:
прослушивание цельных текстов сказок, не требующих активного участия;
интерактивная сказка, предполагающая совместное творчество с моделью.
В обоих случаях дети проходили этап онбординга — погружения в навык, объясняющего инструкцию по использованию и предполагающего выбор героя, его цели и помощников. Короткий онбординг, в ходе которого ребёнок выбирает только главного героя, оказался менее утомительным в сравнении с большим количеством уточняющих вопросов на старте.
При этом больше интереса и вовлечённости дети проявили при тестировании интерактивного режима. Оптимальная длина сказки, которая не успевала наскучить, составила 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-го шага — мы хотели оценить, сколько пользователей доходят до конца сказки с такой длиной. Аналитика показала, что дети вовлечены в истории и хотят сочинять более продолжительные сказки.
Решением стала проработка «ансамбля» промптов. Для различных этапов сценария сказки в ходе экспериментов был подобран свой промпт:
стартовый — в нём формируются требования к лексической и жанровой составляющей сказки, вводится герой и увлекательная цель, требующая разрешения к эпилогу;
игровой — с его помощью после каждого шага генерации предлагается 2 варианта развития истории;
сюжетный — благодаря ему сюжет сказки развивается консистентно на основе решений пользователя;
завершающий — отвечает за генерацию конца сказки при достижении героем заданной на старте цели.
Такой подход повысил интересность и логичность сказочных историй в навыке.
Релиз навыка на экранах открыл перед нами возможность работы с GigaChat Pro. Генеративная способность модели и более высокая чувствительность к системным промптам позволили нам получить лучшие показатели по метрикам оценке качества генераций.
В отличие от устройств Sberboom, где максимальное время ожидания ответа модели составляет ≈7 секунд, и дальше наступает таймаут, на экранах мы можем обойти эту проблему, используя polling запросов (использование SSE или другого протокола невозможно, так как виртуальный ассистент Салют поддерживает только HTTP запросы).
Таким образом, в навыке на колонках используется GigaChat Lite — самая быстрая модель, а на поверхностях с экраном — GigaChat Pro — с самыми качественными генерациями.
В начале статьи мы уже немного продемонстрировали интерфейс, с которым встретится пользователь «Сочини сказку».
Поговорим о визуале — как и для каких этапов сценария мы генерировали картинки.
Подготовка галереи изображений началась до релиза Kandinskiy-3.1. К тому же, одной из особенностей этой версии является функция «улучшения промпта» на базе модели Neural-Chat-v3-1. Для нашей задачи основу для генераций составляли именные сущности (главные герои сказок), многие из которых модель не способна отрисовать по одному лишь наименованию (попробуйте самостоятельно сгенерировать картинку по запросу «Хагги Вагги», «Трубадурочка» или, например, «Чиполлино»). Поэтому для сохранения единой стилистики и качественных фиксированных промптов все генерации были сделаны на модели 3.0.
Для нас было важно подобрать такие текстовые промпты, которые бы позволили максимально приблизиться к узнаваемому облику заявленного героя. Мы не хотели, чтобы модель вносила дополнительные правки в промпт или отрицательно влияла на желаемую стилистику изображений.
Примеры генерации по запросу «Чиполлино» с разными версиями модели Kandinskiy:
Пример генерации по нашему промпту, описывающему внешний вид Чиполлино:
Можно предположить, что в обучающих данных картиночной модели изображение сопровождается расширенными дескриптивными характеристиками, а не (или не только) верхнеуровневым наименованием.
Вероятно, сущности, у которых в датасете встречалось большое количество примеров с неймингом, модель могла выучить «в лицо» (например, Чебурашку или Гарри Поттера). Однако, менее популярных героев сказок и мультфильмов по одному лишь имени отрисовать возможно уже не всегда. Тем не менее, в некоторых случаях промпт с расширенным описанием внешности давал почти абсолютное сходство с известными всем персонажами.
Для формирования галереи «Сочини сказку» мы взяли героев, которых предлагаем пользователю на старте, а также наиболее популярных у детей.
Сущности можно классифицировать на четыре типа:
абстрактные персонажи (мама, девочка Катя, котёнок, фея и др.);
персонажи народных сказок;
персонажи авторских сказок;
персонажи мультфильмов (российских и зарубежных).
Для каждого героя с помощью few-shot промпта-инструкции на базе GigaChat Pro было получено описание внешности, которое проверялось и редактировалось вручную. Затем по ним генерировались картинки, и лучшие из них попали в галерею.
Процесс продолжался до тех пор, пока для каждого героя в галерее не оказалась как минимум пара красивых иллюстраций. На них удалялся фон — так герои становились более живыми, словно в 3D-эффекте.
Помимо выбранного на этапе онбординга героя, который будет сопровождать пользователя на каждом шаге игры, на экране также будут сменяться локации — фоновые картинки.
Для сбора галереи локаций мы воспользовались методом извлечения именованных сущностей из сказочных текстов и автоматических генераций сказок по нашему пайплайну. Дальнейшая обработка картинок повторяла этапы работы с героями, за исключением удаления фона.
В настоящий момент матчинг картинки из галереи с текстом на экране осуществляется по ключу-названию изображения (Баба Яга, сказочный лес и т.п) с помощью Sbert-large-mt-nlu-ru.
Со временем мы будем стремиться расширять нашу галерею, пробовать различные модели и методы генерации анимации, добавлять игровые механики.
Пока предлагаем запустить навык на устройствах с экраном: Салют ТВ, SberBox, SberBox Top, SberBox Time и на колонках Sberboom, Sberboom Mini или Sberboom Home и погрузиться в мир сказочных грёз. Просто скажите: «Салют, сочини сказку»!
До новых встреч!
Сергей Марков (Управляющий директор направления)
Валентина Хлебутина (Head of RnD for VA)
Алина Непомнящих (Product Manager, куратор редакторской команды разметки)
Павел Аникейчик (Project Manager)
Анастасия Шахматова (NLP-разработка, продовая и RnD аналитика, промпт-инжиниринг)
Марина Ермолаева (NLP-разработка, игровые механики)
Илья Мищенко (Frontend Developer)
Артур Мусаев (Продовая и RnD аналитика)