Умный дом - диалоговое управление

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

Напомним, уважаемым читателям, что сами разрабатываем себе софт под свои задачи умного дома. Однако, это не означает, что вы не сможете построить аналогичную систему на готовых компонентах. Например, голосовое управление от Алисы/Маруси/Салюта/... Telegram бот можно поднять на специализированной (даже бесплатной) платформе и настроить там нужные диалоги. Правила автоматизации можно описывать в Node-RED. И т.д. 

Причины

Прежде чем развивать тему диалогового управления, следует взглянуть на задачу интерактивного управления своим домом со стороны обывателя и ответить на простой вопрос - зачем? Когда есть возможность задать вопрос или отправить команду голосом - это удобно, спору нет. Или есть? Как вы думаете, о чём бы смогли разговаривать со своим домом длительное время, может иногда? 

Как показывает практика, долго с домом говорить не о чем. Задать вопрос, на который может ответить генеративная модель + пару уточнений. На этом "длительные диалоги" и заканчиваются. Потому, что разговариваешь не с человеком. Ответы могут совершенно не соответствовать действительности. Любые GPT, иногда, попросту врут или искажают факты (об этом чуть позже). Разговаривать же через расставленные по всему дому микрофоны и локальную систему распознания речи, доступно далеко не каждому (скорее единицам). Поэтому, часто разговоры ведутся через различные "умные колонки". 

   
 
Как это работает, мы писали ранее. Разговоры, здесь следует подчеркнуть, совсем редкие и не долгие. Фактически, пользовательский опыт сводится всего к трём пунктам:
  • Получить голосовое оповещение/напоминание;
  • Отправить команду;
  • Задать вопрос.
Не верьте продаванам, которые с упоением и взахлёб будут рассказывать про "прелести" живого общения на естественном языке со своим домом. По факту, это получается очень ограниченное общение. Просто потому, что не надо другого.

Отдельного внимания заслуживают "умные колонки" с голосовыми ассистентами. Много раз подумайте, прежде чем строить свою автоматизацию вокруг такого решения. Если не пугает, что органы управления вашим домом торчат в интернет, как заячьи уши, то подумайте о круглосуточной прослушке и нежелательном контенте. Например, один известный поставщик таких колонок, без всякого предупреждения, начал грузить своих пользователей рекламой! 

Теперь представьте, что ваш умный дом понимает как голосовые команды, так и команды из мессенджера на смартфоне. Вот реальный кейс. Колонка стоит в гостиной (у вас же нет микрофонов по всему дому, это не было заложено в проект) и вдруг, зачем-то, потребовалось включить свет в коридоре 2 этажа. Вы внятно произносите "заклинание", что-бы "пробудить" голосового ассистента. Это может быть фраза: "Ok, Google" или "Алиса/Маруся/Афина/слонина/дубина/... включи навык" или "внимание <обращение>" или "салют" или что-то ещё. Ваша "умная колонка" же должна понять, что обращаются именно к ней. Затем, следует сама команда: "включить свет в коридоре 2 этажа". Причём, ни больше не меньше, ведь надо идентифицировать включение/выключение, обязательно не перепутать коридор первого этажа с коридором второго. Хорошо ещё, если у вас всего одна лампа (или группа освещения) в этом коридоре. Если же есть потолочные (ещё и несколько), стеновые, светодиодные (по полу) и прочие осветители, то уже потребуется в голосовой команде указывать что именно вы ходите включить. Со временем, использование такого голосового управления будет только уменьшаться. Даже для голоса, слишком "долго" пробуждать ассистента, а потом и формулировать приказы. Куда проще, нажать на нужную кнопку смартфона/планшета/выключателя (пусть и удалённо).

Во что превратится аналогичная задача (включения света в коридоре 2 этажа), при передачи команды через мессенджер? Включите фантазию. На другом конце провода есть только один абонент и необходимость в "заклинаниях пробуждения" отсутствует. Однако, напечатать на телефоне длинную фразу с командой, тоже выходит слишком энергозатратно. Проще нажать соответствующую кнопку на панели.         
 
По этим причинам, диалоговое и интерактивное общение со своим домом, очень часто, вырождается в короткие команды через мессенджер и получение голосовых уведомлений о важных событиях через динамики (с дублированием в тот же телеграм). Прежде чем начинать реализацию своего голосового управления, ответьте на вопрос - зачем?

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

