Конструктор телефонных роботов тинькофф

Обновлено: 02.05.2024

В общем, есть масса инструментов вроде бы годных прям для работы, но таких громоздких и как то все у них распихано по разным углам и существует в полном творческом бардаке. При этом никто не задается вопросом "как и почему это так работает?", все лишь пытаются что-то написать, чтобы заработать немного денег, если повезет.

Как это водится у многих разработчиков, мне стало интересно на что способен JavaScript и V8 с JIT, может ли он дать нужную скорость для сложной математики? И изначально все началось больше как исследовательская миссия. А дело, кстати, было полтора года назад.

Итак, что нам потребуются для разработки и запуска торговой стратегии, ну например, на Тинькофф Инвестиции :

Технические индикаторы на JavaScript. Хорошо что они есть, пусть и не сильно в изобилии. Возьмем самые популярные по скачиваниям technicalindicators

Что-нибудь для работы с Тинькофф, их библиотечка invest-openapi-js-sdk

Стратегию возьмем самую тупую в мире, например, 2 SMA - быстрая и медленная, которые при расхождениях стремятся сойтись вновь.

Не смотря на тупость стратегии, оптимизировать ее нужно умненько: либо по Монте-Карло, либо с применением генетики, возьмем генетику, потому что просто красивее звучит. Подойдет библиотека geneticalgorithm

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

График акций тесла и тупой стратегии

График акций тесла и тупой стратегии

В целом план есть, осталось написать только какой-нибудь модуль транспорта для более высокоуровневой работы и модуль генетики, для адаптации алгоритма все же под финансовые задачи.

Так сложилось, что SDK от Тинькофф на тот момент почти никто и не использовал. Так что пришлось его попутно переписать как следует, чтобы обеспечить надежную работу, а то свет мигнул, или кабель кто-то жует, или библиотека плохо написана, в общем коннект при пинге в 3 миллисекунды с разрывами. SDK переделал быстро, встретил кучу приятной отзывчивости от владельца репозитория на GitHub. Так совместными силами и вышел инструмент, который я до сих пор использую.

Спустя 3 месяца раздался звук: "Я - родился", и стратегия начала потихоньку торговать сама по себе. В это время собирались какие-то данные по ее работе крутились ручки, ставились подпорки и ограничители. Ну например стало ясно что на премаркете торговать нельзя, или стало ясно что пережить 30 минутную блокировку биржи при резком скачке цен не получается корректно в общем нюансы лезли буквально ото всюду. Разбиравшись с ними нужно было уделять время оптимизатору, который помог бы крутить ручки у стратегии (об этом чуть позже), давайте для начала быстренько разберемся с генетикой.

Генетический алгоритм - позволяет эмитировать природный процесс эволюции популяции живых существ. Например, ну давайте популяция бабочек будет у нас. Так вот эта популяция день ото дня размножается, выживает, делится друг с другом генами, читает хабр и прочее.

Вот примерно этим же занимается библиотека генетических алгоритмов. Чтобы не было очень скучно, вот серия картинок как "бабочки" обучаются лететь в нужную точку.

Бабочка случайно двигается

Одинокая бабочка со случайными параметрами выполняет пируэты броуновского движения, двигаясь во все направления.

Если применить немного генетики, взяв 100 бабочек и 20 поколений поскрещивать их, выдавая конфетки за приближение к точке и *текст заблокирован за жестокое обращение с бабочками*, если те двигаются не в нужном направлении. Получим следующий слайд.

Бабочки летят в указаную точку

В общем-то уже понятно, я надеюсь, как это с бабочками работает. Давайте теперь про торговлю.

Торговая стратегия это то, что у нас теперь будет вместо летающих насекомых. В качестве критерия оценки, обычно берется математическое ожидание выигрыша, это такая характеристика в теории азартных игр, она прогнозирует сумму выигрыша, которую может заработать или проиграть игрок, в среднем, по каждой ставке. На языке азартных игроков это иногда называется «преимуществом игрока» (если оно положительно для игрока) или «преимуществом казино» (если оно отрицательно для игрока). То что нам нужно, чтобы понять выигрываем ли мы у биржи с нашей торговой стратегией или нет. Вот это и будет главным критерием генетической оптимизации в нашей системе.

Вот формула подсчета мат. ожидания, на всякий случай:

Мат ожидание = Вероятность прибыли х Средняя прибыль - Вероятность убыли х Средняя убыль

Позволю себе немного кодовых вставок, без них никак. Чтобы крутить параметры стратегии потребуется некоторый интерфейс для их описания. Ниже он представлен в виде литерала объекта с различными полями.


Интерфейс позволяет задать значения, которые принимает тот или иной параметр, например целые или нет, четные или нет, булевы или числа. Теперь генетика будет знать как заполнять нашу популяцию в 100 или в 500 особей случайно сгенерированными параметрами.

Кстати, про популяцию, в нашем случае в качестве особи будет одна торговая стратегия с определенным набором настроек (генов). Которые мы и будем сохранять и передавать при скрещивании от родителей к детям.

Когда мы создаем популяцию в 100 особей, нам нужно сгенерировать 100 случайных конфигураций, создать торговые стратегии, передать им нужные конфигурации и запустить тестирование на истории. Конечно потребовалось написать выгрузку истории для этого и все необходимое. Дальше каждый проход стратегии оценивается по формуле матожидания, выполняется скрещивание особей (обмен генами ака параметрами) и получается следующее поколение. И так сколько угодно раз, например 50. В конце концов получаемые результаты будут торговать все лучше и лучше подбирая параметры периодов fastSMAPeriod и slowSMAPeriod , а также стопы и тейки.

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

