А для тех, кто готов много читать, я подготовил длинный рассказ о мотивах, которые побудили заняться голосовыми помощниками.
Люди с ограниченными возможностями
Когда-то я разрабатывал популярный онлайн-сервис для изучения иностранных языков. Компания, в которой я работал, выделяла много времени на адаптацию онлайн-сервисов для пользователей с ограниченными возможностями. Когда делал улучшение на сайте, а затем читал отзывы людей, которые не видели графический интерфейс глазами, но слышали через голосовой интерфейс скрин-ридера, то впервые в жизни пришло понимание, что моё зрение не всегда будет стопроцентным и стоит поменьше времени проводить перед монитором, смартфоном, планшетом и т.д.
Голосовые помощники
В начале «десятых» голосовые помощники вроде Siri были на слуху, но я не воспринимал их как что-то, способное значительно снизить нагрузку на глаза. Когда держал в руках iPhone с Siri, то это было не то; понимаете, всё равно я смотрел в экран смартфона. Когда держишь в руках смартфон, то велик соблазн залипнуть в экран на полчаса.
Умные колонки
Примерно в 2014-2015 годах стали появляться «умные колонки» с голосовым ассистентом. Насколько я помню, пальма первенства принадлежит колонке Amazon Echo с голосовым помощником Alexa. На этой волне в компании, где я работал, началась разработка голосового приложения для изучения иностранных языков под Amazon Echo.
Первые ожидания
Когда я впервые увидел, как работает Amazon Echo, то понял, что это именно то, что нужно, для снижения зрительной нагрузки на глаза. У меня возникло ощущение, что через несколько лет всё это разовьётся настолько, что большинство операций, которые я делал при помощи смартфона или компьютера, я буду делать через колонку. Я ждал. Ждал, пока разработчики голосовых интерфейсов сделают мою жизнь комфортнее.
Радовался, когда компания Яндекс запустила в продажу Станцию с Алисой. Ожидал, что поддержка моего родного русского языка в Алисе будет на порядок лучше, чем в других голосовых помощниках, и мои ожидания оправдались.
Первые проблемы со зрением
Когда много работаешь за компьютером, то с годами зрение не становится острее, и от этого всерьёз начинаешь прислушиваться к рекомендациям офтальмологов. Одна из таких рекомендаций — сознательный отказ от использования смартфона. Я это сделал, у меня сломался смартфон, и я заменил его на простую кнопочную звонилку.
Вторая рекомендация — ограничить время пребывания за компьютером. Я убрал все устройства с экраном из дома: телевизор, компьютер, ноутбук, планшет. Единственным медиаустройством в доме стала Яндекс.Станция, благодаря которой я не чувствовал себя человеком из позапрошлого столетия. Когда нужно было поработать за компьютером, я шёл в другой дом и такой стиль жизни через пару месяцев принёс заметный результат, я перестал жаловаться на ухудшение зрения.
Жизнь во время самоизоляции
После введения ограничений на передвижение, пришлось вернуть домой ноутбук. Но уже через несколько дней я заметил, что залипаю на графики акций в экране ноутбука. Начиналось всё безобидно, я заходил на сайт Тинькофф, чтобы посмотреть на сколько упали или подросли мои ценные бумаги (а тогда всё штормило). А однажды, ближе к вечеру я понял, что провёл на сайте целый день, читая новости и комментарии в Пульсе. Возможно, разработчики интерфейсов Тинькофф Инвестиции порадуются, прочитав эти строки, но я почувствовал себя не очень хорошо в конце дня. Пришло осознание, что Тинькофф Инвестиции – новая штука, в которую я незаметно «проваливаюсь» и этому способствует интерфейс сервиса.
Лудомания или хороший интерфейс
Размышляя на тему, а не болен ли я лудоманией, я пришёл к выводу, что в 999 случаях из 1000 я заходил в Тинькофф Инвестиции не с целью что-то купить или продать, а с целью полюбоваться зелёненькими циферками, означающими, что я выбрал правильные ценные бумаги, и чтобы в конце концов мой организм выработал немного «гормонов счастья».
Хороший интерфейс — это такой интерфейс, который решает задачу бизнеса. Предположу, что одна из задач бизнеса Тинькофф в том, чтобы я проводил больше времени внутри экосистемы Тинькофф. Мне нравится интерфейс Тинькофф Инвестиции за то, что незаметно для себя, я провожу в сервисе больше времени, чем планировал. Команда постаралась на славу.
Дизайн интерфейса
"А могу ли я сделать такой интерфейс, который будет удобен для меня, но не будет затягивать?", – вот о чём я подумал. Я поверхностно разобрался в дизайне интерфейсов и пришёл к выводу, что могу. Мне нужны были три операции:
1. Узнать баланс.
2. Купить ценную бумагу.
3. Продать ценную бумагу.
Тинькофф Инвестиции OpenAPI позволял мне реализовать эти операции.
Ещё я хотел, чтобы не надо было смотреть в экран. Платформа Яндекс.Диалоги позволяла создавать голосовые интерфейсы для Яндекс Станции. Идея оформилась, осталось только спроектировать и реализовать.
Подготовка к разработке голосового помощника
Разработка голосовых интерфейсов это итеративный процесс. Чем больше разрабатываешь, анализируешь логи, пробуешь популярные голосовые интерфейсы, тем лучше получается. Прежде чем начать, я изучил возможности платформы Яндекс.Диалоги, прям прочитал всю-всю документацию, затем посмотрел сериал Школа Алисы, влился в сообщество разработчиков Яндекс.Диалоги в Telegram, перечитал несколько тысяч сообщений, посмотрел запись воркшопа по разработке навыков, посмотрел полезные инструменты и исходный код открытых навыков.
О выборе названия для голосового помощника
Я выбрал название Оливер в честь Оливера Хьюза, председателя правления Тинькофф Банка. Олег Тиньков писал в своей книге, что Оливер был единственным из всей команды банка, кто верил в «отскок» акций TCS Group на Лондонской бирже после драматического падения в 2014. Когда речь идёт об инвестициях, то надо мыслить как Оливер.
В шорт листе были и другие варианты, например Мой Брокер — отличная активационная фраза: «Алиса, спроси у моего брокера, как дела на фондовых рынках». Но товарный знак Мой Брокер принадлежит компании БКС.
Первая итерация: команда «Мои акции»
Прежде чем приступить к разработке, я поискал, может кто-то уже делал нечто подобное. В каталоге навыков для Алисы обнаружилось два навыка в категории бизнес и финансы, которые сообщали котировки ценных бумаг на Московской бирже и курсы валют.
Хотелось получать информацию об акциях с моих брокерских счетов в Тинькофф Инвестиции и БКС. Хотелось не просто одну цифру (цена последней сделки на бирже), а дневной диапазон — минимальную и максимальную цены, по которым совершались сделки в торговую сессию по тикерам из моих брокерских счетов.
С Тинькофф всё получилось хорошо, разработчики API оперативно отвечали на мои вопросы и принимали пожелания даже по субботам. Я очень быстро научил Алису выдавать информацию о состоянии своего брокерского счёта в Тинькофф.
А вот с БКС ничего не вышло. У них тоже есть репозиторий на GitHub. Там в вики я увидел контакты разработчиков БКС и написал им, это было 22 мая. Сегодня 28 июня, но мне никто не ответил. Не понимаю, зачем они оставили там свои адреса электронной почты.
Вторая итерация: команда «Мои заявки»
Изначально я собрался делать:
1. Команду для создания лимитной заявки на покупку по заданной цене.
2. Команду для создания лимитной заявки на продажу по заданной цене.
3. Команду, которая сообщала бы об активных не исполненных заявках.
Третья команда из списка выглядела самой простой, поэтому с неё и начал; назвал «Мои заявки»:
А вот с созданием лимитной заявки получилась заминка – нужно было придумать, как это красиво сказать. Начал вот с такого варианта:
— Создай лимитную заявку на покупку 10 акций Яндекс по цене 3000 рублей 20 копеек за акцию.
Но показалось, что это слишком сложно, и люди так не говорят. Я попросил друзей дать мне голосовое поручение, чтобы я из него понял, какую бумагу и по какой цене покупать, но что-то пошло не так... Во-первых, никто не использовал слово «лимитная заявка», как я ожидал. Во-вторых, цену называли только тогда, когда я спрашивал о цене. Уточняли у меня, как сказать название компании, нужно ли произносить тикер. В общем, чувствовалась какая-то неуверенность. Это были люди, которые не привыкли к голосовым интерфейсам. Вот самая классная фраза, иллюстрирующая эту мысль:
У меня даже когда телефон звонит, я испытываю дискомфорт.
Самый ценный совет, который я получил, заключался в том, что надо делать проще. В самом начале, когда появилось приложение Тинькофф Инвестиции, там было только две кнопки «купить» и «продать» и никаких лимитных заявок. Я согласился с такой позицией и притормозил с лимитными заявками, несмотря на то, что они работали:
Третья итерация: покупка и продажа акций по рыночной цене
Люди обычно говорят так:
— Купи 10 акций Яндекс
Но акции на бирже продаются лотами, поэтому я решил, что для тех акций, у которых 1 лот = 1 акция, такой запрос подходит и заявка будет создана. Но когда 1 лот = 10000 акций, например, как у ВТБ, то голосовой помощник будет предлагать переформулировать запрос в лотах:
— Купи 10 акций ВТБ.
— Инструмент продаётся лотами. В одном лоте 10000 акций. Повторите команду ещё раз, но вместо акций используйте лоты.
— Купи 10 лотов ВТБ.
Подтверждение операции
Наверное, было бы неправильно отправлять заявку на покупку без подтверждения. Риск того, что Алиса неправильно распознает название компании или количество лотов довольно высок. Поэтому я предусмотрел подтверждение заявки. Перед отправкой заявки в Тинькофф, Алиса проговаривает все детали сделки и просит подтвердить или отменить операцию. После подтверждения, заявка отправляется на биржу через Тинькофф Инвестиции OpenAPI, и почти всегда исполняется мгновенно.
Подтверждение, это тема для отдельной статьи, но готов обсудить в комментариях.
Обработка ошибок
Добавил обработку самых частых ошибок: недостаточно активов для сделки, биржа закрыта и т.д. Помимо уведомления пользователя об ошибке, стоит предлагать варианты действий. Я придумал универсальную заглушку, которую потом обозвали «в любой непонятной ситуации, покупай акции Яндекс».
Проблема 1: как распознать название компании
Платформа Яндекс.Диалоги предоставляет язык описания пользовательского запроса, чтобы можно было распознать задачу, которую хочет решить пользователь. Распознанные данные Диалоги присылают в обработчик.
Нужно было распознавать название компаний в словах пользователя. Для этого я описал сущность FIGI (Financial Instrument Global Identifier), чтобы по названию компании получать идентификатор, который нужен для взаимодействия с биржей. Вот как это выглядит:
entity EFigi:
values:
BBG005DXJS36:
%exact
TCS
%lemma
тиньков(банк)?
тинькоф(банк)?
тинькофф(банк)?
ти си эс (груп)?
BBG006L8G4H1:
%exact
YNDX
%lemma
яндекс
яндекса
...
Я использую эту сущность в грамматике, и когда кто-то говорит Оливеру: «купи акции яндекс», то платформа Диалогов понимает, что Яндекс это сущность EFigi, которую я описал, и передаёт обработчику идентификатор ценной бумаги BBG006L8G4H1. А внутри обработчика уже происходит взаимодействие с биржей по этому идентификатору.
Чтобы описать все компании, которые торгуются на бирже, понадобится много времени, а также помощь опытных инвесторов и трейдеров. Поэтому на первых порах я ограничился только теми акциями, которые были у меня на брокерском счёте.
Чтобы сделать полноценный голосовой помощник для торговли на бирже, кому-то придётся написать подобное для каждой компании. Люди называют одни и те же компании по разному, например, кто-то скажет «Сбер», а кто-то «Сбербанк». На бирже торгуются обычные акции Сбербанка и привилегированные, которые ещё иногда называют префами. Вероятно, существует ещё несколько популярных вариантов.
Сомневаюсь, что одному человек, даже если он торгует на бирже десятки лет, под силу описать все компании. Поэтому я прошу всех, кто ориентируется в компаниях на Московской и Санкт-петербургской биржах помочь справится с этой задачей. Это описание будет полезно всем нам, трейдерам, инвесторам, разработчикам голосовых помощников, даже компаниям, чьи акции торгуются на бирже. Пожалуйста, просмотрите вот этот файл с описание сущности и предложите улучшения и доработки:
https://github.com/denismosolov/alice-entities-library/blob/master/entities/figi.entity
Лучше всего, если вы пришлёте Pull Reqeust на GitHub, но можно написать и здесь в комментариях, а я перенесу ваши предложения в файл. Это фундамент всей идеи.
Проблема 2: озвучка тикера в подтверждении сделки
Для подтверждении сделки, навык говорит название компании и тикер. Например, у Яндекса тикер YNDX. Это хорошо воспринимается в тексте, но плохо воспринимается на слух. YNDX звучит как «йндкс».
Первая мысль была написать код, который будет разбирать тикеры по буквам, и для каждой буквы проигрывать звук из озвучки английского алфавита. Код будет принимать на вход строку YNDX, а возвращать вот такую строку:
<speaker audio="sounds-y.opus"> <speaker audio="sounds-n.opus"> <speaker audio="sounds-d.opus"> <speaker audio="sounds-x.opus">
Алиса будет проигрывать звуки и в теории это может звучать хорошо. Второй вариант был поиграться с Yandex SpeechKit, может быть удастся найти более простой и надёжный способ.
Над решением этой проблемы я пока всерьёз не думал, поэтому буду рад любым идеям и подсказкам.
Проблема 3: безопасность
Я пока не строил модель угроз, но чувствую, это будет очень увлекательно. Например, сосед может проорать в окно: «Алиса, продавай всё», и Алиса продаст. Или маленькие дети наслушаются, как родители покупают и продают акции, начнут подражать и совершать сделки, когда родителей не будет дома. А ещё много-много всего, о чём предстоит подумать. Возможно, одна из причин, по которой крупные компании до сих пор не реализовали торговлю на бирже через голосовые помощники лежит в плоскости безопасности.
Поэтому, если вы вдруг решите проделать все те штуки, о которых я напишу дальше, то знайте, вы очень сильно рискуете.
Инструкция по созданию голосового помощника для Тинькофф Инвестиции
Заведите аккаунт в Яндекс.Облаке
Создайте аккаунт в Яндекс.Облаке, для этого перейдите по ссылке и нажмите кнопку «Войти»:
Возьмите исходный код
Перейдите на страницу проекта на GitHub, и следуйте инструкции в разделе «Установка». Если что-то не получится, то дайте знать в комментариях к этому посту, я постараюсь помочь в течение пары дней. Если написать в Telegram (https://t.me/denismosolov) то, возможно, получится быстрее. Но если пишите в Telegram, то я вас попрошу потом оформить переписку в виде мануала и выложить на GitHub, чтобы другим было полезно.
Приглашаю всех желающих поучаствовать в усовершенствовании голосового помощника
Если у вас есть идея, как улучшить структуру диалога, контент, какие команды добавить, как лучше построить структуру диалога, вообще любая идея, то пишите в комментариях, пишите в Telegram (https://t.me/denismosolov), создавайте issue на странице проекта в https://github.com/denismosolov/oliver/issues. Каждая идея будет рассмотрена, приоритезирована, оценена по сложности и, если хватит сил, то успешно реализована.
Если знакомы с форматом пользовательских историй, то будет здорово, если сможете сразу записать идею в этом формате. Я вас обниму, если к описанию идеи в формате истории, добавите критерии приёмки. Если предпочитаете формат сценариев использования, то присылайте, тоже обниму.
Если желаете поучаствовать в проектировании программного обеспечения для навыка, то первым делом поставьте расширение ZenHub для GitHub. Я стараюсь использовать в разработке идеи из книги Better Software & Stronger Teams, но открыт для изменений.
Давно хотели попробовать себя в роли владельца продукта, но не было возможности? Голосовой помощник торговли на бирже, это тот проект, где вы сможете проявиться свои таланты.
А закончить этот пост хочу словами из детской песенки:
Э-о-э! Зовёт золотое руно,
И оракул сулит нам удачу.