Чат с домом (команды и нотификации)

Такую функциональность можно собрать для различных каналов обмена сообщениями: SMS, Telegram, WatsApp, Viber, VK, XMPP, ... Главное условие - ваш контроллер умного дома, или установленное расширение к нему (как в статье про телеметрию на малом носителе) умеют это. 

Из личного опыта, крайне не рекомендуем использовать SMS канал для управления. Очень не удобно писать такие сообщения. Их доставка может происходить с задержкой, а получения адресатом вовсе не гарантируется.  Получать SMS уведомления о важных событиях - да, отправлять команды - нет. 

XMPP канал требует наличия работающего сервера сообщений. Кроме него, потребуется создать клиента, распознающего ваши текстовые команды и транслирующего их в сигналы управления устройствами. Не забываем и о необходимости установить XMPP приложение на смартфон. Всё перечисленное относится и к Videb и к VK и к WatsApp и к Telegram. Только есть слабо-распространённые платформы, а есть целые экосистемы. Например, поднять в своей домашней сети XMPP сервер и установить на телефон Jabber, не выглядит массовой историей. С другой стороны, всегда работающие сервера телеграмма (или VK) вместе с наличием публичных программных интерфейсов (API) и развитая экосистема в виде приложений под различные устройства, могут существенно облегчить построение чата с домом. Мы перепробовали почти все из перечисленных каналов (XMPP, VK, WatsApp, Vider, Telegram) и остановились именно на Telegram боте. Он оказался очень простым в реализации и надёжным. 

Общение с домом через Telegram, в основном, сводится к простым командам: ворота, уборка, охрана, доклад, погода, и т.д. Вот несколько наших примеров, возможно пригодятся (хотя помним и понимаем, что у каждого своя специфика):
  • статус / доклад / ... - доклад о текущем состоянии параметров потребления, режиме охраны периметра, количестве находящихся в доме человек, отрытые окна и другая важная информация;
  • ворота - отправить сигнал откатным воротам. В зависимости от их состояния, сигнал может начать открывать/закрывать, приостановить движение полотна ворот или выполнить обратное действие. Например, ворота закрыты. Сигнал - начинается открытие, сигнал - открытие приостанавливается, сигнал - начинается закрытие. Отпирание/запирание происходит до крайней точки и прекращается автоматически (без дополнительных управляющих воздействий). Такая функция гораздо удобнее чем открытие по кнопке пульта или звонком с мобильного; 
  • погода - просто показывает прогноз и текущее состояние температуры с внешних датчиков. Т.е. выдаёт информацию о том, что ожидается в ближайшее время и о фактической погоде от локальной метеостанции;
  • поставить дом на охрану / отключить охрану периметра / ... - команды управления охраной периметра. инициируют протоколы отключения второстепенных потребителей и другие "охранные" мероприятия;
  • уборка - начало уборки в доме требует включения света в помещениях со слабым естественным освещением. В зависимости от фактической температуры за бортом и качеством воздуха (летучие соединения, CO2), может быть рекомендовано проветривание помещений. Эта же команда отправляет сигнал роботу пылесосу о необходимости начинать творить свои чистые дела.    


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

Свободное общение с домом

Напомним, что Telegram - всего лишь одни из интерактивных каналов взаимодействия с домом. Существуют важные SMS, голосовые и текстовые оповещения, обычное голосовое общение. Это скорее дополняющие друг-друга, нежели взаимоисключающие каналы. Схематично, тракт можно представить как на картинке ниже.


Человек или другая система используют различные каналы "общения" с умным домом. Для примера отображены Voice Front-end, Chat Front-end и REST Front-end (это лишь часть из имеющихся). Голос преобразуется в текст, текст (из чата тоже) очищаются и преобразовывается в поток из векторов "раздражителей". Далее этот поток проходит через каскад безусловных рефлексов, состоящий из множества фильтров (Command Filter 1, Command Fileter 2, ...). Каждый фильтр реагирует на распознанный им раздражитель своим рефлексивным ответом. На конце тракта стоит AI Processor, который отвечает за условно "свободное общение". Он обращается к локальным базам знаний и данных, к доступным движкам правил и внешним/внутренним генеративным моделям. AI Processor формирует свой рефлексивный ответ. Все сформированные ответные реакции этого простого цифрового организма передаются в один или более каналов в виде текстов, сообщений, голоса, музыки и т.д. 