За год стало понятно, что библиотека генетических оптимизаций не подходит. Их подход работает, но совершенно не полный: не хватает методов селекции - это то каким образом будут образовываться пары особей для выведения детей. Например, использовать ли случайные выборки или спаривать только сильнейших и так далее.

Также нет защиты от дубликатов, когда из-за погрешностей технической эмуляции - появляются как 2 капли воды одинаковые особи вообще из разных семей. Это как встретить своего двойника не родственника в торговом центре. Понятно что в природе это возможно, но там не 5 параметров которые участвуют в образовании особи а миллиард ;) Еще библиотека не умела многих других вещей описанных в этой статье. Кроме нужной настройки алгоритмики не поддерживалась также работа с асинхронными оценками особи, то есть нельзя было так просто взять и запросить историю, прогнать стратегию, а потом сказать ну все я готов оцениваться. Пришлось делать свою библиотеку в виду отсутствия таковых. Попутно необходимо было запариваться производительностью, потому что требовалось выжимать все соки из JavaScript.

В результате получилась либа async-genetic отвечающая всем стандартам, да еще и работающая быстрее. Не только в плане кода, но и в плане решения задач. Из-за дополнительных настроек, например, решает задачу "угадай какое слово я загадала" в 2 раза быстрее (в среднем).

Кроме этого давно не было картинок, поэтому пора показать результат визуализации работы стратегии и открытия сделок.

Визуализация сделок по стратегии

Визуализация сделок по стратегии

Чтобы вы могли видеть эту картинку со сделками и двумя SMA, потребовалось еще много времени на написание небольшой системы визуализации сделок. И загруженной истории. И тут стало понятно, что эксперимент ну совсем уже вышел из под контроля и начал жить своей жизнью. Конечно к этому времени что-то уже работало на бирже и пыталось заработать немного денег. И надо сказать любой заработок мотивировал как ничто другое продолжать это нелегкое дело.

И изначально генетика отрабатывала хорошо, но очень уж долго. Что мне показалось странным и я стал разбираться в проблеме. После дебага NodeJS приложения, удалось выяснить, что основная проблема это индикаторы, которые написаны ну очень плохо. Опять что ли писать свои? На этой фазе проект уже начал образовывать экосистему вокруг себя и первоначальное исследовательское направление стало разрушаться. Теперь фокус был на заработок и на создание полноценной платформы.

На текущий момент уже была своя библиотека генетики и надстройка на ее основе, для оптимизации именно торговых стратегий. Но теперь требовались еще и индикаторы. К счастью они не слишком сложные, не сложнее того, что уже было сделано во всяком случае. И вот спустя какое-то время все готово! Индикаторы есть и есть тесты для них, потому что очень важно чтобы они работали корректно, тк это сердце всех стратегий. Очередной проход по производительности показал, что теперь самое медленное место new Date() . Естественно все это сразу было переписано на численное хранение данных. В общем замеры скорости работы индикаторов показали следующее:


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

После этого момента стало очевидно, что получается готовый продукт, для разработки стратегий. Оставалось только отрефакторить все это 15 раз чтобы подготовить к опенсорцу.

Перед тем как я перейду в рекламе, хотелось бы дорассказать все же про стратегию. В общем то стратегию мы не бросили, она и по сей день где-нибудь да работает, но конечно заработать нам удавалось в основном на гораздо более сложных стратегиях. И вот сунув немного денег в крипту и тинькофф инвестиции уже заработано более 5000$, но в основном на крипте кнечно, акции только только начинают возвращаться в качестве активов.


Стриминг сделок мы ведем в нашем телеграмм канале. Здесь публикуются данные обо всех позициях, с небольшой задержкой примерно в 30-100 секунд. А также каждый вечер публикуется дневная и общая статистика (как на картинке). Подписывайтесь, будем рады.

В итоге в конце концов мы создали целую систему инструментов и назвали ее Debut.

Debut - это экосистема для разработки и запуска торговых стратегий. Аналог известного ZenBot, но с гораздо более гибкими возможностями для конструирования стратегий. Все что вам нужно сделать, это придумать и описать точки входа в рынок и подключить нужные плагины для работы. Все остальное - дело техники: генетические алгоритмы - помогут подобрать самые эффективные параметры для стратегии (период, стопы, и другие), модуль подбора тикеров - поможет найти подходящий для стратегии актив (токен или акцию), на котором она будет работать лучше всего.

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

В проекте есть две стартовые торговые стратегии "Для примера" как нужно работать с системой. Репозиторий с образцами и примерами.

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

Телефонный робот Олег — новый проект Тинькофф, который запустили год назад. Его основная задача — помогать клиентам банка на телефонной линии. Олег отвечает на звонки так же, как и 11 000 операторов, и может принимать 5000 звонков одновременно. Олег мультизадачен — он умеет быстро решать разнотипные вопросы и экономит время клиентов. К примеру, чтобы досрочно погасить кредит, понадобится минута. Рассказываем, что еще умеет Олег и кто работает над его созданием.

Одну минуту занимает досрочное погашение кредита с помощью телефонного робота Олега.

