
Салют, Хабр!
Я Иван, руковожу направлением голосового управления умным домом в SberDevices. Недавно мы обучили ГигаЧат в интеллектуальных колонках Сбер помогать в создании сценариев автоматизации голосом. Эта задача была неизбежной: общение на естественном языке — закономерный этап развития умных устройств. И непростой: реализовать управление умным домом на естественном языке сложнее, чем «болталку». Во-первых, у каждого юзера в умном доме свой набор комнат и устройств, их функций, названий. Во-вторых, умному дому нельзя ошибаться.
Сегодня расскажу, где в пайплайне обработки запроса общение с бэкендом, почему выбрали обучение на уровне контекста вместо supervised fine-tuning и что такое сценарная машина.
Часть первая: войти в фичу
Ранее я уже рассказывал на Хабре, как мы учили колонки Сбер проактивно создавать сценарии автоматизации в форме диалога. Если человек произносил фразу, которую можно понять как некое событие в доме — например, «Салют, я проснулся», «я ухожу» — ассистент предлагал некий набор подходящих действий в умном доме и согласовывал с пользователем. Условно: «Ага, понял, ты уходишь. Выключить весь свет? Выключить кондиционер?». После ОК от пользователя ответы сохранялись в приложении как сценарий.
В таком виде фича покрывала самые распространённые алгоритмы. Но вселенная возможных автоматизаций требовала более гибкого и точного решения на естественном языке. Для Умного дома Сбер и совместимых устройств других брендов сценарии можно настраивать в приложении Салют, и всё же часть аудитории предпочла бы голосовое создание сценариев. А значит, нам нужна была эта функция в умном доме.
Тут коротко напомню пайплайн коммуникации с ГигаЧатом в умной колонке:
-
NLP-платформа Intent Recognizer
-
Ранжировщик с эмбеддером. Они помогают определить, какие функции потребуется GigaChat для этого запроса.
-
ГигаЧат.
После распознавания и превращения в текст команда оказывается в Intent Recognizer. Он способен перенаправить команду в одно из множества разветвлений-навыков. Одно из них — так называемый навык умного дома.
У команды две пути: либо она уйдет сразу в навык, если определилась Intent Recognizer как относящаяся к умному дому, либо попадает в ГигаЧат, а тот уже при необходимости вызывает функцию умного дома (так, например, работают мультикоманды). Но для создания сценариев голосом через колонку потребовалось изменить пайплайн.
Ключевая фраза для запуска функции — «Салют, создай сценарий». Можно использовать также её синонимы: «Помоги создать сценарий» и так далее. Intent Recognizer опознаёт это как команду умного дома и передаёт навыку. Навык начинает монопольный захват диалога.
Именно навык во флоу создания сценариев «коммуницирует» и с ГигаЧатом, и с бэкендом Умного дома Сбер. Строго говоря, в интеллектуальных колонках используется несколько разных версий ГигаЧата — в соответствии с задачей. Для создания сценариев мы, протестировав варианты, выбрали ГигаЧат 2 Макс, более мощную модель: она обеспечила лучшее соотношение качество/latency.
Часть вторая. Как обучали ГигаЧат
Вторая реплика пользователя приходит в тот же навык умного дома. Но теперь он передаёт её в ГигаЧат — вместе с системным промптом.
На этом этапе в реализации встал выбор между supervised fine-tuning и обучением на уровне контекста. Первый вариант пришлось быстро отбросить, потому что:
-
Как уже ясно, у каждого пользователя свой контекст — набор устройств, их названий и комнат.
-
Выходит, даже если сгенерировать набор диалогов для обучения модели на одном аккаунте (= в одном умном доме), она не обязательно сможет адекватно работать с другим. Генерация обучающих данных через LLM слишком трудоёмка примерно по тем же причинам: слишком много неточностей и ошибок.
-
Ergo, задача подготовки правильных тестовых данных в нужном объёме для обучения слишком сложна, а при любой попытке срезать углы мы рискуем качеством модели.
В результате создание сценариев использует обучение на уровне контекста. При каждом входе в функцию модель получает системный промпт. Он динамический и сформирован в подходе RAG — retrieval-augmented generation, генерация с расширенным поиском.
Для разработки промпта мы проанализировали около 150 тысяч уже существующих сценариев. Оказалось, что самые частотные условия, при которых сценарий запускается — это (от самого частого к менее):

В итоге динамическая часть системного промпта содержит:
-
Данные об умном доме пользователя — набор устройств и проч. Их отдаёт в промпт навык умного дома.
-
История предыдущего диалога, которая позволяет ГигаЧату быть в контексте.
-
Примеры опций для каждого из устройств, отсортированные по частотности на основе аналитики. В целом опций намного больше, чем примеров в промпте. Например, в опциях для колонки есть «включить спокойную музыку». Но ГигаЧат понимает, что точно так же способен добавить в сценарий энергичную музыку. Или грустную. Другой вариант — только для умного света Сбер существует 16 млн оттенков. Разумеется, в примеры опций попадут только несколько.
Для умного света есть справочник, который хранит сотни словесных названий для комбинаций RGB-кодов, включая самые редкие. Поэтому умную лампу можно попросить включить, например, цвет бедра испуганной нимфы, цвет блошиного брюшка, гридеперлевый.
Также системный промпт содержит примеры диалогов. Они служат модели референсом.
Есть в промпте и постоянная часть. Она задаёт задачу для ГигаЧата и формулирует критерии успеха. Определяет, что модель должна учитывать пользовательские настройки ассистента в колонке: пол персонажа, предпочитаемое обращение — на «ты» или «вы». И напоминает, что нужно соблюдать принцип кооперации Грайса. В него входят четыре максимы:
-
качество ответов (только правдивая информация);
-
количество (не больше и не меньше данных, чем требуется);
-
релевантность (без отклонений от темы);
-
ясность (лаконичные ответы без двусмысленности).
Это один из базовых подходов к успешной коммуникации в целом, не только к искусственному интеллекту.