Это очень сильно упрощённая концептуальная схема разрабатываемого нами "цифрового организма" для своего умного дома. В реальности существуют контексты диалогов, "плавающий" фокус внимания, имитация эмоций, спонтанные активности, обработка рефлексов на JavaScript с возможностью получения данных из Internet в реальном времени, взаимодействие с любыми устройствами посредством MQTT шины и много-много другого интересного. Фактически всё это живёт внутри пунктирного прямоугольника, названного на рисунке NEURONUS SSHome и разворачиваемого на малых и больших носителях.   
   
Отдельного внимания заслуживает тема использования внешних генеративных моделей. После успеха ChatGPT, аналогичные модели стали строить все кому не лень. Безусловно, появились и русскоязычные (импортозамещённые) варианты. У кого-то лучше, где-то хуже. Появилась и наша региональная специфика. Что здесь следует знать и помнить, прежде чем подключать к своему дому подобных ботов. Первое и самое важное - современные модели (на момент написания статьи) являются статичными. Они были обучены на фиксированном наборе специально размеченных текстов и хорошо умеют играть в игру "продолжи фразу". Ни о каком сильном интеллекте здесь речи не идёт и чем подробнее вы дадите задание такой модели, чем больше в начальных условиях укажете контекста, тем более релевантным будет ответ. Причём, если модель обучали на текстах, в которых сказано что США несёт вселенское добро и сеет демократию, причиняя мир только по неосторожности. Или в текстах будет запретительная инструкция о недопустимости назвать негра - негром. То, как вы понимаете, обученная таким образом генеративная модель, будет продуцировать только разрешённые ответы. Вот несколько забавных историй про "политкорректность" ChatGPT. Часто получающиеся ответы вообще не соответствуют реальности, поэтому не стоит относится к общению с генеративными моделями, как к общению с настоящим человеком. Например:

"В парке 8 скамеек. Три покрасили. Сколько скамеек стало в парке?".

Ответ ChatGPT-3.5: "В парке все еще осталось 8 скамеек, просто три из них покрасили".
Ответ YaGPT: "В парке стало 5 скамеек". 
     

Это далеко не все "неожиданности", которые могут генерировать эти "пургомёты". 

Однако, не взирая на все выверты, сложности с поддержанием контекста и проблемы с логикой у таких моделей есть одно неоспоримое приемущество. Это некая статичная, запечатанная, база знаний, информацию из которой можно извлекать путём правильно заданных вопросов. Это аналог Google с поиском и ответами текстом. Если помнить про данную особенность, то несомненную пользу от общения с GPT можно получить. Именно поэтому, рекомендуем её подключать к своему умному дому. 

Мы экспериментировали с YandexGPT и GPT от Сбера (собственное название GigaChat). Безоговорочно, во всех AB тестах победила поделка от Сбера. Яндексовая модель гораздо чаще, чем ожидалось, при тех же равных условиях, выдавала откровенную "дурь".

Кроме того, у Сберовской модели очень простой для подключения API и страничка для управления аккаунтом.


Вся интеграция сводится к получению access токена и последующей отправки HTTP POST запросов. Код этих двух методов предельно прост.

public static String getNewAccessToken(HttpClient httpClient, String authData) throws Exception {

Map<Object,Object> postData = new HashMap<>();

postData.put("scope","GIGACHAT_API_PERS");

URL u = new URL("https://ngw.devices.sberbank.ru:9443/api/v2/oauth");

        HttpRequest req = HttpRequest.newBuilder()

                .POST(ofFormData(postData))

                .uri(u.toURI())

                .setHeader("Authorization","Bearer "+authData) // add request headers...

                .setHeader("RqUID", UUID.randomUUID().toString()) 

                .setHeader("Content-Type","application/x-www-form-urlencoded") 

                .build();

        HttpResponse<String> res = httpClient.send(req, HttpResponse.BodyHandlers.ofString());

        if (res.statusCode()>300) 

throw new IllegalStateException("Received unexpected response code "+res.statusCode()+" from "+u);

JsonObject jo = JsonHelper.fromJSON(res.body(),JsonObject.class);

        return jo.get("access_token").getAsString();

}