В приложении Тинькофф уже два года живет голосовой ассистент Олег, в прошлом году он появился и на телефоне. Первое, чему научился телефонный робот, — рассчитывать платеж по кредитке. Он идентифицирует звонящего и сообщает, сколько денег и до какого числа надо внести на счет. Это один из самых популярных вопросов, поэтому функцию запустили еще в прошлом январе. Остаток зимы и весну мы разрабатывали телефонного робота, а с середины мая добавляем новые запросы, с которыми он помогает клиентам.

Создавая Олега, мы преследовали стратегическую цель — повысить эффективность обслуживания на входящих звонках. Мы оцениваем ее по многим показателям, но основные — удовлетворенность клиентов, уровень сервиса и количество звонков, которые робот обработал полностью сам. Сейчас мы уже достигли баланса этих показателей и дальше будем наращивать автоматизацию, одновременно повышая уровень клиентского опыта. Для этого мы разрабатываем новые фичи, а также моделируем поведение и стиль общения робота. Олег — не просто бездушный бот с механическими ответами. Олег — финансовый помощник, который способен подстраиваться под клиентов и строить с ними доверительные отношения.

Мы постоянно совершенствуем и обучаем алгоритм, чтобы улучшить точность распознавания полученной информации. Например, Олег умеет круто обрабатывать даты. Как правило, в чате человек пишет дату точно в формате: 10 января или 10.01.2020, но в разговоре клиенты называют числа по-разному и подчас непредсказуемо. Однако мы научили Олега понимать ответы так же, как их понимает человек.

Так, в одном из сценариев есть вопрос: «На какую дату хотите перенести платеж?» Олег правильно определяет дату, даже если слышит:

— «через пару дней»;

— «давайте на десятое»;

— «во второй половине дня вторника»;

— «двадцать третьего у меня зарплата приходит, сразу заплачу».

Телефонный робот Олег уже умеет менять дату платежа, отправлять реквизиты, блокировать карту по просьбе клиента, пополнять счет и отправлять справку. Он может помочь с ПИН-кодом, восстановить доступ в личный кабинет, озвучить баланс и проконсультировать по другим вопросам. Самые популярные просьбы — досрочно погасить задолженность, узнать размер регулярного платежа, сумму долга и баланс.

Ежедневно операторы Тинькофф принимают 60 000 звонков от физических лиц. Первоначально Олег отвечал только на 10% от общего количества, а к концу 2020 — уже на 80%. Сначала ассистент мог «закрыть» звонок, то есть самостоятельно помочь, 500 обратившимся. Чтобы улучшить показатели, мы тестировали реакцию клиентов, создавали новые сценарии, улучшали стабильность и качество работы. А главное — анализировали клиентский опыт, потому что Олег должен не просто принять и «закрыть» звонок. Он должен решить вопрос клиента быстрее и комфортнее, чем оператор.

Мы запустили голосового робота, когда достигли уровня внутренних технологий, позволяющих полностью обходиться без внешних разработок. Олег создается на базе собственного алгоритма распознавания речи и NLP-движка, поэтому мы можем широко охватывать разные тематики и точно понимать, о чем говорит человек. Также мы используем свой конструктор скриптов и разговорный движок, который помогает по ним двигаться. Стек технологий Тинькофф дает нам возможность гибко разрабатывать роботов под наши цели, достигая максимальной эффективности и качества.

Сначала для каждого сценария собираются вопросы по одной теме, которые клиенты задают по телефону. Например, «пополнить карту», «перевести деньги на карту», «хочу закинуть деньги себе на карту» и подобные им. Эти вопросы кластеризуются — собираются в одну группу, чтобы дальше лечь в основу сценария. Анализируя вопросы, команда понимает, что именно интересует людей и что делать роботу, чтобы им помочь.

В дальнейшем сценарий будет запускаться, когда Олег услышит эти вопросы или похожие. Олег умный робот, поэтому может распознавать нюансы и запускать сценарий, даже если услышит неточный запрос. Например, не «пополнить карту», а «внести деньги на кредитку онлайн». А если услышит «хочу погасить» — уточнит: «Полностью или частично?».

Во время разработки сценария я абстрагируюсь от того, что я программист. Я представляю себя на месте клиента и думаю над тем, что хочу получить от бота. Так, если я хочу узнать баланс, мне не нужна лишняя информация — беспроцентный период, способы пополнения и многое другое. Я просто хочу через секунду получить ту самую циферку с балансом. Правильный сценарий минималистичен со стороны клиентов. Он позволяет им быстро решать вопрос и не отнимает время.

Со стороны разработчика, наоборот, сценарий должен содержать достаточно проверок «под капотом». Нам не надо спрашивать клиента, пользуется ли он, например, мобильным приложением. Мы и сами это знаем. При звонке мы проверяем максимум информации: кто звонит, какие продукты банка есть, какие счета и в каких валютах, чтобы на выходе назвать ту самую циферку, не задав ни одного лишнего вопроса.

При создании сценария мы продумываем, какие вопросы и ответы может получить Олег и как может развиваться диалог. Так, на вопрос «давайте оставим услугу?» человек может ответить: «да», «нет», «давайте» и даже «хочу другую карту». Во всех этих ситуациях запустятся разные блоки сценария, и разговор пойдет по разным веткам. При положительном ответе Олег подключит услугу, при отрицательном — подскажет, что делать, если клиент передумает, а на «хочу другую карту» — запустит новый сценарий.