Промпт также задаёт формат ответа навыку умного дома. Ведь ГигаЧат должен не только понять, какой нужен сценарий, но и выдать результат диалога в такой форме, которую сможет обработать навык.
Скрытый текст
{
"chain_of_thoughts": "Пользователь хочет, чтобы подсветка в спальне включалась каждое утро в 6 часов.",
"replica": "Будем включать подсветку в спальне каждое утро в 6 часов. Подтверждаешь?",
"offers": [
{
"description": "Подсветка спальни утром",
"name": "Сценарий утренней подсветки",
"conditions": [
{
"time": "6:00",
"repetition": "MO,TU,WE,TH,FR,SA,SU"
}
],
"actions": [
{
"command": "включи подсветку в спальне"
}
]
}
],
"is_final": false
}
Задача искусственного интеллекта — провести диалог в свободной форме, понять логику алгоритма или алгоритмов. (Да, ГигаЧат способен решить, можно ли воплотить идею в одном сценарии или понадобятся несколько). Далее он передаёт последовательность действий в навык умного дома в виде JSON. Готово… но пока только со стороны ГигаЧата.
Бонус: тестируем ГигаЧат
У кейса с созданием сценариев автоматизации голосом есть дополнительная сложность: тестирование ответов модели. Стандартно берётся набор тестовых данных, которые прогоняют через модель, получают от неё ответы и сравнивают с ожидаемым результатом.
Но этот подход хорошо работает для короткого ответа модели. А создание сценария — это уникальный диалог с обменом несколькими репликами. Поэтому мы использовали подход бенчмарка LLM Arena, где судьёй в соревновании также становится искусственный интеллект. Участники тестирования — это:
ГигаЧат-помощник
Модель с динамическим промптом, эффективность которой мы проверяем в тесте. Её задача — создать сценарий. У неё есть стартовая реплика диалога, «полученная» от пользователя: переменная «start», заложенная в наборе тестовых данных.
ГигаЧат-пользователь
Вспомогательная модель, что имитирует владельца умного дома. Промпт содержит её задачу, некоторое количество примеров и идею (idea) сценария, которую модель «хочет» создать. Idea — это также переменная в тестовых данных, а значит, динамическая часть промпта.
ГигаЧат-судья
Модель, которая получает на вход переменную idea и созданный после диалога сценарий. Она должна вынести решение, соответствует сценарий идее или нет, прокомментировать, почему так решила, и выдать true или false в соответствии со своей оценкой.
Пример тестовых данных:
‘idea’ Когда я скажу «гости», включай музыку для вечеринки и гирлянды
‘start’ Хочу, чтобы по команде создавалась атмосфера для приёма гостей
Часть третья, где дело за бэкендом
Когда ГигаЧат выполнил свою часть задачи, то есть передал в навык умного дома JSON с желаемым сценарием или сценариями пользователя, начинается проверка, насколько он/они выполнимы. Это, как уже упоминалось, одна из сложностей задачи: у каждого пользователя свой набор устройств с уникальными названиями и неуниверсальными функциями; свои комнаты. Поэтому мы дополнительно проверяем сценарии вне модели. Например, на случай, если в примерах для категории умного света есть функция «включить северное сияние», а у конкретной лампочки функции нет.
Навык умного дома формирует из JSON набор действий, которые нужны по сценарию. Он же классифицирует действия внутри: какие относятся к умному дому, какие к другим устройствам — например, к умной колонке, на которой в рамках сценария нужно включить музыку. Проверяет, можно ли выполнить действия. Если да — добавляет ID устройства, участвующего в сценарии; информацию о комнате.
Сценарий уже в виде низкоуровневых команд попадает в так называемую сценарную машину на бэкенде умного дома. Она реализована как конечный автомат. С точки зрения устройства это сервис на GO над очередью, а та — над базой PostgreSQL. Он умеет один за другим исполнять задачи из этой очереди. Плюс есть API для управления сценариями — от создания до остановки.
Заключение
По моим наблюдениям уже сейчас интеллектуальные колонки и телевизоры — самый востребованный способ управления умным домом. Во-первых, они позволяют отдавать команды на естественном языке; во-вторых, можно командовать устройствами дистанционно, не находясь в конкретной комнате (или даже в конкретной квартире — например, если устройства на даче). Искусственный интеллект способен взять на себя часть этих задач… при условии, что главным по-прежнему останется человек. Колонки и телевизоры всегда рядом — и всегда готовы предоставить интерфейс для взаимодействия человека и искусственного интеллекта.
Автор: IvanGolubev