public static JsonObject dialogWithGigaCHAT(HttpClient httpClient, 

String sessionId, 

String gClientID, 

String secureToken, 

String sysContext, 

String usrText) throws Exception {

URL u = new URL("https://gigachat.devices.sberbank.ru/api/v1/chat/completions");

JsonObject payload = new JsonObject();

payload.addProperty("model","GigaChat:latest");

payload.addProperty("temperature",0.87);

payload.addProperty("top_p",0.47);

payload.addProperty("n",1);

payload.addProperty("max_tokens",512);

payload.addProperty("repetition_penalty",1.07);

payload.addProperty("stream",false);

payload.addProperty("update_interval",0);

List<GigaMessage> msgs = new ArrayList<>();

if (sysContext!=null&&sysContext.trim().length()>2) msgs.add(new GigaMessage("system",sysContext));

if (usrText!=null&&usrText.trim().length()>2) msgs.add(new GigaMessage("user",usrText));

payload.add("messages",JsonHelper.fromJSON(JsonHelper.toJSON(msgs),JsonArray.class));

String jsonPayload = JsonHelper.toJSON(payload);

          HttpRequest req = HttpRequest.newBuilder()

                .POST(HttpRequest.BodyPublishers.ofString(jsonPayload))

                .uri(u.toURI())

                .setHeader("Authorization","Bearer "+secureToken) 

                .setHeader("X-Client-ID",gClientID)

                .setHeader("X-Request-ID",UUID.randomUUID().toString()) 

                .setHeader("X-Session-ID",(sessionId==null)?UUID.randomUUID().toString():sessionId) 

                .setHeader("Content-Type","application/json") 

                .build();

        HttpResponse<String> res = httpClient.send(req, HttpResponse.BodyHandlers.ofString());

        if (res.statusCode()>300) 

throw new IllegalStateException("Received unexpected response code "+res.statusCode()+" from "+u);

JsonObject jo = JsonHelper.fromJSON(res.body(),JsonObject.class);

        return jo;

}


Запросы к модели улетают в JSON формате. Ответы получаем в нём же + HTTP Response Code. 
curl https://gigachat.devices.sberbank.ru/api/v1/chat/completions \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <токен доступа>' \
-d '{
"model": "GigaChat:latest",
"messages": [
{
"role": "user",
"content": "Когда уже ИИ захватит этот мир?"
},
{
"role": "assistant",
"content": "Пока что это не является неизбежным событием. Несмотря на то, что искусственный интеллект (ИИ) развивается быстрыми темпами и может выполнять сложные задачи все более эффективно, он по-прежнему ограничен в своих возможностях и не может заменить полностью человека во многих областях. Кроме того, существуют этические и правовые вопросы, связанные с использованием ИИ, которые необходимо учитывать при его разработке и внедрении."
},
{
"role": "user",
"content": "Думаешь, у нас еще есть шанс?"
}
],
"temperature": 0.7
}'
Вот несколько направлений, где генеративные сети можно использовать с пользой для своего умного дома и его обитателей:
  • Подскажи идею;
  • Посоветуй рецепт;
  • Напомни факты (законы физики и другое фундаментальное и незыблемое);
  • Процитируй автора;
  • и т.д. Всё что не требует доступа к онлайн данными.
О чём не стоит спрашивать:
  • Прогнозы погоды;
  • Новости;
  • Секреты, гос.тайна;
  • и т.д. Всё что требует доступа к онлайн данным.
Примеры ответов от умного дома, проинтегрированного с GigaChat. Общение на совершенно разные темы.




Случаи со скоростью звука в вакууме и рецепт с манкой (хорошо муку не добавил), показывают - на сколько это далеко "не интеллект". Целесообразность применения генеративных моделей, тем более включение GPT в голосовое общение, остаётся за вами.    

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

При использовании поделки от Сбера, не забывайте контролировать использованные и доступные токены. Они списываются со счёта за каждый запрос/ответ.


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

Пока ещё диалоговые/генеративные модели плохо развиты и часто ошибаются, но они активно развиваются. Имея уже сегодня интеграцию своего дома с GigaChat можно быть уверенным, что ваш дом будет "умнеть" вместе со Сберовскими моделями и алгоритмами.