Наш робот сам не придумывает, что именно говорить. Фразы создают редакторы, а голосовые боты их только озвучивают. У Олега в Тинькофф собственный характер и ценности. Он вежлив и корректен, отвечает быстро и лаконично. При подготовке текстов мы это учитываем и максимально сокращаем реплики, оставляя только самую суть.

Каждую реплику Олега мы тестируем в специальном боте синтеза речи, чтобы понять, насколько естественно звучит фраза. Порой приходится перебирать до десяти вариантов даже небольшого вопроса: заменять слова, менять их порядок или подбирать пунктуацию для требуемых акцентов. Все это помогает на выходе получать звучание, максимально приближенное к речи человека.

Готовые тексты переводятся в звук с помощью специальной технологии — синтеза голоса. Мы не используем профессиональную озвучку, вместо этого создали собственный движок, который переводит текст в голос. Для этого диктор начитал около двадцати пяти часов разнообразных текстов, которые максимально полно покрыли фонетику разговорной речи. Эти записи легли в основу мобильного секретаря, голосового помощника и телефонного робота Тинькофф. Мы можем ставить разные ударения в омографах и воспроизводить вопросительную интонацию.

Один из вариантов приветствия Олега.

В августе мы провели серию глубинных интервью и выяснили, почему некоторые клиенты отказываются от общения с телефонным роботом. Оказалось, это связано с отрицательным опытом общения с автоматическими системами и ботами других ИТ-продуктов. Никто не хочет тратить время на длинные разговоры, а зачастую приходится сначала прослушать общую информацию или даже рекламу, прежде чем задать вопрос. Еще достаточно много примитивных систем, где общение строится на формализованных ответах: скажите «да» или нажмите «один». Такая коммуникация раздражает людей, и мы ее не используем.

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

С самого начала разработки мы ставили ключевой целью не только максимум автоматизации входящих звонков, но и качество помощи клиентам. Чтобы понять, как работает Олег, мы регулярно прослушиваем звонки, разделяя их по типам: «робот помог полностью», «помог частично» и «перевел на оператора», и анализируем их с помощью оценочной сетки. Если видим где-то проблему, разбираем и исправляем ее. В конце лета мы собрали обратную связь от клиентов и убедились, что самые важные метрики — качество и скорость — робот обеспечивает.

Глубинные интервью вскрыли еще один аспект — люди не знают, что можно ожидать от робота. Многие не задают вопрос полностью, а говорят, например, «кредит». Но по такому узкому контексту даже человек не поймет, что именно требуется. Мы стараемся выяснить подробности, но не всегда получается. Часть клиентов не хотят озвучивать проблему полностью, потому что предполагают, что ее придется повторять оператору. Однако у нас операторы сразу подхватывают диалог, потому что перед ответом читают разговор Олега с клиентом и понимают, чем надо помочь.

Вот так Олег пытается уточнить запрос клиента.

Роботы — текущая реальность, и мы творим эту реальность в банковском секторе. Мы создали робота, который часто на прощание слышит: «Олег, ты молодец!», потому что действительно помогает клиентам. Приглашаем и вас познакомиться с телефонным роботом Олегом и протестировать его возможности.

Поговорить с Олегом клиенты-физические лица могут, позвонив со своего мобильного телефона на горячую линию 8 800 555-77-78 (действует для звонков по всей России; не распространяется на премиальных клиентов).

В начале июня мы запустили Защитника Олега — нашего нового общедоступного телефонного секретаря, разработанного на базе похожего решения для абонентов Тинькофф Мобайла (работает с 2019 года).

Рассказываем, как делать первыми то, что потом повторят все — от стартапов до крупнейших операторов связи.

Защитник Олег доступен любым абонентам российских сотовых операторов, его может подключить любой человек — не обязательно клиент экосистемы Тинькофф или Тинькофф Мобайла.

Олег на сегодняшний день — самый продвинутый телефонный секретарь в мире.

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

А еще — быть просто телефонным секретарем: вести разумные диалоги, присылать расшифровку и запись беседы, отвечать фразами, которые человек может выбирать прямо во время звонка и не только.

После запуска мы получили много вопросов от коллег по рынку, как мы делали Олега, почему выбрали механику в виде ботов в Telegram и ВК, действительно ли мы копировали платного бота Машу и предлагали его создателю работу в Тинькофф и др.

Команда телефонного секретаря Олега рассказывает обо всем по порядку.

Наши первые голосовые роботы работали на исходящих вызовах — проводили опросы, информировали клиентов.

В то время в природе существовало три типа телефонных роботов:

Роботы на DTMF-сигналах

Используются в основном в колл-центрах и работают по принципу

Роботы с простейшим распознаванием речи

Более технологичные роботы, которые могут фильтровать фразы (например, «Да»), но которые так и не стали удобными для клиентов.

Роботы на Machine Learning-моделях

Самые продвинутые на тот момент роботы, которые могли распознавать смысл сказанного собеседником.

Эпоха телефонных роботов только начиналась, но у россиян уже успела сформироваться неприязнь к ним — они не помогали, а в основном мешали. В таких условиях мы и начали работу над телефонным Олегом — ML-роботом.

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

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

MVP (Minimal Viable Product) — первый прототип современного Олега, работающего по принципу автоответчика, был собран за неделю и запущен в ноябре 2018 года на базе платформы Twilio.

В этой версии он умел только отвечать на пропущенные звонки и присылать расшифровку слов абонента в смс. Первыми пользователями стали сами разработчики Тинькофф, которые сразу отметили «вау-эффект» от использования секретаря.

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

