Я делаю голосовой интерфейс для управления брокерским счётом, уже писал об этом на Хабре Алиса, купи акции Яндекс. В какой-то момент мне понадобилось извлекать из запроса цену в разных валютах. Уверен, я не первый, кто столкнулся такой задачей, поэтому попытался найти готовые интенты или именованные сущности на GitHub, но ничего не нашёл. На носу был хакатон, много разработчиков в одном месте, подумал я, если каждый поделится своими наработками, то сущностей наберётся на целую библиотеку. Так родилась идея для репозитория библиотека сущностей.
Пользовательские сущности в Диалогах
Когда я говорю умной колонке купи одну акцию Яндекс, то речь проходит через внутреннюю магию платформы Яндекс.Диалоги, затем попадает в веб-хук, который я указал в качестве обработчика навыка. Вот что приходит в обработчик:
"request": { "command": "купи одну акцию яндекс", "original_utterance": "купи одну акцию яндекс", "nlu": { "tokens": [ "купи", "1", "акцию", "яндекс" ], ... "intents": { "market.order": { "slots": { "amount": { "type": "YANDEX.NUMBER", "tokens": { "start": 1, "end": 2 }, "value": 1 }, "unit": { "type": "OperationUnit", "tokens": { "start": 2, "end": 3 }, "value": "share" }, "figi": { "type": "EFigi", "tokens": { "start": 3, "end": 4 }, "value": "BBG006L8G4H1" }, "operation": { "type": "OperationType", "tokens": { "start": 0, "end": 1 }, "value": "buy" } } } } }, ... },
Обратите внимание на слот
figi
, в котором содержится
идентификатор акции Яндекс, так называемый FIGI (Financial
Instrument Global Identifier), необходимый для взаимодействия с API
торговой платформы Тинькофф Инвестиции. Тип данных EFigi, это
пользовательская сущность, которую я описал в разделе Сущности при
создании навыка в платформе Яндекс.Диалоги. Вот фрагмент
описания:
entity EFigi: values: BBG005DXJS36: %exact TCS %lemma тиньков(банк)? тинькоф(банк)? тинькофф(банк)? ти си эс (груп)? BBG006L8G4H1: %exact YNDX %lemma яндекс яндекса BBG004730JJ5: %exact MOEX %lemma Московская Биржа Мосбиржа BBG002B2J5X0: %exact KRKNP %lemma [Саратовский НПЗ акции привилегированные] [Саратовский нефтеперерабатывающий завод акции привилегированные]...
Благодаря механизму сущностей, в коде обработчика мне не нужно делать дополнительных манипуляций над входными данными, чтобы получить FIGI. Платформа Диалогов преобразует название ценной бумаги в FIGI за меня.
Я использую EFigi в качестве нетерминала грамматики и типа слота в интентах. Интенты это такие регулярные выражения на стероидах в Диалогах. Благодаря интентам Диалоги понимают, какие данные нужно извлечь из пользовательского запроса и передать в обработчик. Вот пример интента для команды покупки/продажи ценных бумаг на бирже по рыночной цене:
slots: operation: source: $Operation type: OperationType figi: source: $Stock type: Efigi amount: source: $Amount type: YANDEX.NUMBER unit: source: $Unit type: OperationUnitroot: $Operation [$Amount $Unit $Stock]$Operation: $OperationType$Amount: $YANDEX.NUMBER$Unit: $OperationUnit$Stock: $EFigi
Это похоже на регулярные выражения.
Библиотека сущностей для Диалогов
Во время хакатона по разработке навыков для Алисы я создал репозиторий alice-entities-library, запушил туда сущность EFigi и отправился на GitHub искать репозитории, в которых есть описание пользовательских сущностей. Ожидал, что найду сотни репозиториев, свяжусь с разработчиками и предложу прислать пул-реквесты в библиотеку сущностей.
Репозитории искал по тегам: yandex-dialogs, alice-skills, yandex-alice и alice-sdk. Оказалось, мало кто использует теги на GitHub, мне удалось найти всего один репозиторий, содержащий файл с описанием сущности ELang. По стечению обстоятельств автором репозитория оказался Давид один из организаторов хакатона. Я предложил Давиду добавить сущность ELang в библиотеку и через несколько минут получил от него пул-реквест.
Другие участники онлайн-хакатона проигнорировали мои сообщения в чате с предложением пополнить библиотеку сущностей. Возможно, в разгар борьбы было не до этого. По правде говоря, я немного расстроился, но в конце добавил ссылку на репозиторий в sameoldmadness/awesome-alice.
Вместо заключения
Уважаемые разработчики навыков для Алисы, прошу вас по возможности выкладывать исходный код на GitHub, чтобы другие могли учиться.
Пожалуйста, добавляйте теги yandex-dialogs, alice-skills и yandex-alice к репозиториям, чтобы другие могли находить ваши навыки на GitHub.
Создайте в своём репозитории директорию
entities
и
поместите туда файлы с описанием сущностей, которые вы написали для
навыка, чтобы другие могли переиспользовать вашу работу.Прежде чем описывать новую сущность, загляните в библиотеку сущностей, возможно, там уже есть то, что вам нужно. А если нет, то, пожалуйста, добавляйте свои сущности в библиотеку.