Платформа SmartMarket позволяет разработчику с любым уровнем подготовки создавать мультимодальные приложения для виртуальных ассистентов Салют, даже без программирования. Конечно, если хочется сделать что-то красивое и сложное, без кода не обойтись. Чтобы облегчить жизнь разработчикам, мы делимся с ними нашими наработками в open source. На митапе разработчиков SmartMarket, прошедшем в декабре, мы рассказали о новом фреймворке.
Ниже вы найдете текстовую версию доклада и его видеозапись.
Друзья, привет! Меня зовут Кристина, я backend-разработчик SberDevices и тимлид сервиса управления диалогом, который используется для работы виртуальных ассистентов Салют. Расскажу вам сегодня о новом инструменте SmartMarket – SmartApp Framework, который мы выложили в open source.
Итак, давайте посмотрим, что же это такое. Во-первых, это Python-фреймворк, который создан для того, чтобы вы могли разрабатывать backend для смартапов с поддержкой виртуальных ассистентов Салют. Мы активно используем этот фреймворк внутри Сбера, большое число наших собственных смартапов построено на нем. Это такие диалоговые приложения, как погода, текущее время, многие банковские навыки, это и диалоговая часть Canvas App, про который очень хорошо и подробно рассказал мой коллега Антон. Наш самый любимый и вкусный пример Canvas App – это заказ попкорна, а также это app каталога.
![](https://habrastorage.org/r/w1560/webt/gk/yh/is/gkyhis5emtb0vm2srad5jjhapjc.png)
C помощью фреймворка можно разрабатывать диалоговую часть Native App, как яркий пример – это app видео. (О разных типах смартапов можно узнать здесь. – Примеч. ред.)
Давайте рассмотрим, что нам предоставляет фреймворк, на чем он основан. Одна из его основных особенностей в том, что диалоговая механика построена на механизме слотфиллинга. Что это такое? Приведу пример. Допустим, мы с вами хотим создать диалоговый навык P2P-перевода. Диалоговую часть можно схематично описать некоей формой, поля которой – это те сущности, которые мы хотим узнать у пользователя. В частности, для случая P2P-перевода мы хотим у пользователя узнать его имя, сумму, которую он хочет перевести, и согласие на подтверждение операции.
Одно из основных свойств поля – филлер. Филлер – это сущность, извлекающая из запроса пользователя информацию, которую мы хотим узнать. Помимо этого у поля есть свойство — question, которое позволяет задать вопрос пользователю.
Здесь есть несколько важных, на мой взгляд, моментов. Во-первых, диалог может строиться в произвольном порядке. Например, по шагам, когда пользователь сначала называет получателя, затем сумму. Также можно сказать в одном предложении: «Переведи 100 рублей папе». Или просто: «Переведи 100 рублей», и ассистент уточнит: «Кому?». Таким образом, нет необходимости переспрашивать у пользователя информацию и учитывать всю вариативность в описании диалога.
![](https://habrastorage.org/r/w1560/webt/3m/xa/k2/3mxak2u3dq-vttigehohdtap_-w.png)
Извлеченные из диалога сущности можно переиспользовать, например, в других сценариях смартапа или далее по сценарию, это возможно «из коробки».
Сам диалоговый сценарий мы можем описывать несколькими путями. Первый и самый простой – декларативно с помощью нашего внутреннего языка DSL, который выглядит, как JSON. Здесь я привела пример того, как декларативно описать поле, которое извлекает имя пользователя и задает ему вопрос.
![](https://habrastorage.org/r/w1560/webt/uh/fv/bi/uhfvbirvjgn-ofjzvduob8id2rw.png)
Но стоит помнить, что это все-таки фреймворк, то есть не только DSL, но и много кода. Мы старались проектировать фреймворк так, чтобы разработчик практически любую его часть мог легко переопределить. Сразу после входа в ваше приложение доступен его config, в котором все базовые классы можно легко переопределить, поддержав интерфейс. Мы этому посвятили целый раздел нашей документации для разработчика.
На практике механизм слот филлинга плохо работает без хорошей предобработки текста. Каждый запрос от пользователя перед тем, как попадает в ваш смартап, проходит этап предобработки, что позволяет внутри фреймворка извлекать такие именованные сущности, как: временной интервал, организация, локация, ФИО, валюта, сумма и многие другие.
На слайде приведен небольшой пример того, как выглядит результат предобработки текста, который приходит в смартап.
![](https://habrastorage.org/r/w1560/webt/iu/iz/vz/iuizvzc_vnca93pnkfxfe3vq9wu.png)
Работать с сырым JSON неудобно, поэтому для разработчиков внутри SmartApp Framework реализовано представление результатов предобработки в виде объектов классов, позволяющих удобно обращаться к сущностям предобработки. Благодаря этому филлер, который извлекает из предобработанного текста фамилию, имя, отчество пользователя, можно описать одной строкой на DSL или парой строк кода.
Допустим, вы – разработчик, не зарегистрированный в SmartMarket, вам не хочется подключаться к нашему виртуальному ассистенту, но, тем не менее, написать и запустить свой смартап вы можете. Внутри SmartApp Framework реализовано локальное тестирование. При этом вы будете видеть подробный лог того, что у вас происходит. Но есть одна особенность: смартап должен принимать на вход предобработанный текст. В фреймворке есть модуль предобработки текста. Это не полноценная платформенная предобработка, в ней присутствуюет морфология, леммы, но отсутствуют извлекаемые сущности. Тем не менее этого достаточно для запуска прототипа.
![](https://habrastorage.org/r/w1560/webt/dn/kf/xw/dnkfxwnps_evm309s5zdysuzdz8.png)
Если вы зарегистрированы в SmartApp Studio, вы умеете регистрировать свой вебхук и хотите попробовать запустить фреймворк, вам нужно сделать три простых шага:
![](https://habrastorage.org/r/w1560/webt/ju/3p/6g/ju3p6gytube1u8uckukz9u45nso.png)
На этом у меня все. Будем рады вашим отзывам, пулреквестам и даже issues. SmartApp Framework доступен по ссылке.
Приглашаем 11 февраля на Второй онлайн-митап разработчиков SmartMarket.
В этот раз поговорим об устройстве хорошего мультимодального приложения для виртуальных ассистентов Салют, возможностях ASR и TTS, а также о монетизации смартапов на платформе SmartMarket.
Узнать подробнее, что вас ждет на митапе, и зарегистрироваться на него можно здесь.
Ниже вы найдете текстовую версию доклада и его видеозапись.
Друзья, привет! Меня зовут Кристина, я backend-разработчик SberDevices и тимлид сервиса управления диалогом, который используется для работы виртуальных ассистентов Салют. Расскажу вам сегодня о новом инструменте SmartMarket – SmartApp Framework, который мы выложили в open source.
Итак, давайте посмотрим, что же это такое. Во-первых, это Python-фреймворк, который создан для того, чтобы вы могли разрабатывать backend для смартапов с поддержкой виртуальных ассистентов Салют. Мы активно используем этот фреймворк внутри Сбера, большое число наших собственных смартапов построено на нем. Это такие диалоговые приложения, как погода, текущее время, многие банковские навыки, это и диалоговая часть Canvas App, про который очень хорошо и подробно рассказал мой коллега Антон. Наш самый любимый и вкусный пример Canvas App – это заказ попкорна, а также это app каталога.
![](https://habrastorage.org/webt/gk/yh/is/gkyhis5emtb0vm2srad5jjhapjc.png)
C помощью фреймворка можно разрабатывать диалоговую часть Native App, как яркий пример – это app видео. (О разных типах смартапов можно узнать здесь. – Примеч. ред.)
Диалоговая механика
Давайте рассмотрим, что нам предоставляет фреймворк, на чем он основан. Одна из его основных особенностей в том, что диалоговая механика построена на механизме слотфиллинга. Что это такое? Приведу пример. Допустим, мы с вами хотим создать диалоговый навык P2P-перевода. Диалоговую часть можно схематично описать некоей формой, поля которой – это те сущности, которые мы хотим узнать у пользователя. В частности, для случая P2P-перевода мы хотим у пользователя узнать его имя, сумму, которую он хочет перевести, и согласие на подтверждение операции.
Одно из основных свойств поля – филлер. Филлер – это сущность, извлекающая из запроса пользователя информацию, которую мы хотим узнать. Помимо этого у поля есть свойство — question, которое позволяет задать вопрос пользователю.
Здесь есть несколько важных, на мой взгляд, моментов. Во-первых, диалог может строиться в произвольном порядке. Например, по шагам, когда пользователь сначала называет получателя, затем сумму. Также можно сказать в одном предложении: «Переведи 100 рублей папе». Или просто: «Переведи 100 рублей», и ассистент уточнит: «Кому?». Таким образом, нет необходимости переспрашивать у пользователя информацию и учитывать всю вариативность в описании диалога.
![](https://habrastorage.org/webt/3m/xa/k2/3mxak2u3dq-vttigehohdtap_-w.png)
Извлеченные из диалога сущности можно переиспользовать, например, в других сценариях смартапа или далее по сценарию, это возможно «из коробки».
Сам диалоговый сценарий мы можем описывать несколькими путями. Первый и самый простой – декларативно с помощью нашего внутреннего языка DSL, который выглядит, как JSON. Здесь я привела пример того, как декларативно описать поле, которое извлекает имя пользователя и задает ему вопрос.
![](https://habrastorage.org/webt/uh/fv/bi/uhfvbirvjgn-ofjzvduob8id2rw.png)
Но стоит помнить, что это все-таки фреймворк, то есть не только DSL, но и много кода. Мы старались проектировать фреймворк так, чтобы разработчик практически любую его часть мог легко переопределить. Сразу после входа в ваше приложение доступен его config, в котором все базовые классы можно легко переопределить, поддержав интерфейс. Мы этому посвятили целый раздел нашей документации для разработчика.
Предобработка текста
На практике механизм слот филлинга плохо работает без хорошей предобработки текста. Каждый запрос от пользователя перед тем, как попадает в ваш смартап, проходит этап предобработки, что позволяет внутри фреймворка извлекать такие именованные сущности, как: временной интервал, организация, локация, ФИО, валюта, сумма и многие другие.
На слайде приведен небольшой пример того, как выглядит результат предобработки текста, который приходит в смартап.
![](https://habrastorage.org/webt/iu/iz/vz/iuizvzc_vnca93pnkfxfe3vq9wu.png)
Работать с сырым JSON неудобно, поэтому для разработчиков внутри SmartApp Framework реализовано представление результатов предобработки в виде объектов классов, позволяющих удобно обращаться к сущностям предобработки. Благодаря этому филлер, который извлекает из предобработанного текста фамилию, имя, отчество пользователя, можно описать одной строкой на DSL или парой строк кода.
Запуск и тестирование смартапа
Допустим, вы – разработчик, не зарегистрированный в SmartMarket, вам не хочется подключаться к нашему виртуальному ассистенту, но, тем не менее, написать и запустить свой смартап вы можете. Внутри SmartApp Framework реализовано локальное тестирование. При этом вы будете видеть подробный лог того, что у вас происходит. Но есть одна особенность: смартап должен принимать на вход предобработанный текст. В фреймворке есть модуль предобработки текста. Это не полноценная платформенная предобработка, в ней присутствуюет морфология, леммы, но отсутствуют извлекаемые сущности. Тем не менее этого достаточно для запуска прототипа.
![](https://habrastorage.org/webt/dn/kf/xw/dnkfxwnps_evm309s5zdysuzdz8.png)
Если вы зарегистрированы в SmartApp Studio, вы умеете регистрировать свой вебхук и хотите попробовать запустить фреймворк, вам нужно сделать три простых шага:
- первый – это поставить сам фреймворк из GitHub;
- второй шаг – создать смартап командой create_app. Вместе с проектом развернётся пример диалогового сценария для того, чтобы вам было проще начать разработку;
- третий – командой run_app вы запускаете смартап и уже можете тестировать. «Из коробки» вам будет доступен тестовый сценарий, который «знакомится с пользователем» и показывает базовые умения ассистента.
![](https://habrastorage.org/webt/ju/3p/6g/ju3p6gytube1u8uckukz9u45nso.png)
На этом у меня все. Будем рады вашим отзывам, пулреквестам и даже issues. SmartApp Framework доступен по ссылке.
***
Приглашаем 11 февраля на Второй онлайн-митап разработчиков SmartMarket.
В этот раз поговорим об устройстве хорошего мультимодального приложения для виртуальных ассистентов Салют, возможностях ASR и TTS, а также о монетизации смартапов на платформе SmartMarket.
Узнать подробнее, что вас ждет на митапе, и зарегистрироваться на него можно здесь.