Следующим этапом становления Олега стал переезд в корпоративный мессенджер Slack. К тому моменту разработчики потратили уже 500$ на переадресацию звонков в США и решили, что пора переезжать на новые рельсы.

Ими стал Slack, в котором Олега мог тестировать любой желающий из Тинькофф-команды. С его помощью можно было проверять гипотезы и отслеживать возможные косяки.

Тинькофф Мобайл — самый технологичный мобильный оператор, поэтому здесь мы просто внедрили Олега в мобильное приложение. Там он подключался просто в один клик.

Абонентам Тинькофф Мобайла Олег сразу пришелся по вкусу, установки бота начали расти по экспоненте. Что логично — на российском (на мировом, вероятно, тоже) таких решений еще не было.

В соцсетях стали появляться отзывы от пользователей:

В начале 2020 года, разбирая многочисленные кейсы использования Олега, мы все больше стали задумываться о том, что он может не просто принимать на себя входящие, но и быть заслоном от «токсичных» звонков спамеров и мошенников.

Таких звонков в России становилось все больше и больше, а Олег мог стать «желтой таблеткой» против этих двух социальных болезней, решили мы.

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

Задумано — сделано. В марте 2020 года в Telegram заработал MVP-бот — @Tcs_ussd_test_bot.

Бота мог подключить любой российский пользователь сотовой связи — он настраивался через переадресацию и работал также как и в Тинькофф Мобайле — принимал звонки, присылал расшифровку и аудиозапись в чат, поддерживал разговор с собеседником.

Telegram мы выбрали, чтобы можно было быстро внедрять любые кастомные версии и тестировать их на массовой продвинутой аудитории. Telegram-бот для нас выступал хорошей площадкой для экспериментов — на нем мы быстро проверяли востребованность новых фич до релиза в приложении Тинькофф Мобайла.

В 2020 году основной фокус мы делали на запуске расширенной ПРО-версии Олега 2.0 в Тинькофф Мобайле и не спешили с масштабированием бота.

К августу 2020 года бот в Telegram стал уже более-менее полноценной бета-версией будущего Защитника Олега — он переехал на @olegotvetit и насчитывал около 2 тыс. бета-тестеров.

К августу 2020 года в бета-тесте мы собрали большое количество восторженных отзывов от первых пользователей - это заставило нас двигаться дальше в масштабировании Олега.

В октябре-ноябре 2020 года мы заметили в комментариях на VC, что у идеи Олега появились последователи — похожий платный бот Маша, которого пользователи могли подключить по аналогичной механике в Telegram.

Но появление похожего сервиса укрепило нас во мнении, что это решение будет востребовано на рынке и масштабирование телефонного Олега на всех россиян — только вопрос времени.

В Тинькофф стараются замечать перспективных стартаперов и приглашать к нам в команду.

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

Зимой 2020 года была запущена Про-версия Олега для абонентов Тинькофф Мобайла. Он стал более кастомизированным — научился отвечать на звонок фразами абонентов, был доступен в разных голосах, в том числе женских.

Запуск Олега 2.0 позволил сосредоточить ресурсы команды на решении двух проблем Телеграмм-бота, которые мешали сделать хороший продукт и масштабировать его на всех абонентов — плата за пользование секретарем и неудобство подключения.

С самого начала Олег работал через переадресацию. Как показал опыт разработчиков из екатеринбургского Тинькофф Центра Разработки, вся магия продукта растворяется, когда за каждый переадресованный в Москву звонок приходится платить по 10 рублей.

Это позволило сделать секретаря бесплатным для 95% всех российских абонентов. Оставшиеся 5% — это редкие кейсы с, как правило, архивными и семейными тарифами.

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

Для Тинькофф это своего рода евангелизм собственных технологий - мы даем возможность соприкоснуться и взаимодействовать с технологиями экосистемы Тинькофф не только клиентам (сейчас 15 млн человек), а по сути всем россиянам.

Большинство голосовых ассистентов в России сегодня заперты в периметре своих экосистем. В нашем же случае Олег выходит за этот периметр и становится доступен любому человеку.

Флоу подключения Telegram-бота оставалось непростым, особенно для абонентов одного из крупнейших операторов. Чтобы улучшить клиентский опыт мы прописали понятные инструкции, которые позволили не откладывать запуск секретаря в долгий ящик.

В скором времени подключение секретаря через Telegram станет еще проще — нужно будет просто сохранить номер Олега в телефонной книге и позвонить на него.

Одновременно мы начали развивать другие каналы для подключения секретаря. Например, в супераппе Тинькофф уже работал финансовый ассистент Олег, обладающий разными скиллами.

К этим скиллам мы решили добавить и навык телефонного секретаря — так возможность подключить его себе получили все клиенты экосистемы Тинькофф через желтое мобильное приложение.

Но зато продвинутый бот API ВКонтакте отвечал всем нашим требованиям. В итоге Защитник Олег стал доступен для подключения через боты в Telegram и VК, а также в мобильном приложении Тинькофф, и как и прежде, в приложении Тинькофф Мобайла (включая Про-версию).

В ходе работы над Олегом вырисовывалось несколько проблем, для которых мы искали отдельные решения.

Проблема 1: Спам и звонки от мошенников

По данным Tinkoff Data, больше 90% россиян страдают от нежелательных звонков.

Благодаря интеграции с Определителем номера Тинькофф, Олег уже умел определять категорию входящего вызова, предупреждать об этом пользователя, и в зависимости от этого строить разговор с собеседником. Мы решили пойти дальше и превратить негативный опыт столкновения со спамерами в позитивный: Олег берет удар на себя, и из этого столкновения рождается смешной разговор.

Олег обучен отвечать на более чем 100 разнообразных сценариях, и их количество продолжает расти. Например, у нас есть отдельные сценарии общения с мошенниками, которые включаются после стандартных «фродовых» фраз вроде «Ваша карта в опасности» и пр. Есть сценарии для разговоров с роботами-автообзвонщиками, службами телефонных опросов и многого другого.

Работая над новыми сценариями, мы увидели новый классный скилл секретаря: если раньше люди жаловались на спам-звонки, то теперь пользователи Олега даже ждут звонков спамеров, чтобы послушать их разговор с Защитником.


Привет! Я Тамара, дизайнер навыков голосового финансового ассистента Олега. Сегодня я расскажу, из чего состоит работа дизайнера диалогов и какое будущее ждет голосовых ассистентов. Это будет полезно тем, кто интересуется голосовыми интерфейсами, работает в этой сфере или думает попробовать.

Финансовый ассистент Олег

Олег появился в июне 2019 года. Он живет в мобильном приложении банка, и его миссия — облегчать взаимодействие клиента банка с финансами и высвобождать ресурсы: время, внимание, деньги.

Сегодня ежемесячная аудитория Олега — 467 000 человек.

Олег живет в мобильном приложении Тинькофф

Олег живет в мобильном приложении Тинькофф

Как работает финансовый ассистент Олег

Внутри ассистента есть два трека:

Навыки — конкретные вещи, которые Олег может сделать. Например, перевести деньги или поставить лимит на траты по категории.

Болталка — режим свободного диалога. Тут Олег может и пошутить, так как главная цель болталки — развлечь пользователя.

Речь у нас пойдет о навыках. По сути, это набор мини-аппов в чате. Например, сервис пополнения счета мобильного телефона, сервис информирования о разбивке расходов по периодам, категориям, мерчантам, сервис контроля над расходами.

Вот так выглядит сервис контроля за расходами

Вот так выглядит сервис контроля за расходами

Навыки голосовых ассистентов могут казаться пользователям простыми. Например, когда клиент просит Олега перевести деньги на счет мобильного телефона, он видит взаимодействие с ассистентом так:

Навык «Пополни мобильный» в чате банковского приложения для пользователя

Навык «Пополни мобильный» в чате банковского приложения для пользователя

Но под капотом — огромная работа дизайнера и разработчиков. С моей стороны этот же навык выглядит иначе:

Сценарий навыка «Пополни мобильный» для дизайнера

Сценарий навыка «Пополни мобильный» для дизайнера

Над любым навыком ассистента работают продакт, аналитики, дизайнер диалогов и команда разработчиков:

продакт и аналитики отвечают за верхнеуровневое понимание, какую потребность клиента закроет навык;

дизайнер диалогов продумывает логику диалога между Олегом и пользователем и пишет реплики ассистента;

разработчик переносит навык в код или конструктор;

маркетолог придумывает, как рассказать аудитории, что Олег умеет и как этим пользоваться.

Кто такой диалоговый дизайнер и чем он занимается

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

По мере развития ассистентов к работе стали привлекать редакторов и UX-дизайнеров, а из них постепенно вырос специалист нового типа. Это дизайнер, который любит «голос», разбирается в нем и понимает, чем UX в голосе отличается от традиционных интерфейсов.

Как дизайнер навыков работает в Тинькофф

Основной артефакт работы традиционного UX-дизайнера — карта экранов, а моей — блок-схема, которая показывает логику навыка.

Пример блок-схемы навыка «Пополни мобильный»

Пример блок-схемы навыка «Пополни мобильный»

Схема — это навигационная карта навыка. Она должна быть полной и наглядной для всех, кто работает над навыком: и для дизайнера, и для продакта, и для разработчика. Нужно, чтобы, открыв схему, продакт понял, как начнется, какими путями пойдет и чем закончится взаимодействие клиента с Олегом. А разработчику важно увидеть, что и как проектировать.

Схема — своего рода инструкция для него: вот здесь — одна реплика бота, в другом случае — другая, тут проверка и так далее.

У блок-схемы те же пути, как и у традиционного UX:

пути успеха, основной и побочные;

Путь успеха. Это основной путь в сценарии, он стартует от первого обращения пользователя к Олегу и завершается успешным выполнением запроса. Например, в навыке «Пополни мобильный» путь стартует запросом «Олег, положи на мобильный ХХХ ₽» и завершается, когда деньги поступают на счет телефона.

Побочный путь успеха. Он отличается от основного пути в первую очередь точкой входа. Клиент может по-разному сформулировать свой запрос, например так: «Положи денег на телефон». У нас нет суммы, и чтобы ее узнать, нужно провести пользователя по другим веткам сценария, прежде чем сделать платеж.

Переходы. Это попытки перескочить с одной ветки на другую, когда пользователь, например, передумал выполнять какое-то действие или надо что-то переделать, вернуться на несколько шагов.

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

Онбординг. Голосовые ассистенты — молодое направление с неочевидными дизайн-паттернами для большинства пользователей: с ходу непонятно, как и что говорить боту, чтобы он точно понял правильно. Онбординг помогает, во-первых, снизить раздражение от разговора с ассистентом, во-вторых, увеличить шанс на успешный и гладкий User Experience.

Атомы любого навыка Олега

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

В блок-схеме шесть разных видов таких атомов:

Я расскажу о каждом из них на примере навыка «Пополни мобильный».

Интенты. Иначе — намерения, то есть условия, когда запускается навык или какая-то из его логических веток. Например, пользователь говорит: «Олег, положи сотку на телефон» или «Пополни мобилку». В обычном UX это называется точками входа.

Интенты в блок-схеме навыка

Интенты в блок-схеме навыка

Чек-поинт. Иначе — проверки. Это когда юзер стоит, как богатырь на распутье, и выбирает, куда идти дальше. Например, он только запустил навык. Тут выбор, показывать онбординг или нет. Логично показать, когда юзер запускает навык впервые:

человек запустил навык в первый раз → показываем ему онбординг;

запустил навык не в первый раз → идем дальше по схеме.

Во время каждой проверки Олег анализирует, что сейчас происходит и как в этом случае нужно отреагировать.

Как выглядит проверка в схеме дизайнера

Как выглядит проверка в схеме дизайнера

Реплики самого ассистента. Тут может быть несколько вариантов одной и той же фразы, которая будет звучать по-разному в зависимости от полученных вводных. Главное, чтобы это звучало логично. Потому что наша цель — сделать взаимодействие человека с ботом максимально естественным, как будто это диалог двух людей.

Реплики пользователя. На блок-схеме отмечаем, когда пользователь реагирует на реплику робота: говорит что-то в ответ или нажимает на кнопки в интерфейсе личного кабинета. Тут нужно предугадать максимальное количество возможных вариантов поведения пользователя, чтобы Олег работал максимально корректно.

Например, если нам нужно пополнить мобильный и юзер не сообщил нам это в самом начале. Мы спрашиваем его, сколько он хочет перевести денег, и ловим фразы: «100 ₽», «полтинник» и подобные.

Хинты или подсказки. С их помощью направляем пользователя по пути сценария. Во-первых, подсказываем, что именно нужно сказать на этом шаге. Во-вторых, даем человеку понять, где он находится и что может сделать.

Пример хинтов

Пример хинтов

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

Виджеты. Это интерфейсы в интерфейсе. Они нужны для подтверждения действия. То есть когда Олег помогает совершить перевод денег, пользователь в любом случае должен подтвердить корректность операции.

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

Подтверждение голосом корректности информации — с какого счета нужно перевести деньги, куда, какую сумму — процесс долгий и неудобный. Поэтому мы используем текст и визуальный интерфейс.

Так выглядит виджет подтверждения платежа на счет мобильного телефона

Так выглядит виджет подтверждения платежа на счет мобильного телефона

Предлагаю вместе пройтись по пути успеха пользователя, который запускает навык «Пополни мобильный».


Шаг 1. Пользователь запускает голосового ассистента и говорит: «Олег, положи 100 ₽ на телефон». Это интент, здесь стартует сценарий навыка. Олег запомнил, что нужно положить на телефон 100 ₽, не 200 ₽, не 50 ₽. Шаг 2. Проверили, впервые ли пользователь запустил навык. Как оказалось, нет, не впервые. Онбординг не показываем. Шаг 3. Предполагаем, что, когда пользователь хочет пополнить мобильный, он не говорит «мне». Он просто говорит «пополни мобильный». Поэтому по умолчанию мы предполагаем, что речь о его номере телефона, который мы уже знаем. Шаг 4. Идем по схеме дальше, пропускаем огромную часть блок-схемы, которая посвящена выбору суммы. Там очень много вариантов, сейчас не будет на этом останавливаться. Но они нам не понадобились. Шаг 5. Тут наступает момент, когда юзер должен подтвердить введенные данные. Это финальный виджет, который я показывала выше. Денег на счете хватает; переводит туда, куда надо. Нажимает кнопку «Перевести». У нас в блок-схеме это слот «Согласие». Как именно пользователь подтвердит перевод, вариантов очень много: «да», «огонь», «класс», «согласен». Шаг 6. Успех. Деньги на счете. Тут предлагаем воспользоваться другим навыком, например установить лимит трат.

В итоге у нас от интента до пополнения шесть шагов в блок-схеме, а юзер увидел только это:

Виджет подтверждения перевода денег на мобильный

Виджет подтверждения перевода денег на мобильный

То есть от интента и до шага «Все верно» юзер не видел ничего. Есть только: _ Виджет. ↓ Подтверждение. ↓ Все получилось. _ Все эти «одноклеточные навыки» типа «Переведи деньги» для пользователя и должны выглядеть максимально простыми, так как наша задача — упростить жизнь клиента при взаимодействии с мобильным приложением.

Исследования и тесты

Спроектировав новый навык и собрав прототип, я исследую его на UX-интервью и проверяю на альфа-тестерах.

UX-интервью. В период ковида проводим зум-интервью для валидации UX-гипотез. Мы проверяем, какие ожидания есть у пользователей, закрывает ли навык их потребности и какие нужны оптимальные формулировки в работе робота.

Обычно я создаю группу из 5—10 человек возрастом от 16 до 35 лет, провожу интервью на 40—50 минут, задаю вопросы, и мы вместе с собеседником прокликиваем прототип и формулируем впечатления.

Такие интервью мало чем отличаются от традиционных UX-интервью. У меня есть визуальный интерфейс, где длинным скроллом я показывала человеку разные пути сценария диалога, и мы вместе идем по этим путям.

Я задаю вопросы типа:

Как вы думаете, а что вы можете сделать сейчас?

Что сейчас произойдет?

Как думаете, что ответит ассистент?

После каждого интервью я учитываю ответы и, если где-то нужно внести исправления, докручиваю прототип.

Тестирование. Новый навык проверяем сначала на команде — это этап альфа-тестов, чтобы обнаружить самые страшные баги: например, неверно определен часовой пояс пользователя или не собирается финальный виджет. Члены команды получают уведомление с просьбой пройти путь навыка в своем мобильном приложении. После этого каждый оставляет свое мнение в специальном внутреннем чате о том, что работает, что нет, что можно улучшить.

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

Будущее диалоговых ассистентов

Мы считаем, что у голосовых помощников большое будущее. По опыту работы с Олегом можно сказать, что самая возвращающаяся аудитория — это миллениалы, люди от 18 до 35 лет. Но у голоса есть две пока еще недооцененные аудитории:

Дети. Это очень благодарная аудитория для такого продукта. Они с удовольствием общаются с роботом, лояльно относятся к его ошибкам и скорее потешаются над ними, чем бесятся, как часто бывает со взрослыми.

Постепенно появляются навыки с голосовыми играми, загадками, голосовые роботы могут рассказывать сказки на ночь и прочее.

Пожилые люди. Для этой аудитории взаимодействия с голосовыми интерфейсами гораздо проще, чем с визуальными. У пожилых людей основная проблема при работе с технологиями в том, что они не любят разбираться в визуальных интерфейсах. Многие вместо того, чтобы учиться пополнять счет телефона в приложении, просто идут в офис банка. Голосовой бот может снять эту проблему.

К тому же голосовой бот может снять другую проблему этой аудитории — одиночество, малое количество социальных контактов. С ботом можно просто поговорить.

Давайте обсудим в комментариях, какое у вас впечатление от использования ассистентов? Что порадовало? Что выбесило? Что бы вы хотели делать с их помощью?


Привет! На связи команда Тинькофф Инвестиций. Мы запустили новую версию программного интерфейса для алгоритмического трейдинга. Расскажем про Tinkoff Invest API и что новенького в сервисе.

Что такое Tinkoff Invest API

Tinkoff Invest API — программный интерфейс для работы с платформой Тинькофф Инвестиций, с помощью которого клиенты Тинькофф могут автоматизировать свою работу на бирже и написать торговых роботов.

Чтобы начать работать с интерфейсом, нужны брокерский счет в Тинькофф, токен доступа и знание языка программирования. Никакого специального ПО не потребуется. У алготрейдеров есть единый API и единый брокерский счет для торгов ценными бумагами с крупнейших мировых бирж. Открывать отдельные счета для торговли на каждой из бирж не нужно. Сервис построен на современном протоколе, есть вся необходимая документация и SDK на разных языках программирования.

выгружать торговые инструменты — акции, облигации, фонды, валюты, фьючерсы — и их параметры;

выгружать историю котировок и текущие рыночные котировки;

выставлять и отменять все виды поручений — рыночные, лимитные, стопы;

просматривать текущий портфель пользователя и историю операций;

получать время работы бирж;

загружать ставки риска инструментов;

подписываться на поток событий по исполнению сделок.

Что нового в последней версии

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

Реализовали API на производительном протоколе gRPС, в числе плюсов которого строгая типизация контрактов, поддержка версионности и автоматическая генерация клиентского программного кода на большинстве языков программирования. gRPC также поддерживает потоковую передачу данных, что позволяет в рамках одного сервиса получать рыночные котировки в режиме реального времени. Для приверженцев RESTful-API реализовали proxy-swagger, а для браузерных web-приложений — шлюз gRPC-web.

Переработали «песочницу», теперь она точно повторяет все движения рынка и позволит клиентам проверить работу торговых роботов на реальных рыночных котировках.

Усилили защиту счетов за счет ключей с разным уровнем доступа. Теперь можно получить ключ для каждого отдельного счета и в режиме «только для чтения» — без возможности выставлять заявки. Это может пригодиться, например, для разработки внешних систем учета клиентских портфелей или расчета доходности торговли.

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

Увеличили качество, объемы и скорость предоставляемых рыночных котировок, а также разнообразие методов и форматы возвращаемых данных.

Реализовали трансляцию потока событий по исполнению заявок клиента, это помогает быстро уведомить клиента об изменении портфеля.

Обеспечили поддержку всех нововведений брокера, которые не были реализованы в старой версии API: мультисчета, фьючерсы, стоп-заявки.

Если вам интересно познакомиться с API поближе, залетайте на наш GitHub Invest API, смотрите документацию. А наша следующая цель — собрать витрину готовых торговых роботов на разных языках программирования, поэтому мы запустили конкурс роботов.

Tinkoff Invest Robot Contest

Ждем разработчиков с 21 апреля по 23 мая на конкурсе по разработке торгового робота для Тинькофф Инвестиций.

Задача: написать систему, которая реализует одну из торговых стратегий на бирже. Система должна работать на новом API Тинькофф Инвестиций. Ограничений по языкам нет, но предпочтительнее писать на Java, Go, Python и JavaScript.

Для участия в конкурсе зарегистрируйтесь на странице Tinkoff Invest Robot Contest и следуйте инструкциям.

Читайте также: