Русский
Русский
English
Статистика
Реклама

Чат-боты

Победитель хакатона права на цифровое решение остались за нами

07.08.2020 14:13:35 | Автор: admin
image
Хакатон соревнование среди разработчиков для создания цифровых решений в интересах заказчика. Хотя мероприятия такого типа очень популярны в IT-среде, многие талантливые специалисты опасаются участвовать в них. Одна из причин стереотип о гарантированной потере прав на разработанное решение. Развеивает этот миф, а также рассказывает о преимуществах и перспективах состязаний программистов один из победителей масштабного хакатона Евгений Маврин.

Евгений молодой перспективный разработчик. Приняв участие в треке Мегапопис Москва, организованном столичным Агентством инноваций в рамках онлайн-хакатона VirusHack, он в составе команды EGD BAG (вместе с Алексеем Айрапетовым и Анной Коваленко) выполнил лучше остальных задачу по созданию информационного бота для мессенджера ICQ New, который сообщал пользователям о распространении коронавирусной инфекции.

image

Евгений, чем Вы и члены Вашей команды занимались до участия в хакатоне? Где учились, где работали, какие проекты вели? Занимались ли бизнесом?
Мы команда одногруппников. Закончили магистратуру МГТУ имени Н. Э. Баумана по программе Информационные системы и технологии в 2019 году. Все занимаемся программированием, но в разных направлениях. У меня, например, основной стек это С++/Qt, а у Леши (Алексей Айрапетов прим. автора) Java. Помимо основной работы каждый из нас имел свои pet-проекты в разной стадии завершенности (читать заброшенности). В общем, до релиза мало чего дошло. Бизнесом никто из нашей команды ранее не занимался. Но мы участвовали, скажем так, в дружественном фрилансе, когда просто требуется IT-помощь кому-то из знакомых. Благодаря образованию и общим интересам в сфере IT нам не составляет особого труда предложить и реализовать работающее решение практически к любой проблеме.

Первый ли раз Вы принимали участие в хакатоне? Как узнали о треке Мегаполис Москва?
Лично я уже участвовал в хакатоне Aramco Upstream Solutions Technathon 2019 в команде с товарищами из РГУ нефти и газа имени И.М. Губкина, но в тот раз нам не повезло. В команде не случился match среди участников.
О треке Мегаполис Москва узнали от друзей: просто кинули в чат рекламу из какого-то сообщества шарпистов (С# разработчиков). К участию в хакатоне VirusHack подошли ответственно: заранее определились с задачей и примерно распределили обязанности. И это реально помогло.

Как Вы оцениваете сложность задачи заказчика ICQ New? Каков уровень соперников?
Задача идеально, на мой взгляд, укладывается во временные рамки хакатона. Зачастую за пару дней, которые отведены под хакатон, в качестве итогового решения многие команды представляют концепцию или прототип. Мы же представили готовый продукт, который в дальнейшем вместе с заказчиком быстро вывели в продакшн. Уровень соперников был высоким. И я действительно волновался, увидев результаты других команд. Многие участники позволяли себе вольную трактовку поставленной задачи: кто-то, например, сделал бота, с которым можно было играть в простенькие казуальные игры.

Расскажите о том решении, которое получилось в итоге? Какие инструменты были задействованы для его разработки?
В итоге получился информационный бот, который сообщал пользователям о распространении коронавирусной инфекции.
По геотегу люди могли получать сведения о новых и старых случаях заражения граждан, узнавать адреса ближайших медицинских учреждений и лабораторий для сдачи тестов на COVID-19 и адреса ближайших к ним аптек и магазинов. Также в бот был встроен упрощенный генератор SMS-сообщений для получения электронного пропуска.
Для регулировки вычислительных потоков при написании бота были использованы стандартные инструменты языка Java. Чтобы значительно упростить работу бота, была выбрана API-библиотека от ICQ. Также была решена задача по упрощению развертывания бота в продакшн-среде: зная, что стандартом в корпоративной разработке сейчас является Docker, мы подготовили Docker-образ.
В общем, получился продукт, простой в модернизации и приспособленный к масштабированию.

Что было сложнее всего?
Самым сложным, наверное, было причесать весь функционал бота, чтобы им было удобно пользоваться. Мы реализовали интерфейс таким образом, чтобы пользователь вводил данные текстом только в крайних случаях, как, например, для указания причины оформления разового пропуска (да, еще недавно это было актуально). Все взаимодействие с ботом сводилось к грамотному использованию инструментов самого мессенджера. Возможности ручного ввода команд мы отключили совсем. Вот, кстати, демо-видео бота: https://youtu.be/1xMXEq_Svj8

Вы стали победителем хакатона. Как дальше развивались события?
Мы узнали одну очень полезную вещь как оказалось, правообладателями бота остались мы сами, что меня несколько удивило даже. Я думал, что любой хакатон это, грубо говоря, обмен идеи, рожденной в командном брейншторме, на ценный приз. Но я перечитал соглашение и правила участия и ничего подобного не нашел. Так что другим участникам хакатонов, которые переживают за то, что придется передавать права на свои разработки, хочу сказать, что нет, далеко не факт, что вас обяжут это делать. На хакатоне VirusHack можно было даже код хранить в приватных репозиториях, а одному из членов жюри просто предоставить временный доступ для вынесения решения. В любом случае перед хакатоном всегда читайте документы об участие, чтобы в дальнейшем не было неожиданностей.
Кстати, наш код мы решили оставить открытым: https://github.com/airaketa/egdbag-bot. Форкайте на здоровье.
После хакатона уже по своей инициативе мы подготовили порт бота под API Telegram на случай второй волны пандемии коронавируса. Но лучше пусть этот проект навсегда останется в приватных репозиториях.
Сейчас мы думаем над тем, чтобы адаптировать функционал бота под текущую ситуацию, когда режим самоизоляции снят. Например, для поиска фитнес-центров, ресторанов и других городских объектов. Члены команды ICQ New не против захостить на своих мощностях и обновленную версию бота.

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

В августе стартует прием заявок на новый хакатон для решения задач города Лидеры цифровой трансформации. Его победители получат солидное вознаграждение. Будет ли Ваша команда участвовать в нем? Как будете готовиться? Если победите, на что потратите денежный приз?
Для меня, как и для остальных участников команды, главной целью участия в хакатоне является возможность разработать прототип продукта в рамках интересной для нас области.
Мы получаем опыт коллективной разработки и хороший проект в портфолио, сталкиваемся с интересными и сложными задачами. Конечно же, мы хотим выиграть. Однако мы не нацелены на получение именно денежного приза. Если проект будет приносить пользу это и будет нашей победой.
Для подготовки к конкурсу Лидеры цифровой трансформации мы попытаемся расширить состав команды: в предыдущем хакатоне нас было трое и, честно говоря, рук просто не хватало. Кроме того, мы решим вопрос с установленным ПО, чтобы у всех участников команды до начала соревнования был требуемый набор программ (как показал опыт, огромное количество времени уходит именно на разрешение проблем с синхронизацией ПО).
Если все же удастся получить приз, то потратим деньги на PS5 и засядем по домам на пару недель. Шутка! Конечно же, мы понимаем, что денежный приз это, прежде всего, финансовая помощь для дальнейшего развития проекта. Хостинг, виртуальные машины и так далее это часть того, на что будут распределены финансы.
Подробнее..

Из песочницы Urban Bot или как писать чат-ботов для Telegram, Slack, Facebook на React.js

27.07.2020 22:10:16 | Автор: admin

image


В этой статье я хочу познакомить с новой библиотекой Urban Bot, которая адаптирует React для написания чат-ботов. Ниже я расскажу, зачем эта библиотека появилась на свет, какие дает преимущества и как написать вашего первого чат-бота.


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

В отличии от большинства чат-бот библиотек, которые чаще всего просто оборачивают http запросы в функции с готовыми аргументами и предоставляют подписки вида bot.on('message', callback), иногда позволяя передавать контекст между вызовами, Urban Bot предлагает совершенно иной подход к разработке чат-ботов через декларативное программирование и компонентный подход. Живой пример, написанный на Urban Bot, вы можете попробовать в Telegram, cсылка на чат-бот, и посмотреть код на GitHub.


Как мы заметили выше, чат-боты это полноценные UI приложения. А какой язык в 2020 и какая библиотека наиболее подходит для разработки UI приложений? Правильно, JavaScript и React. Такая интеграция позволяет легко и непринужденно строить чат-боты любой сложности без единого знания об API мессенджеров. Далее я расскажу, как создавать простые компоненты и на их основе строить сложных чат-ботов, работать с навигацией, создавать диалоги любой вложенности, писать одно приложение и запускать в любых мессенджерах, и многое другое.


Отправка сообщений


Так выглядит самый простой пример на Urban Bot. Для отправки текстового сообщения нам нужно создать функцию и вернуть из него готовый компонент Text с текстом внутри, который мы хотим отправить. Когда компонент отрендериться, все пользователи чат-бота получат сообщение "Hello, world!".


import React from 'react';import { Text } from '@urban-bot/core';function App() {    return (        <Text>           Hello, world!        </Text>    );}

Изображение можно отправить так:


import React from 'react';import { Image } from '@urban-bot/core';function App() {    const imageByURL =  'https://some-link.com/image.jpg';    return <Image file={imageByURL} />;}

Urban Bot имеет готовый набор компонентов, для каждого вида сообщений, для файлов File, для кнопок ButtonGroup и много других, подробнее можно взглянуть здесь. В каждый из них можно передать определенный набор пропсов, например, имитировать будто бот печатает сообщение 1 секунду <Text simulateTyping={1000}>.


Получение сообщений


Мы рассмотрели как посылать сообщения, давайте разберемся как подписываться на сообщения от пользователей. За подписки в Urban Bot отвечают React Hooks.


Чтобы подписаться на текстовые сообщения, мы можем использовать хук useText.


import React from 'react';import { Text, useText } from '@urban-bot/core';function App() {    useText(({ text }) => {        console.log(`Пользователь отправил сообщение ${text}`);    });    return (        <Text>            Hello, world!        </Text>    );}

Urban Bot предоставляет готовы набор хуков для разных типов сообщений. Например, useImage, если пользователь отправил изображение, useFile и т.д. Полный список здесь. В каждый хук также приходит мета информация, кто отправил сообщение и т.д.


Эхо бот


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


В этом компоненте мы впервые добавим работу с переменными через React хук useState. Этот хук возвращает переменную и функцию, чтобы ее изменять. React.useState нужен, чтобы изменение переменной приводило к ререндеру и, соответсвенно, отправке нового сообщения. Мы определим начальное значение переменной text как "Привет" и передадим в компонент Text. Также мы подпишемся на сообщения от пользователей с помощью хука useText, и будем изменять text через функцию setText. После вызова setText React перерендерит компонент Echo с новым значением, и пользователь получит новое сообщение с тем что он сам отправил боту.


import React from 'react';import { Text, useText } from '@urban-bot/core';function Echo() {    const [text, setText] = React.useState('Привет!');    useText(({ text }) => {        setText(text);    });    return (        <Text>            {text}        </Text>    );}

Кнопки


Давайте также напишем пример с кнопками, сделаем простейший счетчик. Для этого нам понадобятся компоненты ButtonGroup и Button. Каждой кнопке мы определим свой обработчик, который будет менять count на +1 или -1 и будем передавать результат в ButtonGroup в проп title. Мы установим проп isNewMessageEveryRender как false, чтобы при последующих ререндерах отправлялось не новое сообщение с новыми кнопками, а просто изменялось начальное сообщение.


import React from 'react';import { ButtonGroup, Button } from '@urban-bot/core';function Counter() {    const [count, setCount] = React.useState(0);    const increment = () => setCount(count + 1);    const decrement = () => setCount(count - 1);    return (        <ButtonGroup title={count} isNewMessageEveryRender={false}>            <Button onClick={increment}>+1</Button>            <Button onClick={decrement}>-1</Button>        </ButtonGroup>    );}


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


Теперь, когда пользователь напишет "/echo" отрендериться компонент Echo, когда "/counter" управление перейдет в Counter. Роуты также могут принимать path как regexp.


import React from 'react';import { Router, Route } from '@urban-bot/core';import { Echo } from './Echo';import { Counter } from './Counter';function App() {    return (        <Router>            <Route path="/echo">                <Echo />            </Route>            <Route path="/counter">                <Counter />            </Route>        </Router>    );}

Визуальный пример, чтобы увидеть как будет работать код.


image


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


Форматирование текста


Urban Bot позволяет стилизовать сообщения через привычные HTML теги. Писать жирным <b>, курсивом <i>, зачеркнутым <s>, переносить строки <br /> и так далее, полный список здесь.


Пример
const someCode = `function sum2() {    return 2 + 2;}if (sum2() !== 4) {    console.log('WTF');}`;<Text>    Usual text    <br />    <b>Bold text</b>    <br />    <i>Italic text</i>    <br />    <u>Underscore text</u>    <br />    <s>Strikethrough text</s>    <br />    <q>quote</q>    <br />    <b>        Bold and <s>Strikethrough text</s>    </b>    <br />    <code >Code 2 + 2</code >    <br />    <pre>{someCode}</pre>    <br />    <a href="http://personeltest.ru/aways/github.com/urban-bot/urban-bot">External link</a></Text>


Диалоги


Чат-боты могут вести диалоги с пользователем, что-то спрашивать, реагировать на сообщения в зависимости от ответа пользователя. В Urban Bot встроен компонент Dialog, который позволяет легко создавать диалоги любой сложности.


Пример плоского диалога. Бот задаст первый вопрос, после ответа задаст второй, потом третий, потом запустит callback onFinish с готовыми ответами. На каждом шаге можно обрабатывать ответ пользователя через callback onNext.


import React from 'react';import { Dialog, DialogStep, Text } from '@urban-bot/core';function FlatDialogExample() {    return (        <Dialog onFinish={(answers) => console.log(answers)}>            <DialogStep                content={<Text>Привет, как тебя зовут?</Text>}                 id="name"                onNext={(name) => console.log(name)}            >                <DialogStep                    content={<Text>Cколько тебе лет?</Text>}                    id="age"                >                    <DialogStep                         content={<Text>Из какого ты города?</Text>}                        id="city"                    />                </DialogStep>            </DialogStep>        </Dialog>    );}

Можно получать на следующем шаге прошлый ответ через паттерн render-props .


function FlatDialogExample() {    return (        <Dialog>            <DialogStep content={<Text>Привет, как тебя зовут?</Text>}>                {(name) => (                    <DialogStep                         content={<Text>{`${name}, cколько тебе лет?`}</Text>}                    />                )}            </DialogStep>        </Dialog>    );}

Можно добавить валидацию на каждый шаг.


function FlatDialogExample() {    return (        <Dialog onFinish={(answers) => console.log(answers)}>            <DialogStep                content={<Text>Привет, как тебя зовут?</Text>}                id="name"                validation={{                     isValid: (answer) => answer !== 'Самуэль',                     errorText: 'Самуэль заблокирован.'                 }}            >                // ...            </DialogStep>        </Dialog>    );}

Также возможно построение более сложных диалогов, когда бот отвечает определенным образом в зависимости от ответа пользователя. Для предопределенных ответов можно использовать кнопки.


import React from 'react';import { Dialog, DialogStep, Text, ButtonGroup, Button } from '@urban-bot/core';function TreeDialogExample() {    return (        <Dialog>            <DialogStep                content={                    <ButtonGroup title="Привет, что вы хотите купить?">                        <Button id="hat">Футболка</Button>                        <Button id="glasses">Очки</Button>                    </ButtonGroup>                }            >                <DialogStep                    match="hat"                    content={                        <ButtonGroup title="Футболка какого размера?">                            <Button id="m">S</Button>                            <Button id="s">M</Button>                            <Button id="l">L</Button>                        </ButtonGroup>                    }                />                <DialogStep                    match="glasses"                    content={                        <ButtonGroup title="Очки какого цвета?">                            <Button id="black">Черный</Button>                            <Button id="white">Белый</Button>                        </ButtonGroup>                    }                />            </DialogStep>        </Dialog>    );}

Состояние


Что вы можете использовать для управления состоянием? Все то же что и в любом React приложении. Можете использовать React useState и передавать состояние ниже по дереву компонентов через пропсы или React Context. Можно использовать библиотеки для управления состоянием: Redux (пример), MobX (пример), Apollo и любые другие, которые обычно используют вместе с React, вы можете даже переиспользовать готовые части из готовых React Web или React Native приложений, так как Urban Bot использует тот же чистый React, который работает в миллионах приложений.


Сессия


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


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


function Counter() {    const [count, setCount] = React.useState(0);    const increment = () => setCount(count + 1);    const decrement = () => setCount(count - 1);    return (        <ButtonGroup title={count} isNewMessageEveryRender={false}>            <Button onClick={increment}>+1</Button>            <Button onClick={decrement}>-1</Button>        </ButtonGroup>    );}

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


function Counter() {    const [count, setCount] = useGlobalCount();   // ...}

Также, в любом месте приложения мы можем получить данные о конкретном чате, какой пользователь написал, с каким никнеймом и т.д. Если чат-бот персональный, то chat и from будут совпадать.


import React from 'react';import { Text, useText, useBotContext } from '@urban-bot/core';function UserId() {    const { chat } = useBotContext();    useText(({ from }) => console.log(`Пришло сообщение от ${from.username}`));   return <Text>Чат id {chat.id}</Text>;}

Типизация


Urban Bot написан на TypeScript, соответсвенно проект полностью типизирован, и если вы пишете на TypeScript, вам будет очень удобно.


Запуск в мессенджерах


Большой плюс Urban Bot, что он не привязан ни к одному мессенджеру. Есть основной пакет @urban-bot/core, который позволяет создавать абстрактных чат-ботов, а уже их подключать к определенным мессенджерам. В данный момент есть поддержка Telegram, Slack, Facebook. В дальнейшем, мы планируем добавлять любые мессенджеры, где есть чат-боты и открытое API. Если вам интересно, и вы хотите писать Urban Bot приложения для других мессенджеров, скажем Viber, Discord или у вас есть свой мессенджер то пишите к нам в группу https://t.me/urbanbotjs, одной просьбы будет достаточно, чтобы появилось большая мотивация реализовать ваш функционал.


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


Скажем, у нас есть готовое приложение App и мы хотим его запустить его в Telegram. Для этого нам понадобится класс UrbanBotTelegram из пакет @urban-bot/telegram. Функция render из @urban-bot/core подобная ReactDOM.render и компонент Root. Мы создаем экземпляр UrbanBotTelegram и передаем туда бот токен из Telegram, также можно передать isPolling, чтобы не настраивать вебхук, и бот работал локально. Готовый экземпляр мы передаем в компонент Root, и оборачиваем наше готовое приложение и, соответсвенно, передаем все в функцию render, которая запустит все процессы.


Более подробная инструкция с видео как разрабатывать локально и деплоить Telegram бота можно прочитать в инструкции.


import React from 'react';import { render, Root } from '@urban-bot/core';import { UrbanBotTelegram } from '@urban-bot/telegram';import { App } from './App';const urbanBotTelegram = new UrbanBotTelegram({    token: 'telegramToken',    isPolling: true,});render(    <Root bot={urbanBotTelegram}>        <App />    </Root>);

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


// ...import { UrbanBotSlack } from '@urban-bot/slack';// ...render(    <Root bot={urbanBotTelegram}>        <App />    </Root>);const urbanBotSlack = new UrbanBotSlack({    signingSecret: 'slackSigningSecret',    token: 'slackToken',});render(    <Root bot={urbanBotSlack}>        <App />    </Root>);

Прямой вызов API


С помощью Urban Bot вы можете создавать чат-ботов просто описывая их через компоненты. А что если вам будет нужно вручную вызвать API? Каждый экземпляр UrbanBot* содержит в себе API клиент для активного мессенджера. Рассмотрим пример для Telegram.


Мы можем получить bot с помощью хука useBotContext. bot содержит client и type c типом мессенджера. client будет представлять собой экземпляр библиотеки node-telegram-bot-api . В любом месте приложения можно получить client и вызвать любой метод на ваше усмотрение, скажем блокировать пользователя, если он написал нецензурное сообщение.


import React from 'react';import { useText, useBotContext } from '@urban-bot/core';function SomeComponent() {    const { bot } = useBotContext();    useText(({ text, chat, from }) => {        if (text.includes('бл***')) {            bot.client.kickChatMember(chat.id, from.id);        }    });    // ...}

В каждом мессенджере уникальный API. Если вы разрабатываете несколько мессенджеров одновременно, можно отделять функционал сравнивая bot.type.


import { useBotContext } from '@urban-bot/core';import { UrbanBotTelegram } from '@urban-bot/telegram';import { UrbanBotSlack } from '@urban-bot/slack';function SomeComponent() {    const { bot } = useBotContext();    if (bot.type === UrbanBotTelegram.type) {        // telegram api        bot.client.kickChatMember(/* ... */);    }    if (bot.type === UrbanBotSlack.type) {        // slack api        bot.client.conversations.kick(/* ... */);    }    // ...}

Как попробовать?


У Urban Bot есть стартер, который позволит вам начать разрабатывать чат-ботов за минуту, сделан по аналогии с create-rect-app. Все что вам нужно, чтобы попробовать Urban Bot это выполнить команду в терминале для


TypeScript


npx create-urban-bot my-app

JavaScript


npx create-urban-bot my-app --template js

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


Итого


Несмотря на то что Urban Bot запустился только недавно, на мой взгляд это библиотека с огромным потенциалом. Только представьте, если у вас есть базовые знания React, вы можете написать чат-бот любой сложности на все возможные платформы, создавать и использовать библиотеки с готовым набором компонентов на манер ui-kit, переиспользовать код между вашими другими UI приложеними на React, будь то web или mobile.


Если вы уже разрабатывали чат-ботов, попробуйте Urban Bot, вы почувствуете как библиотека делает за вас кучу работы. Если никогда не разрабатывали, но имеете представление о React, то напишете вашего первого чат-бота за 5 минут. Если вам понравилась идея и хотите, чтобы проект развивался дальше, вступайте в нашу группу в Telegram, ставьте звезду на гитхабе, будем рады любому фидбеку.


Полезные ссылки


Сайт
Github
Группа в Telegram
Наглядный чат-бот в Telegram, с открытым кодом.
Как создать Todo List чат-бот в Telegram с помощью React.js

Подробнее..

Botsman новая платформа для разработки Telegram-ботов

30.12.2020 12:20:04 | Автор: admin

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

Для тех же, кому уже захотелось ознакомиться с Botsman (но не очень хочется много читать) вот ссылка, милости прошу: https://bots.mn/. Главное, о чём стоит помнить платформа только-только запустилась, и (пока что) не стоит переносить на неё что-то серьёзное и масштабное.

Предыстория: путь к созданию Ботсмана

Пять лет назад в Telegram появилась возможность создавать ботов автоматизированные аккаунты, которыми можно управлять с помощью своих скриптов. Меня это сразу заинтересовало: я люблю делать маленькие, но полезные утилитки.

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

Поэтому почти сразу пришла в голову идея сделать такую платформу, которая возьмёт весь мониторинг на себя: будет логировать и входящие обновления, и то, как бот на них реагирует (и какие возникают при этом ошибки). Заодно можно и графики удобные строить.

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

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

Итак, что же сейчас предлагает данная платформа?

Проксирование запросов

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

Выбор способа обработки запросов ботомВыбор способа обработки запросов ботом

У этой фичи есть очевидный недостаток: небольшое увеличение времени отклика (поскольку в цепочке Telegram ваш сервер появляется дополнительное звено).

Но этой осенью Telegram сделал крутую вещь: они выложили в открытый доступ код сервера-посредника Bot API. По своей сути это такое приложение, которое внутри общается с Телеграмом как клиент по их протоколу MTProto, а снаружи у него торчит уже простое и понятное Bot API. И когда вы обращаетесь к публичному Bot API по HTTPS запрос на самом деле идёт к инстансу такого сервера, а теперь стало можно поднять его самому. И конечно же, внутри Ботсмана я так и сделал (и это новшество оказалось ещё одним мотиватором закончить проект).

Таким образом, вашего бота можно настроить так, что цепочка не станет длиннее: вместо
Telegram сервер Bot API ваш сервер будет
Telegram Botsman ваш сервер.

Правда, тут уже потребуются правки в коде вашего бота: исходящие запросы придётся делать не на api.telegram.org, а на api.bots.mn/telegram. Зато Botsman сможет логировать и их тоже!

Собственно, поговорим о логировании:

Живая лента обновлений

После настройки бота в Botsman, можно сразу открыть страницу Events, отправить что-то в Телеграме своему боту, и увидеть, как это сообщение появилось на экране в реальном времени. Если у вас настроен прокси вы увидите и результат перенаправления запроса вашему серверу. Если ваш сервер шлёт запросы через проксирующий эндпоинт api.bots.mn/telegram они тоже туда попадут.

Так в интерфейсе Botsman выглядит лог всех происходящих с ботом событийТак в интерфейсе Botsman выглядит лог всех происходящих с ботом событий

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

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

Слежение за показателями бота

Ну и конечно же, статистика и графики, куда без них. Честно говоря, аналитик из меня так себе, поэтому сейчас Botsman показывает только довольно базовые метрики общее число апдейтов, число чатов, число пользователей, дневную и месячную аудиторию (DAU и MAU). Графики по числу апдейтов на каждый день/час, и по среднему времени обработки запросов. Было бы, конечно, интересно смотреть на всякую демографию, но в Telegram в этом плане мало информации о пользователях.

Графики в разделе Stats. Как видно, через одного из моих ботов уже прошло почти 20 млн апдейтов.Графики в разделе Stats. Как видно, через одного из моих ботов уже прошло почти 20 млн апдейтов.

Для подсчёта статистики я с самого начала выбрал старый добрый Redis, а вот на клиентской стороне решил рисовать графики с помощью библиотеки, которую до этого сам же написал на конкурс того же Телеграма. Не пропадать же добру :)

Скриптинг

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

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

Поэтому я выбрал JavaScript: моя изначальная идея была взять встроенную в Node песочницу, немного доработать (как это сделано в библиотеках Sandcastle или vm2), чтобы сделать её безопаснее, и выполнять код ботов в ней.

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

В итоге я обратил внимание на библиотеку isolated-vm: она тоже реализует песочницу в JS, но делает это другим, более безопасным (и, что важно, многопоточным) образом. По сути это обёртка над присутствующим в V8 механизмом изолятов независимых контекстов, которые ничего не знают друг про друга. Эта же библиотека, кстати, используется в игре Screeps, где игрокам тоже нужно писать своих ботов.

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

Скриптинг: внутреннее API, обработчики событий

Дальше одним из камней преткновения было дать удобное внутреннее API для написания ботов. Конечно, можно было сказать вашему коду будет доступна переменная update и метод callMethod, а дальше делайте, что хотите. Но раз уж я проектирую всю песочницу, нужно идти до конца.

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

Само добавление обработчиков делается довольно просто:

on(ctx => {  ctx.log('Some update received: ', update);});

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

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

on('message', ctx => {  ctx.message.reply('Hi!');});

А что будет, если объявить два обработчика и они оба подходят для текущего апдейта? Botsman вызовет только первый из них но можно передать управление следующему, если вернуть false (ну или промис, резолвящийся в false разумеется, всё делалось с расчётом на асинхронный код).

Ещё есть удобные способы обработывать только текстовые сообщения с помощью on.text (их можно заодно ещё и фильтровать по регэкспу), только команды с помощью on.command, инлайн-запросы on.inline, и коллбэк-запросы (нажатия на кнопки под отправленными сообщениями) on.callback. О них можно почитать в документации.

В примерах выше видно, что обработчику передаётся единственный параметр экземпляр класса EventContext, и через него делаются все вызовы. Это позволяет Ботсману связывать, например, вызовы API или возникающие ошибки с конкретным апдейтом, который к ним привёл.

Ну а как разграничить обработчики для разных состояний (путей) чата? Для этого предназначена глобальная функция state:

state('step1', (on, state) => {  // Этот обработчик вызовется для любого сообщения,  // если наш чат в состоянии 'step1' - и переведёт его  // в состояние 'step2'  on.text(ctx => {    ctx.route.to('step2');   });});state('step2', (on, state) => {  // А этот обработчик вызывается, если наш чат в  // состоянии 'step2' и возвращает его в 'step1'  on.text(ctx => {    ctx.route.to('step1');   });});

Обратите внимание: функция state немедленно вызывает переданный ей коллбэк с двумя аргументами, которые заменяют собой глобальные функции on и state. Добавленный с помощью локальной функции on обработчик будет вызываться только в указанном состоянии, а с помощью локальной функции state можно создавать вложенные состояния (хотя их можно создать и вручную, просто записывая путь, разделённый слэшами: 'step1/substep1/branchA'). Пока что, впрочем, иерархическая структура состояний особых преимуществ по сравнению с линейной не имеет (но может помочь их логически упорядочить).

Скриптинг: форматируем сообщения с помощью tagged template literals

Отдельно поделюсь одной, казалось бы, незначительной, но весьма радующей лично меня деталью. Если вы уже пробовали использовать Telegram API, то возможно сталкивались со сложностями при отправке текста с форматированием особенно когда в него нужно подставить пользовательские данные. Telegram умеет принимать и HTML, и Markdown, но и в том, и в другом случае подставляемые данные нужно обрабатывать, эскейпить управляющие символы, что не очень удобно.

К счастью, не так давно при отправке сообщения (и в других методах, где можно отправлять форматированный текст) появилась возможность просто указать отдельно, какие участки в нём нужно отформатировать. Добавляем к этому tagged templates из ES6 и получаем вот что:

await ctx.call('sendMessage', {  chat_id: 12345,  ...fmt`Hello ${fmt.bold(foo)}! You can combine ${fmt.italic(bar).bold()} styles together.Links are supported ${fmt.text_link(linkLabel, linkUrl)}.`,});

Выглядит немного непривычно, зато а) не нужно ничего эскейпить, б) невозможно сломать вёрстку, потеряв какой-нибудь HTML-тэг или символ разметки Markdown. Если у вас валидный JS будет и валидная вёрстка. Под капотом запись fmt`something` возвращает объект с двумя полями text и entities поэтому его нужно распаковывать с помощью ... (spread syntax). Ну или его можно передать напрямую в короткие методы типа ctx.message.reply(fmt`something`) или ctx.chat.say(fmt`something`).

Мне кажется, что у tagged template literals вообще не очень много уместных применений в реальном мире, но тут у меня получилось найти одно из них :)

Скриптинг: код по расписанию и запросы к внешним API

Должен сделать важную оговорку: так как код выполняется в изолированных контекстах, у скриптов нет ни доступа к API самой Node, ни возможности импортировать внешние модули. Однако я реализовал метод fetch (по аналогии с одноимённым браузерным API) он позволяет делать не слишком тяжёлые запросы к внешним серверам. Кроме того, доступна глобальная функция cron с помощью неё можно запланировать регулярное выполнение повторяющихся действий:

cron('0 0 * * FRI', ctx => {  ctx.log('This function should execute each Friday at midnight');});

Первый параметр тут либо привычный формат crontab, либо интервал в секундах (правда, и то, и другое с разрешением не чаще раза в пять минут). Я думаю, что возможности выполнять код по расписанию и делать запросы к внешним API позволят реализовать множество практических задач. И не исключено, что в будущем список возможностей (например, импорт каких-то проверенных модулей) будет расширяться.

Скриптинг: веб-интерфейс

Писать код прямо в браузере не самое комфортное занятие, но я стремлюсь сделать его хотя бы сравнимым с разработкой в IDE. Сейчас в качестве редактора я использую CodeMirror (в первую очередь из-за его относительно небольшого веса), в дальнейшем, вероятно, добавлю возможность переключиться на Monaco он ощутимо тяжелее, зато должен быть шустрее и функциональнее (именно он используется внутри VS Code).

Так сейчас выглядит редактор кода в BotsmanТак сейчас выглядит редактор кода в Botsman

Пока что в Botsman нет разбивки кода на отдельные файлы в этом тоже может быть неудобство, если вы собираетесь писать сложного бота. Зато код сохраняется автоматически, и есть возможность хранить все его предыдущие версии это ещё не Git, но всё же.

И ещё одна небольшая, но довольно ценная возможность: проверка кода перед деплоем с помощью тестов. При этом Botsman по нажатию одной кнопки сразу покажет подробный лог выполнения (см. скриншот выше): время инициализации, обработки запроса, отладочный вывод и возникшие ошибки (код с синтаксическими ошибками задеплоить не выйдет в принципе).

Песочница для запросов к Telegram

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

Панель вызова методов Telegram APIПанель вызова методов Telegram API

Будущие планы

Как было сказано ранее, Botsman находится в самом начале своего пути. Возможно, его даже настигнет Хабраэффект (надеюсь, что нет!). Возможно, ему станет тяжко, если созданные на нём боты наберут популярность не исключено, что тогда придётся вводить платные возможности. Поскольку занимаюсь им я сейчас в одиночку, сложно сказать, что с ним будет.

В очень примерных планах сейчас такие фичи:

  • Визуальный конструктор в дополнение к скриптингу

  • Глобальное key-value хранилище + создание собственных хранилищ

  • Поддержка других платформ, кроме Telegram

  • Доступный снаружи эндпоинт для вызова кода бота

  • Управление ботом с нескольких аккаунтов

  • Навигация по коду, разбивка на модули, поддержка сторонних модулей

  • Более гибкое тестирование кода, автоматические тесты

  • Больше статистики и графиков

  • Оповещения (если с ботом что-то не так)

  • Улучшение вида чатов

  • Улучшение работы с файлами (скачивание, загрузка), в том числе в песочнице

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

Подробнее..

Цифровая трансформация завода (ч. 4) автоматические личные кабинеты и чат-боты

28.04.2021 18:07:33 | Автор: admin

Часть 1: CRM для ERP

Часть 2: Роботизация бизнес-процессов

Часть 3: Волшебные интерфейсы и оживление железа

Часть 4: Автоматические личные кабинеты и чат-боты (в этой публикации)

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

Комплекс систем автоматически работает 24/7 в режиме real-time и полностью реализован за 1,5 года. Хабом является корпоративная ERP-система.

Автоматическая система управления заказами - от создания заказов клиентов, до отгрузки на заводе и доставкиАвтоматическая система управления заказами - от создания заказов клиентов, до отгрузки на заводе и доставки
  1. Клиенты оформляют заказы в личном кабинете клиента.

  2. Заказы из личного кабинета автоматически попадают в ERP-систему.

  3. По заказам клиентов в ERP автоматически формируются задания на перевозку.

  4. Задания на перевозку в ERP автоматически распределяются между перевозчиками.

  5. Заявки на перевозку из ERP автоматически попадают в личный кабинет перевозчика.

  6. Перевозчики автоматически из ERP получают уведомления в чат-боте Telegram или по SMS о новых заявках в личном кабинете.

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

  8. Водители автоматически из ERP получают уведомления в чат-боте Telegram о новых заявках.

  9. Водители приезжают на завод и регистрируют прибытие в чат-боте Telegram или на уличном терминале, и автоматически встают в электронную очередь на погрузку в ERP - подробнее в третьей части.

  10. Водители автоматически вызываются из электронной очереди на погрузку в чат-боте Telegram или по SMS, и на LED-табло - подробнее в третьей части.

  11. Продукция отгружается на заводе, машины покидают территорию завода и выполняют доставку клиенту.

  12. Клиенты автоматически из ERP получают серию уведомлений в личном кабинете, чат-боте Telegram или по SMS об изменении статуса доставки продукции.

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

А теперь подробнее о том, что для этого было сделано...

Личный кабинет перевозчика, распределение заявок и торги, чат-бот для уведомлений в Telegram

Напомню, что завод отгружает ~ 2 млн. тонн продукции в год, из них ~ 50% составляют отгрузки грузовым автотранспортом, что составляет ~ 40 000 рейсов в год.

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

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

Контур системы управления зданиями на перевозку включает 4 подсистемы:

  1. ERP-система (формирование заявок и распределение между перевозчиками).

  2. Личный кабинет перевозчика на сайте (получение заявок по квотам, ежедневные торги, отчеты о выполненных рейсах, объяснительные по опозданиям).

  3. Чат-бот для перевозчиков в Telegram (мгновенные уведомления о новых заявках, торгах и опозданиях водителей).

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

Автоматическое распределение заявок между перевозчиками в ERP

В основе алгоритма автоматического распределения заявок между перевозчиками 3 базовых критерия:

  • Квота перевозчика (отношение количества транспортных средств перевозчика к общему количеству транспортных средств всех перевозчиков).

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

  • Рейтинг перевозчика (выполнение заявок и отказы от выполнения за последние 30 дней).

    Каждой заявке в ERP автоматически присваивается количество баллов от +1 до +4 (срочные заявки и заявки в дальние регионы получают максимальный балл). При отказе перевозчика от заявки баллы автоматически снимаются от -1 до -4. Рейтинг перевозчика это сумма баллов за последние 30 дней пропорционально количеству транспортных средств.

  • Общая загрузка перевозчика (процент загрузки транспортных средств перевозчика за последние 30 дней).

    Общий процент загрузки заявками перевозчика за последние 30 дней по отношению у другим перевозчикам за тот же период.

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

    Например: предопределенные грузополучатели перевозчика или бизнес-регионы, в которые перевозчик не осуществляет доставку.

Ежедневно по расписанию 3 раза в день, по заказам клиентов, роботом в ERP автоматически формируются задания на перевозку: 2 раза в день (утром и вечером) задания автоматически распределяются между перевозчиками, 1 раз днем задания попадают на торги.

Личный кабинет перевозчика и торги на сайте

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

Лайфхак: Правило оформления левого верхнего угла сайта личного кабинета

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

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

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

Лайфхак: Используйте числовую индикацию пунктов главного меню

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

Пример: когда в Моих заявках индикатор (0), значит у перевозчика нет новых заявок, которые он может или должен взять в работу.

Личный кабинет перевозчика - главная страницаЛичный кабинет перевозчика - главная страница

Сайт личного кабинета перевозчика полностью адаптивен для работы на смартфонах и планшетах (сейчас это 50% пользователей).

Примеры других страниц личного кабинета перевозчика
Личный кабинет перевозчика - мои заявкиЛичный кабинет перевозчика - мои заявкиЛичный кабинет перевозчика - заявки на торгахЛичный кабинет перевозчика - заявки на торгахЛичный кабинет перевозчика - общие заявкиЛичный кабинет перевозчика - общие заявкиЛичный кабинет перевозчика - отчеты о рейсахЛичный кабинет перевозчика - отчеты о рейсах

Общая логика работы перевозчиков с заявками в личном кабинете:

  1. Мои заявки

    Это заявки перевозчика по квоте, которые он получил после автоматического распределения в ERP. Чтобы взять в работу или отказаться у перевозчика есть 30 минут, после чего они автоматически становятся общими. Если перевозчик не взял в работу хоть одну заявку или отказался хотя бы от одной заявки, ему до конца дня автоматически устанавливается запрет на взятие других заявок. Это мотивирует перевозчика брать все распределенные ему заявки, а не только "хорошие".

  2. Общие заявки

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

  3. Заявки на торгах

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

    Все ставки перевозчиков по заявкам автоматически поступают в ERP. Через 30 минут после начала торгов робот в ERP определяет наилучшие ставки и распределяет заявки с торгов на перевозчиков по тем ставкам, которые они сделали в личном кабинете. Это дает существенную экономию по тарифам на доставку - до 20%.

Отчет в ERP по торгам перевозчиков - заявки получают перевозчики с минимальными ставками (выделены зеленым)Отчет в ERP по торгам перевозчиков - заявки получают перевозчики с минимальными ставками (выделены зеленым)

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

Тот случай, когда перевозчик торгуется за заявку сам с собой

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

В данном случае перевозчик мог снизить тариф всего на 1 рубль и гарантированно получить заявку с торгов, так как кроме него больше никто ставок не делал. Но делая "слепую" ставку перевозчик снижает тариф на 138 рублей (11,15%).

Перевозчик торговался сам с собой, так как не видит ставки других перевозчиков для этой заявкиПеревозчик торговался сам с собой, так как не видит ставки других перевозчиков для этой заявки

Чат-боты в Telegram для перевозчиков и водителей

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

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

Личный опыт: Правила оформления текстов уведомлений в Telegram
  1. Краткий и понятный заголовок, написание заглавными буквами и жирным шрифтом.

  2. Эмодзи перед заголовком, соответствующий его названию.

  3. Эмодзи не должны повторяться в разных типах уведомлений.

  4. Цвет выбранного эмодзи должен соответствовать сообщению (например: красный - нарушение, зеленый - все хорошо).

  5. Краткий текст основного сообщения.

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

А со временем человек привыкает и видит только цветной смайлик и реагирует на него.

Пример различных уведомлений перевозчиков в чат-боте TelegramПример различных уведомлений перевозчиков в чат-боте Telegram

Почему я не сделал мобильное приложение для перевозчиков?

Действительно, изначально я планировал реализовать мобильное приложение и даже запросил больше 20-ти коммерческих предложений у компаний-разработчиков.

Полнофункциональное мобильное приложение, интегрированное в нашей ERP-системой, предложила реализовать только одна компания. Стоимость 10 млн. руб. "под ключ" превышала весь мой годовой ИТ-бюджет на разработку в 2,5 раза.

Другие предложения составляли от 1 до 5 млн. руб. и мы самостоятельно должны были найти интегратора, который за отдельную стоимость "подружит" мобильное приложение с ERP-системой.

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

Разработка личного кабинета перевозчика на сайте, интегрированного с ERP-системой и двух чат-ботов в Telegram в сумме составила всего около 500 тыс. руб.

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

Быстрая разработка чат-ботов, которую мы используем

Год назад мы приобрели готовый модуль Платформа интеграции 1С с чат-ботами и встроили его в ERP-систему. Модуль имеет открытый программный код и закрытую часть, а также пользовательский интерфейс для разработки простых сценариев чат-ботов "без программирования", остальные нюансы разрабатываются программистом.

Логика чат-бота разрабатывается на стороне ERP, а встроенный модуль позволяет быстро настроить интеграцию с зарегистрированным ботом Telegram через API-ключ (токен). Для обмена ERP-системы с Telegram используется развернутый на нашей стороне веб-сервис.

Пример сценария чат-бота для водителей в интерфейсе ERP-системыПример сценария чат-бота для водителей в интерфейсе ERP-системыПример настроек подключения чат-бота в интерфейсе ERP
Настройки подключения чат-бота на стороне ERPНастройки подключения чат-бота на стороне ERP

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

Мессенджер чат-ботов в интерфейсе ERP-системыМессенджер чат-ботов в интерфейсе ERP-системы

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

Автоматическая регистрация нового пользователя в чат-боте TelegramАвтоматическая регистрация нового пользователя в чат-боте Telegram
  1. Новый водитель нажал в чат-боте команду СТАРТ и получил мгновенный ответ.

  2. Водитель написал в чат-боте номер своего телефона и получил мгновенное приветствие.

  3. Водитель нажал в чат-боте команду Я - ПРИБЛ НА ПОГРУЗКУ и получил мгновенный ответ.

Пример служебных уведомлений в чат-бот, когда что-то идет не по сценарию
Автоматическое служебное уведомление в чат-бот, когда что-то идет не по сценариюАвтоматическое служебное уведомление в чат-бот, когда что-то идет не по сценарию

Как обеспечить работу сервисов 24/7, когда тех.поддержка работает 8/5

Сотрудники линии тех.поддержки работают в режиме 8/5. При работе систем и сервисов в режиме 24/7 мы обнаружили, что веб-сервисы могут молча "отвалиться", а на стороне сервера этого не видно. Чтобы оперативно узнавать об этом, мы разместили на нашем основном сайте небольшой скрипт, который каждые 5 минут опрашивает состояние веб-сервисов.

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

Пример служебного уведомления сотрудникам тех.поддержки о том, что веб-сервис недоступенПример служебного уведомления сотрудникам тех.поддержки о том, что веб-сервис недоступен

Личный кабинет клиента, чат-боты в Telegram для уведомлений и согласований

В нашей компании всего 6 менеджеров по продажам. 3 менеджера обеспечивают 80% продаж, что составляет ~ 1,6 млн. тонн продукции в год.

КАК БЛО (ручной процесс):

Клиент >отправка заявки по email> Менеджер по продажам >создание заказа по заявке> ERP-система >согласование доставки по заказу> Менеджер по логистике >отправка заявки на доставку по email> Перевозчик >передача информации по телефону> Водитель

Большое количество участников процесса внутри компании. Большое количество коммуникаций между всеми участниками процесса (по телефону, по email, в мессенджерах, лично).

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

КАК СТАЛО (автоматический процесс):

Личный кабинет клиента >заказ клиента> ERP-система >заявка на доставку> Личный кабинет перевозчика >заявка на рейс> Личный кабинет водителя

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

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

Дальше подробнее о том, как реализован личный кабинет клиента...

Личный кабинет клиента на сайте, интегрированный онлайн с ERP

Личный кабинет разработан на платформе "1С-Битрикс". Интеграция с 1С реализована через встроенный в ERP стандартный модуль, который прилично доработан. Автоматический обмен реализован через веб-сервис в режиме real-time. Сайт полностью адаптивен для работы на смартфонах, сейчас это 20% пользователей.

Личный кабинет клиента - главная страницаЛичный кабинет клиента - главная страница

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

Личный опыт: Удобный пользовательский интерфейс на первом месте

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

Что для этого сделано:

  • Подробный вид (1 клик) карточек договоров и заказов в списках, без открытия формы.

  • Замена выпадающих списков (2 клика) на радио-кнопки (1 клик).

  • Замена выпадающих списков (2 клика) на чек-боксы (1 клик), когда доступен выбор нескольких значений.

  • Автоматический выбор единственного значения радио-кнопки в формах (0 кликов).

  • Функционал повтора заказов (1 клик) для создания аналогичного по существующему.

  • Пошаговое заполнение заказов для исключения лишних и недоступных действий (кликов).

  • Многократное самостоятельное тестирование всех экранных форм на удобство.

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

У каждого статуса заказа свой цвет, текущий статус с датой и временем, общий прогресс выполненияУ каждого статуса заказа свой цвет, текущий статус с датой и временем, общий прогресс выполненияЦветные статусы и общий прогресс выполнения заказов в спискахЦветные статусы и общий прогресс выполнения заказов в списках
Краткий (слева) и полный вид (справа) карточек договоров, изменение вида в 1 кликКраткий (слева) и полный вид (справа) карточек договоров, изменение вида в 1 клик

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

Краткое уведомление о проблеме по заказу прямо в списке (не достаточно денег)Краткое уведомление о проблеме по заказу прямо в списке (не достаточно денег)

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

Полное уведомление о проблеме по заказу в центре нотификации (сколько не хватает денег)Полное уведомление о проблеме по заказу в центре нотификации (сколько не хватает денег)Пример других страниц сайта личного кабинета
Форма создания заказа клиента - пошаговое заполнениеФорма создания заказа клиента - пошаговое заполнениеСтраница профиля личного кабинета клиентаСтраница профиля личного кабинета клиентаНастройки профиля личного кабинета клиентаНастройки профиля личного кабинета клиентаНастройка уведомлений контактных лиц клиентовНастройка уведомлений контактных лиц клиентов
Примеры страниц мобильной версии сайта личного кабинета
Краткий и полный вид карточек заказов в списке (на смартфоне)Краткий и полный вид карточек заказов в списке (на смартфоне)Форма запроса счета на оплату (на смартфоне)Форма запроса счета на оплату (на смартфоне)Форма настройки уведомлений контактных лиц (на смартфоне)Форма настройки уведомлений контактных лиц (на смартфоне)

Быстрое получение счета на оплату по email

В личном кабинете клиента реализовано моментальное получение счетов на оплату по email (без участия наших менеджеров по продажам). Ключевая особенность, что счет может быть отправлен на несколько email одновременно.

Клиент запрашивает счет в личном кабинете и получает в почте через 3-5 секунд (именно столько времени требуется для автоматического формирования счета в ERP и его отправки роботом из ERP на email контактного лица).

При запросе счета на оплату можно выбрать контактное лицо, которому он придет на emailПри запросе счета на оплату можно выбрать контактное лицо, которому он придет на email

Счет на оплату автоматически сгенерирован в ERP и сразу отправляются на email контактного лица в формате PDF (на фирменном бланке и с факсимиле).

Счет на оплату, отправленный роботом из ERP на email контактного лица по запросу из личного кабинетаСчет на оплату, отправленный роботом из ERP на email контактного лица по запросу из личного кабинета

Чат-боты в Telegram для уведомлений и внутренних согласований

Для уведомлений клиентов о статусе мы используем Email-робота и SMS-робота (подробнее в первой части), чат-бот в Telegram.

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

Пример уведомлений клиентов в чат-боте TelegramПример уведомлений клиентов в чат-боте Telegram

Чат-боты в Telegram для менеджеров и руководителей продаж

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

Бэк-офис регистрирует новые интересы в CRM-системе (подробнее в первой части), а робот в ERP мгновенно уведомляет менеджеров в чат-боте Telegram.

Скриншот смартфона менеджера по продажам с уведомлениями о заявках от потенциальных клиентовСкриншот смартфона менеджера по продажам с уведомлениями о заявках от потенциальных клиентов

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

Менеджер по продажам или менеджер бэк-офиса может запросить согласование технического кредита в ERP по различным параметрам:

  • С лимитом по сумме

  • С лимитом по тоннажу

  • С лимитом по количеству машин

  • С лимитом по количеству вагонов

  • На увеличение ранее согласованного тех.кредита (по сумме, тоннажу, машинам или вагонам)

Примеры различных тех.кредитов в ERP для согласования с руководителем
Пример согласования тех.кредита на отгрузку 1 машиныПример согласования тех.кредита на отгрузку 1 машиныПример согласования тех.кредита на отгрузку вагонами 140 тоннПример согласования тех.кредита на отгрузку вагонами 140 тоннПример согласования увеличения тех.кредита на сумму 150 тыс. руб.Пример согласования увеличения тех.кредита на сумму 150 тыс. руб.

Руководители двух коммерческих дирекций получают мгновенные уведомления в чат-боте Telegram на согласование тех.кредитов.

Уведомление руководителю в чат-бот Telegram на согласование тех.кредитаУведомление руководителю в чат-бот Telegram на согласование тех.кредита

Руководитель может инициировать согласование тех.кредита для клиента командой НАЧАТЬ СОГЛАСОВАНИЕ, ознакомившись с информацией - СОГЛАСОВАТЬ или НЕ СОГЛАСОВАТЬ.

Результат согласования мгновенно получает уведомление в чат-боте Telegram ответственный за работу с клиентом менеджер по продажам. Заказы клиентов в ERP автоматически проводятся в рамках согласованных лимитов тех.кредитов, начиная с первого не проведенного по времени создания заказа.

Уведомление менеджера в чат-боте Telegram о результате согласования тех.кредита руководителемУведомление менеджера в чат-боте Telegram о результате согласования тех.кредита руководителем

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

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

Мы также реализовали новую систему отгрузки паллет со склада под кодовым названием "TESLA". Напишите в комментариях, если вам интересно узнать об этом подробнее.

Тизер для будущей публикации о новой системе для кабины автопогрузчика
Новая система отгрузки паллет со склада, установленная в кабинет автопогрузчикаНовая система отгрузки паллет со склада, установленная в кабинет автопогрузчика

Спасибо, что дочитали до конца!

Подробнее..

Как создавался новогодний Хабрачат в этом году

31.12.2020 20:05:20 | Автор: admin

Здравствуйте, коллеги!

Новый год подкрадывается всё ближе, а это значит, что нам снова пора собраться вместе для того чтобы хорошо провести время!

Для тех кто еще не знаком с новогодним хабрачатом, расскажу немного про него. Это несколько чатов на разных платформах, объединенных мостом. Боты в каждой из платформ пересылают сообщения из остальных и получается, что все как-бы находятся в одном чате, при этом не покидаю любимой платформы. В этом чате мы традиционно встречаем Новый год уже четвертый раз (в прошлом году только в одном SSH-чате было больше сотни человек).

В центре внимания, конечно, SSH-чат, который работает только несколько дней до нового года и несколько после. В этом году разные люди так же подняли чаты в XMPP (Jabber), Телеграмме и IRC. Так же традиционно есть чат-бот tars, который может вывести ёлку и поздравить с новым годом. В прошлые года таких ботов делали несколько человек (кто-то даже на баше).

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

Настраиваем SSH-чат

SSH-чат обычно открывает @podivilov, для этого используется кастомный SSH сервер, написанный на go. Устанавливается и настраивается он довольно просто. Для начала можно освободить стандартный порт SSH, чтобы при заходе в наш чат не вводить порт. В ubuntu server, например, это делается так. В файле /etc/ssh/sshd_config находим строку Port 22 и меняем число на нужный порт. После этого перезапускаем ssh демон sudo systemctl restart sshd и стандартный порт свободен (убедитесь, что фаерфол пропустит вас по новому порту).

Скачивается бинарник под нужную платформу из релизов на github. Можно положить его, например, в /usr/bin. Далее пишем простой скрипт, который будет перезапускать сервер, в случае падения.

Скрипт для запуска сервера start.sh
#!/bin/bashwhile :do/usr/bin/ssh-chat --admin=/root/.config/ssh-chat/admins --bind=0.0.0.0:22 --log /root/ssh-chat.log --motd=/root/.config/ssh-chat/motdsleep 1done

Давайте разберем параметры запуска

  • admin путь до файла со списком публичных ключей администраторов (у них стандартный набор возможностей: кик, бан и прочее)

  • bind айпи и порт, на котором сервер будет транслировать

  • log путь до файла с логами чата

  • motd путь до файла с сообщением дня (message of the day), которое будет показываться при каждом заходе в чат

Теперь мы можем запустить этот скрипт любым удобным способом (в сессии tmux/screen, через systemctl и т.д.) и чат готов. Вводим ssh nickname@habr2021.podivilov.ru и попадаем в наш чат. Для списка комманд нужно ввести /help, а для выхода /exit или Ctrl+D.

Настраиваем мост между чатами

Мост уже который год хостит @mrDoctorWho, для этого используется matterbridge, который кстати тоже написан на go. Его установка и настройка, как ни странно происходит точно так же. Скачиваем бинарник из релизов на github и кладем его, куда нам надо. Далее пишем конфигурационный файл и скрипт старта. Как-то так выглядит конфиг от @mrDoctorWho:

Файл конфигурации matterbridge.toml
[xmpp.myxmpp]Server="helldev.net:5222"#Jid your useridJid=""Password=""Muc="conference.helldev.net"Nick="bridge"RemoteNickFormat="[{PROTOCOL}] &lt;{NICK}> "[sshchat.mychat]Server="habr2021.podivilov.ru:22"RemoteNickFormat="[{PROTOCOL}] &lt;{NICK}> "[telegram.mytelegram]Token=""RemoteNickFormat="[{PROTOCOL}] `&lt;{NICK}>` "MessageFormat="Markdown"[general]MediaDownloadPath="/var/www/"MediaServerDownload="http://personeltest.ru/aways/helldev.net/"[[gateway]]name="gateway1"enable=true[[gateway.inout]]account="telegram.mytelegram"channel="-1001200239638"[[gateway.inout]]account="sshchat.mychat"channel="sshchat"[[gateway.inout]]account="xmpp.myxmpp"channel="ny"

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

А вот скрипт запуска, который почти ничем не отличается от скрипта для SSH-чата:

Скипт для запуска моста start.sh
#!/bin/bashwhile :do/usr/bin/matterbridge -conf /root/.config/matterbridge/matterbridge.tomlsleep 1done

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

Создание чат бота

Чат-бот, который гуляет по чатам уже который год подряд, называется tars. Бот поздравляет с Новым годом, выводит новогоднюю ёлку ASCII-артом и имеет несколько других команд, в зависимости от того, кто его делал. Первая версия была запущена три года назад, к сожалению не помню кем. Бот был написан на bash-скрипте с использованием screen.

Свою версию я писал на JavaScript с использованием только стандартных библиотек. С его исходным кодом можно ознакомиться здесь. Если вкратце, он вызвает процесс командной строки с помощью модуля child_process (в зависимости от операционной системы, используются либо bash.exe, либо bash). Далее он открывает ssh сессию может писать либо читать прямо из нее. Кроме этого, код довольно заурядный, с его последней версией вы можете ознакомиться на гитхабе.

Как попасть в чаты

Выбирайте любой понравившийся и присоединяйтесь. С наступающим Новым Годом!

Подробнее..

Как адаптировать языковые модели Kaldi? (со смешными животными)

24.05.2021 14:14:07 | Автор: admin


Как научить русскоязычную модель распознавать речь геймеров? Подобными вопросами задаются те, кто увлекается и занимается NLP. В частности, NLP-специалистов интересует, как можно адаптировать русскоязычную модель vosk под их предметную область, чтобы улучшить качество распознавания. Это мы и разберём в данной статье.


Привет! Приглашаю вас кушать блины и распознавать речь

Сейчас можно легко заставить компьютер распознавать обычную устную речь, благо, есть пакет vosk, который является человечной обёрткой (wrapperом) к предобученным моделям Kaldi. Alphacephei и Николай Шмырёв проделали колоссальное количество работы по продвижению опен-сорса в распознавании русскоязычной речи, и vosk, пожалуй, венец всего их труда. Большая модель vosk-ru для распознавания устной русской речи без всяких доработок может решать множество задач распознавания речи.

По умолчанию большая модель vosk-ru предназначена для распознавания обычных разговорных слов и синтаксических конструкций. Однако, когда появляется необходимость распознавать другие слова и другие языковые конструкции, которые не предусмотрены моделью vosk-ru по умолчанию, качество распознавания заметно ухудшается. Если таких конструкций немного, то можно выстроить соответствие между тем, что нужно распознать, и тем, что распознаётся на самом деле. Например, текущая модель vosk-model-ru-0.10 не умеет распознавать слово коронавирус, но распознает отдельные слова: корона и вирус. В подобных случаях нам будет предоставлен своеобразный ребус, который нам, со своей стороны, нужно будет решить программно. К сожалению, на ребусах далеко не уехать.

Собственно, как здорово, что все мы здесь сегодня собрались научиться адаптировать модель vosk-ru. Для этого существуют пути адаптации:



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



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

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

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

Соответственно, в Kaldi есть два основных способа проектирования языковых моделей: ARPA LM и грамматика FST:



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


Мопс выделяет частоты в сигнале, на которых находится речь

СТРУКТУРА VOSK-MODEL-RU-0.10

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

vosk-model-ru-0.10
\__ am сокращённо от Acoustic Model. Содержит модель распознавания звуков (фонем)
\__ conf папка с файлами конфигураций для запуска модуля
\__ graph графы для описания вероятностей переходов от одной фонемы к другой. Содержит информацию о заученных переходах фонем, а также переходы с учётом языковой модели
\__ ivector папка с сохранёнными голосовыми слепками из обучающей выборки
\__ rescore n-граммная языковая модель для переопределения цепочек слов
\__ rnnlm языковая модель на основе рекуррентной нейронной сети для дополнительного переопределения цепочек слов
\__ decode.sh исполняемый файл для запуска моделей с помощью инструментов Kaldi
\__ decoder-test.scp, decoder-test.utt2spk служебные файлы для распознавания пробного файла
\__ decoder-test.wav пробный файл
\__ README документация


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

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

Модификация словаря
Замена словаря
Модификация ЯМ
Замена ЯМ

Ну что ж, приступим?


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

УСТАНОВКА KALDI

Прежде всего нам нужно поставить Kaldi на нашу рабочую машину (Linux или Mac). Благо, делается это весьма просто:

git clone https://github.com/kaldi-asr/kaldi.gitcd kaldi/tools/./extras/check_dependencies.shmake -j 4 # тут в качестве параметра указываете количество параллельных процессов при установкеcd ../src/./configure --sharedmake depend -j 4 # аналогичноmake -j 4 # аналогично

В результате установки на машине компилируются зависимости и непосредственно сам Kaldi. Если что-то идёт не так, смотрите логи, гуглите и обращайтесь за помощью в комментарии.

УСТАНОВКА KENLM

Затем нам нужно установить инструмент kenlm для построения статистических языковых моделей. Есть альтернативы для построения статистических языковых моделей, такие как SRILM, он поддерживает бОльшее количество видов сглаживаний для языковых моделей, но он сложнее при установке и использовании. Помимо всего прочего, kenlm можно использовать без ограничений для коммерческих приложений.

git clone https://github.com/kpu/kenlm.gitmkdir -p kenlm/buildcd kenlm/buildcmake ..make -j 4


НАСТРОЙКА ДИРЕКТОРИИ

Для того чтобы нам начать процедуру по адаптации модели, нужно организовать нашу рабочую директорию. Создайте папку в любом удобном месте, папка будет содержать модель vosk-а, на которую, в том числе, можно будет ссылаться из вашего Python-приложения.

# Создаём рабочую директориюmkdir your_asr_project/cd your_asr_project/# Копируем необходимые файлы из модели vosk-аcp -R /path/to/your/vosk-model-ru-0.10/am .cp -R /path/to/your/vosk-model-ru-0.10/conf/ .cp -R /path/to/your/vosk-model-ru-0.10/graph/ .cp -R /path/to/your/vosk-model-ru-0.10/ivector/ .# Копируем необходимые скрипты из рецептов Kaldicp -R /path/to/your/kaldi/egs/mini_librispeech/s5/steps/ .cp -R /path/to/your/kaldi/egs/mini_librispeech/s5/utils/ .cp -R /path/to/your/kaldi/egs/mini_librispeech/s5/path.sh .cp -R /path/to/your/kaldi/egs/mini_librispeech/s5/cmd.sh .

Рекомендуется брать скрипты из рецепта mini_librispeech, так как именно он изначально использовался для обучения vosk-model-ru-0.10.

НАСТРОЙКА ОКРУЖЕНИЯ

Предыдущим шагом мы установили все зависимости. Теперь необходимо прописать пути к нашим зависимостям. Это делается через файл path.sh, который мы только что скопировали:

./path.sh
export KALDI_ROOT=/path/to/your/kaldi # Здесь указываете путь до вашего Kaldi[ -f $KALDI_ROOT/tools/env.sh ] && . $KALDI_ROOT/tools/env.shexport PATH=$PWD/utils/:$KALDI_ROOT/tools/openfst/bin:$PWD:$PATH[ ! -f $KALDI_ROOT/tools/config/common_path.sh ] && echo >&2 "The standard file $KALDI_ROOT/tools/config/common_path$. $KALDI_ROOT/tools/config/common_path.shexport LC_ALL=C# For now, don't include any of the optional dependenices of the main# librispeech recipe

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

НАСТРОЙКА ОКРУЖЕНИЯ ДЛЯ KENLM

Чтобы kenlm также был доступен из вашей рабочей директории, нужно определить до него путь. Можно отдельно выполнять эту строку в командной строке или прописать в path.sh:

export PATH=$PATH:/path/to/your/kenlm/build/bin # Здесь указываете путь до вашего kenlm

Кроме того, нужно обозначить путь до бинарников по работе с языковыми моделями в рамках Kaldi:

export PATH=$PATH:/path/to/your/kaldi/src/lmbin

Итак, мы закончили настраивать наше окружение, пора приступать к самым важным шагам для того, чтобы сгенерировать новый итоговый граф ./graph/HCLG.fst.


Сколько можно настраиваться, давайте уже что-нибудь предметное делать!

КОНФИГУРАЦИЯ СЛОВАРЯ

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

При работе с Kaldi графом называется детерминированный конечный автомат (finite state transducer) в формате openfst. Можно выделить 3 основных графа, с которыми так или иначе приходится иметь дело при обучении и адаптации систем распознавания речи, основанных на Kaldi:
  1. L_disambig.fst граф лексикона, по своей сути фонетический словарь, закодированный в детерминированный конечный автомат.
  2. G.fst граф языковой модели, представляет собой закодированную в детерминированный конечный автомат языковую модель.
  3. HCLG.fst объединение графов лексикона, языковой модели и акустической модели.


Нашей задачей по умолчанию является восстановление графа лексикона (и затем графа языковой модели), который используется vosk-ом при создании итогового графа ./graph/HCLG.fst. Файл с графом HCLG.fst в папке graph поставляется вместе с моделью vosk-model-ru-0.10 по умолчанию.

Итак, для генерации графа лексикона нам нужно создать папку ./data/local/dict, в нее нужно будет добавить несколько файлов:

  1. data/local/dict/lexicon.txt словарь фонетических транскрипций
  2. data/local/dict/extra_questions.txt словарь фонетических вариантов
  3. data/local/dict/nonsilence_phones.txt список значимых фонем
  4. data/local/dict/optional_silence.txt список необязательных обозначений тишины
  5. data/local/dict/silence_phones.txt словарь обозначений тишины


Сейчас подробно разберём, что должно быть в каждом из указанных выше файлов. Начнём со словаря фонетических транскрипций. Словарь фонетических транскрипций был также указан ранее во вводной части. Повторюсь, в таком словаре через пробел указано сначала само слово, а затем поочерёдно фонемы, которые отражают произношение слова. Конкретно в реализации vosk-model-ru можно выделить несколько разновидностей фонем:

  • SIL, GBG неречевые звуки:
    • SIL обозначение тишины
    • GBG обозначение иных любых неречевых звуков
  • a0, e0, i0, безударные гласные
  • a1, e1, i1, ударные гласные
  • bj, dj, fj, мягкие парные согласные
  • c, ch, j, остальные непарные согласные.


Основа для этого словаря поставляется с моделью vosk-model-ru-0.10 в файле ./extra/db/ru.dic. В таком словаре через пробел указано сначала само слово, а затем поочерёдно фонемы, которые отражают произношение слова. Кроме непосредственного содержания этого словаря надо добавить две строки в начало ru.dic: !SIL и [unk]. Начало файла будет следующее:

./data/local/dict/lexicon.txt
!SIL SIL[unk] GBGа a0а a1а-а a0 a1а-а-а a0 a0 a1

Весь дальнейший файл аналогичен ./extra/db/ru.dic, добавлены только две строчки сверху. Изменённый файл нужно сохранить в ./data/local/dict/lexicon.txt.

Затем нужно определить файл extra_questions.txt, который описывает схожести среди разных фонем. Его нужно оформить следующим образом:

./data/local/dict/extra_questions.txt
a0 a1 b bj c ch d dj e0 e1 f fj g gj h hj i0 i1 j k kj l lj m mj n nj o0 o1 p pj r rj s sch sh sj t tj u0 u1 v vj y0 y1 z zh zjSIL GBG

Также нужно определить другие файлы, описывающие различные фонемы и категории, к которым эти фонемы относятся. ./data/local/dict/nonsilence_phones.txt сформирован на основе файла ./graph/phones.txt, но убрана нумерация после пробела и убраны постфиксы у фонем. С помощью этих же фонем описаны все слова (кроме !SIL и [unk]) в lexicon.txt, то есть это наш основной инструмент по описанию обыкновенных русскоязычных слов с точки зрения их произношения. После того как провели сортировку и убрали дубликаты, у нас получается файл ./data/local/dict/nonsilence_phones.txt, первые пять строк которого указаны ниже:

./data/local/dict/nonsilence_phones.txt
a0a1bbjc

Ну и наконец определяем наши мусорные звуки и звук тишины.

./data/local/dict/optional_silence.txt
SIL

./data/local/dict/silence_phones.txt
SILGBG

Следует обратить особое внимание на то, чтобы все строки были однообразно оформлены, чтобы были Linux-овские переносы строк "\n", чтобы все файлы были в кодировке UTF-8. После шагов, обозначенных выше, мы наконец можем выполнять шаги по адаптации нашей модели.


Читающий эту статью, кот и файлы для генерации графа L_disambig.fst


МОДИФИКАЦИЯ СЛОВАРЯ

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

git clone https://github.com/DinoTheDinosaur/russian_g2p_neuro.gitcd russian_g2p_neuro/python setup.py install

Этот модуль предобучен на ru.dic, поэтому он формирует новый словарь по образу и подобию изначального словаря для vosk-model-ru-0.10. Чтобы сгенерировать новые транскрипции для списка слов достаточно запустить команду:

generate_transcriptions extra/db/input.txt extra/db/output.dict

В input.txt перечислены в любом виде слова на кириллице (в том числе целые тексты с повторениями), а в output.dict формируется список всех этих слов с соответствующими транскрипциями. Результат output.dict можно совместить с данными из lexicon.txt и сформировать новый расширенный словарь:

mv data/local/dict/lexicon.txt extra/db/lexicon_old.txtcat extra/db/lexicon_old.txt extra/db/output.dict | sort | uniq > data/local/dict/lexicon.txt


ЗАМЕНА СЛОВАРЯ

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

Шаги по установке и использованию те же самые:

git clone https://github.com/DinoTheDinosaur/russian_g2p_neuro.gitcd russian_g2p_neuro/python setup.py installcd /path/to/your_asr_project/generate_transcriptions extra/db/input.txt extra/db/output.dict

Однако последний шаг отличается:

mv data/local/dict/lexicon.txt extra/db/lexicon_old.txtsed s/^/!SIL SIL\n[unk] GBG\n/ extra/db/output.dict > data/local/dict/lexicon.txt

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

ФОРМИРОВАНИЕ ГРАФА ЛЕКСИКОНА


Это не граф, это кот

Когда все файлы корректно сформированы, директория наконец-то готова к запуску скрипта utils/prepare_lang.sh из корневой директории вашего проекта по адаптации. Запуск данного скрипта создаст нужный нам граф лексикона под названием L_disambig.fst

utils/prepare_lang.sh --phone-symbol-table graph/phones.txt data/local/dict "[unk]" data/tmp/ data/dict/

Если при запуске скрипт возвращает ошибку, то стоит проверить свои файлы для построения лексикона на правильность. Если не удаётся сформировать данные файлы своими силами, то можно воспользоваться дампом директории локальной dict за дату 04/03/2021 по ссылке в google drive.

По итогу выполнения скрипта можно будет найти нужный нам L_disambig.fst в папке data/dict. После этого можно приступать к модификации и замене языковой модели.

ЗАМЕНА ЯЗКОВОЙ МОДЕЛИ НА N-ГРАММНУЮ

Работу над нашими языковыми моделями будем вести в новой директории ./data/local/lang. Если у вас есть тексты, по аналогии с которыми вы хотите распознавать какие-то фиксированные ключевые фразы, но при этом не хотите распознавать обычную спонтанную речь, то этот пункт для вас. Обычно имеет смысл использовать такой подход, если есть большой массив примеров команд и каких-то кодовых фраз и нет возможности прописать грамматику, которая бы предусмотрела все варианты.

Допустим, что корпус с вашими примерами реплик вы положили в ./extra/db/your.corpus. Начнём с того, что сформируем новую языковую модель с помощью установленного ранее kenlm:

lmplz -o 3 --limit_vocab_file graph/words.txt < extra/db/your.corpus > data/local/lang/lm.arpa

Проясним немного, что в этой команде обозначает каждый из параметров:

  1. -o order, то есть максимальный порядок словесных n-грамм, для которых мы подсчитываем вероятности
  2. --limit_vocab_file словарь, в соответствии с которым фильтруются входные данные. Мы будем использовать этот параметр, если мы не хотим добавлять новых слов в словарь. Если мы не используем этот параметр, то необходимо после построения языковой модели также модифицировать словарь и следовать пунктам, отмеченным
  3. -S 30% не указан, но можно добавить в случае если в системе не хватает памяти на расчёт модели.


По результату выполнения этой команды мы получим файл такого формата:

./data/local/lang/lm.arpa
\data\ngram 1=51515ngram 2=990559ngram 3=3056222\1-grams:-5.968162       [unk]   00       <s>     -2.2876017-1.5350189      </s>    0-2.3502047      а       -0.7859633-3.6979482      банки   -0.42208096-3.9146104      вторую  -0.46862456-2.0171714      в       -1.142168

Языковая модель в формате ARPA построена следующим образом:

  1. Вначале указана шапка \data\, в которой указано количество каждой n-граммы
  2. Затем по очереди указаны все униграммы, биграммы и т.п. с соответствующими им заголовками \1-grams, \2-grams и т.п.
  3. Перечисление n-грамм начинается со значения логарифма вероятности появления последовательности (-3.6979482)
  4. Затем через знак табуляции указана сама последовательность (униграмма банки)
  5. Через ещё один знак табуляции так называемый backoff weight (-0.42208096), который позволяет высчитывать вероятности для последовательностей, которые явным образом не представлены в языковой модели
  6. Заканчивается файл ARPA меткой \end\


Когда у нас готова наша языковая модель, нужно заменить все "&ltunk&gt" обозначения на "[unk]":

sed -i "s/<unk>/[unk]/g" data/local/lang/lm.arpa

Ну и наконец, когда у нас есть готовая ARPA модель, мы можем сгенерировать новый граф языковой модели G.fst и таким образом подготовиться к итоговому объединению всех результатов в HCLG.fst:

arpa2fst --disambig-symbol=#0 --read-symbol-table=data/dict/words.txt data/local/lang/lm.arpa graph/G.fst

В результате выполнения последней команды рядом с графом по умолчанию HCLG.fst мы положили новый граф языковой модели G.fst. Следующим и последним шагом мы генерируем новый итоговый граф HCLG.fst с помощью нового графа языковой модели G.fst.

МОДИФИКАЦИЯ N-ГРАММНОЙ ЯЗКОВОЙ МОДЕЛИ

Когда мы хотим распознавать спонтанную речь, и при этом добавить какие-то необычные речевые конструкции, то можно расширить нашу языковую модель. Благо, вместе с моделью vosk-model-ru-0.10 поставляются сжатые языковые модели в формате ARPA ./extra/db/ru-small.lm.gz и ./extra/db/ru.lm.gz, которые участвовали в формировании модели vosk-model-ru-0.10.

Аналогично предыдущему пункту, мы генерируем нашу новую lm.arpa и заменяем в ней символы "&ltunk&gt":

lmplz -o 4 --limit_vocab_file graph/words.txt < extra/db/your.corpus > data/local/lang/lm.arpased -i 's/<unk>/[unk]/g' data/local/lang/lm.arpa

Обратим ваше внимание, что здесь мы используем другое максимальный порядок n-грамм (параметр -o). Это мы делаем, чтобы продемонстрировать то, как можно объединить две языковых модели в одну, а объединять можно языковые модели только одинакового порядка. Рассмотрим те модели, которые мы имеем на данный момент:

  1. ./extra/db/ru-small.lm.gz 3-граммная ЯМ
  2. ./extra/db/ru.lm.gz 4-граммная ЯМ


Как вы могли догадаться, мы для примера будем объединять нашу модель с большой языковой моделью ru.lm. Для объединения языковых моделей порядка 4 можно воспользоваться следующим кодом merge_lms.py. Если же вы будете объединять свою модель порядка 3 с моделью ru-small.lm, то можно воспользоваться кодом, представленным в данной статье Kaldi ASR: Extending the ASpIRE model в пункте под названием Merging the input files.

Перед использованием извлечём архив с моделью:

gunzip /path/to/your/vosk-model-ru-0.10/extra/db/ru.lm.gz

Использование merge_lms.py из корневой директории проекта:

python utils/merge_lms.py /path/to/your/vosk-model-ru-0.10/extra/db/ru.lm data/local/lang/lm.arpa data/local/lang/lm_joint.arpa

Теперь результат объединения можно конвертировать в граф с помощью команды arpa2fst:

arpa2fst --disambig-symbol=#0 --read-symbol-table=data/dict/words.txt data/local/lang/lm_joint.arpa graph/G.fst

Аналогично предыдущему пункту, G.fst готов, остался последний шаг генерация HCLG.fst.


Братья L_disambig.fst и G.fst

ЗАМЕНА ЯЗКОВОЙ МОДЕЛИ НА ГРАММАТИКУ

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

./graph/G.txt
0 1 [unk] [unk]0 1 да да0 1 нет нет1 0.0

Эта грамматика служит способом выявления конкретных речевых событий команд и распознаёт только 3 команды:

  1. Слово да
  2. Слово нет
  3. Иное слово


События эти равновероятны, и все могут повторяться только один раз. Это пример очень простой грамматики, однако с помощью этого подхода можно задавать куда более сложные структуры. У конкретно такой грамматики 0 является начальной вершиной графа, 1 конечной, но могут быть также промежуточные вершины, может быть несколько конечных состояний, и также можно определять вероятности каждого перехода. Этот граф определяет переходы из начального состояния в конечное по нескольким возможным равновероятным ребрам: [unk], да и нет.

Чтобы сформировать наш уже знакомый и любимый G.fst, нужно преобразовать эту грамматику из текстового вида в бинарный:

fstcompile --isymbols=data/dict/words.txt --osymbols=data/dict/words.txt --keep_isymbols=false --keep_osymbols=false G.txt | fstarcsort --sort_type=ilabel > G.fst

Ура! Теперь и с помощью этого последнего способа мы смогли сгенерировать тот же самый G.fst. Осталось совсем чуть-чуть.

ФОРМИРОВАНИЕ ИТОГОВОГО ГРАФА

Наконец-то мы можем приступить к финальному и самому ответственному моменту: к генерации итогового графа. Делается это ровно одной строкой:

utils/mkgraph.sh --self-loop-scale 1.0 data/lang/ am/ graph/

Теперь ваше персонализированное распознавание речи готово! Достаточно лишь сослаться на вашу рабочую директорию при инициализации модели vosk-а:

from vosk import Modelmodel = Model("/path/to/your_asr_project/")

И далее уже в интерфейсе vosk-а реализовывать распознавание.


Вы заслужили

ПРОДОЛЖЕНИЕ СЛЕДУЕТ...

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

Разбор Как работает реклама в чатах Telegram

21.12.2020 10:07:55 | Автор: admin

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

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

Реклама в Telegram-чатах: при чем тут боты

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

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

Поговорим о том, как это работает на практике.

Как все устроено: реклама в чатах через ботов

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

Объявления показываются в приветственном сообщении оно появляется при вступлении в группу нового пользователя.

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

Существует и другой подход, когда реклама еще более нативно показывается в сообщениях бота, связанных с основной тематикой чата.

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

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

Какого охвата можно добиться, и какой бюджет нужен

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

В итоге для крупных ботов, которые установлены в популярных чатах 1500-5000 новых пользователей в день, статистика показов объявлений в активных сообществах колеблется в районе 150-180 тысяч показов в сутки. Итоговая цена зависит от планируемого охвата и формата объявления единственный сервис/продукт будет рекламироваться или нет.

Что может пойти не так

В описанном способе рекламы на данный момент есть два главных недостатка:

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

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

Заключение

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

Подробнее..

Как чат-боты помогают цирку, вузу и эко-проекту 5 неординарных кейсов на визуальном конструкторе c NLU

19.05.2021 18:19:31 | Автор: admin

Чат-бот МЕГИ и ИКЕА распознает 8 наиболее распространенных фракций отходов и ежедневно обрабатывает порядка 30 сообщений.Бот АкБарс Банка развивает сотрудников и в прошлом году обучил 54% специалистов в компании. Бот Президентской академии в Санкт-Петербурге отвечает на вопросы абитуриентов и в августе 2020 года помог более 1000 поступающим.При этом все кейсы были реализованы на визуальном конструкторе с NLU. Just AI, разработчик технологий в сфере разговорного AI,рассказывает о деталях создания чат-ботов.

Чат-бот МЕГИ и ИКЕА сортирует мусор

Ежегодно в России образуется около 70 млн тонн бытового мусора, это в 10 раз больше веса пирамиды Хеопса. При разложении отходы выделяют опасные химикаты, например, метан, которыми мы же потом и дышим.

МЕГА и ИКЕА реализуют глобальную стратегию по устойчивому развитию ДА людям и планете! и несколько лет назад запустили программу раздельного сбора мусора Правила Деления в Санкт-Петербурге. На территории двух центров МЕГА появились сортировочные пункты, было налажено сотрудничество с перерабатывающими предприятиями. Организаторы движения стали проводить лекции и сделали группу в социальной сети ВКонтакте, на момент публикации в ней состоят более 22 тыс. подписчиков.

Отчасти причина непопулярности экологических инициатив в России в недостаточном эко-образовании населения. Люди не понимают, как, куда и в каком виде можно сдавать отходы. Мы постоянно получали вопросы, принимается та или иная продукция, нужно ли снимать этикетки с бутылок. Нам хотелось сделать так, чтобы любой человек мог мгновенно получить ответы на запросы о маркировке и раздельном сборе отходов, - Александр Страдышев, куратор проекта, МЕГА Парнас.

Количество мусора можно сократить почти на 80%, если органические и пищевые отходы закапывать в почву, а опасные правильно утилизировать.

Организаторы получали так много сообщений ВКонтакте, что решили автоматизировать ответы на типовые запросы. Команда Правил Деления разработала в конструкторе Aimylogiс чат-бота, который теперь помогает администратору группы. Бот представляет собой интерактивный FAQ, где есть ответы на часто задаваемые вопросы: Можно ли это сдать, Где вы находитесь, Время работы станций, Нужно ли снимать этикетку и др.

Чат-бота разрабатывали в несколько этапов. Для начала собрали таблицу со всеми возможными маркировками отходов, их описанием и возможностями приема и переработки. Затем написали сценарии вопросов и ответов, их разработка заняла около недели, и запрограммировали бота. Наконец, доработали формулировки, логотип и удобные для распознавания маркировки.

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

В будущем команда Правил Деления планирует научить чат-бота распознавать маркировки по фото за несколько недель работы пользователи прислали боту 127 фотографий.

Результат

Чат-бот умеет распознавать 8 наиболее распространенных фракций отходов. Ежедневно он обрабатывает порядка 30 сообщений, а в пиковый день помог более чем 500 людям. За все время работы ботом воспользовались 4 430 человек.

Чат-бот Упсала-Цирка знает расписание спектаклей

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

От AI-технологии в Упсала-Цирке в первую очередь хотели получить больше возможностей для общения со зрителями и волонтерами.

У многих компаний есть одна проблема: люди заходят на сайт, что-то узнают и просто уходят, а мы по факту узнаем, какой был трафик на сайте. Мы хотели собрать контактные данные пользователей, понять, что это за люди, и в дальнейшем отправлять им релевантную информацию, Екатерина Черемисина, PR-менеджер Упсала-Цирка.

Персонажем чат-бота стала собака по кличке Пина, которую списали с реальной собаки режиссера.

Цирк в целом про эмоции и удивление. Кто-то в шутку предложил сделать Пину персонажем чат-бота. Я зацепилась за эту мысль, потому что Пина постоянно в цирке, у всех на виду. Мне показалось, что такой персонаж может заинтересовать и завлечь пользователей, Екатерина Черемисина.

Задумка, действительно, удалась. Бегу за мячиком! Но на пару вопросов отвечу! пишет собака Пина в диалоге. Она может скинуть расписание спектаклей, сориентировать в курсах, объяснить, как добраться до цирка и каким транспортом лучше воспользоваться. В чат-боте есть ветки по вопросам сотрудничества, волонтерства, пожертвований. Также Пина предлагает всем заполнить контактную форму.

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

Результат

За два с половиной месяца работы в цирке роботизированная собака Пина помогла 144 уникальным пользователям. У команды Упсала-Цирка есть задумка встроить в чат-бота окошко для вноса пожертвований. Кроме того, сейчас цирк разрабатывает новый сайт и планирует интегрировать чат-бота туда.

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

Затрачено на конструктор чат-ботов Aimylogic на момент публикации: 3 960 руб.

Чат-бот АкБарс Банка развивает сотрудников

Технология чат-ботов востребована в HR-сфере, часто ее используются для задач прескрининга кандидатов, онбординга новых сотрудников и опросов. В АкБарс Банке взглянули на возможности технологии шире и разработали 9 ботов, задача которых обучение и развитие персонала.

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

Чат-боты АкБарс Банка помогают сотрудникам осваивать профессиональные навыки вроде владения Excel и развивать софт-скиллы. Бот Барсик обучает коммуникативным навыкам: он дает задание и варианты ответов, а потом проговаривает правильный вариант и объясняет, почему другие варианты неправильные.

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

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

Результат

За 3 месяца 2019 года с помощью чат-бота прошли обучение 1798 человек 31% сотрудников компании. Командировочные расходы, связанные с выездами на обучение, упали на 36%.

В 2020 году, когда командировки стали невозможны, значение удаленного обучения существенно возросло. Чат-бот обучил 2726 человек 54% сотрудников. По результатам опроса, в 27 удаленных регионах удовлетворенность обучением выросла с 62 до 75%.

Затрачено на конструктор чат-ботов Aimylogic на момент публикации: 47 200 руб.

Чат-бот Президентской академии помогает абитуриентам

Прием абитуриентов время предельной нагрузки для любого вуза. Чтобы сделать процесс поступления максимально комфортным, в Петербургском РАНХиГС при Президенте РФ действует проект Виртуальный помощник абитуриента. Суть программы в том, что каждый поступающий оставляет электронную почту и потом регулярно получает на нее полезную информацию.

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

По данным Совета ректоров Санкт-Петербурга и Ленинградской области, 70% из числа поступающих приезжают в наш город из других субъектов России. Чтобы процесс поступления в вуз для них был максимально простым и понятным, мы решили создать консультанта с искусственным интеллектом силу, которая никогда не спит и способна общаться с тысячью пользователями одновременно, говорит директор Северо-Западного института управления Владимир Шамахов.

Стоит сказать, что виртуальный консультант СЗИУ РАНХиГС коренной петербуржец, именно поэтому он готов ответить на вопросы не только о поступлении, но и рассказать абитуриентам о главных достопримечательностях города. Для этого потребуется задать лишь один вопрос: Куда сходить в Петербурге?.

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

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

Результат

Пик вопросов предсказуемо пришелся на время вступительных экзаменов. В августе 2020 года ботом воспользовались более 1000 человек.

Цветочный чат-бот принимает заказы в интернет-магазине

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

Затем для удобства покупателей в БукетОпт подключили Открытые линии Битрикс24. Эта система собирает сообщения с разных площадок Instagram, ВКонтакте, WhatsApp, сохраняет в CRM и ставит в очередь к оператору. Оказалось, что людям удобно задавать вопросы в привычных социальных сетях и мессенджерах число обращений выросло в несколько раз, и ресурса одного оператора перестало хватать. Тогда в компании задумались о виртуальном помощнике.

Люди часто задают однотипные вопросы: оформление заказа, оплата, доставка, ассортимент, и гораздо проще, когда на них отвечает бот. Мы прослушали порядка 300 звонков и выделили 11 групп часто задаваемых вопросов, - Лада Трегубова, маркетолог БукетОпт.

На изучение материалов и инструкций Aimylogic ушла неделя. Основной задачей была верно составить логику вопросов и ответов для чат-бота.

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

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

Результат

Бот обслуживает около 1000 диалогов каждый месяц. Их результативность в компании отслеживают по utm-меткам. 1000 запросов дают 269 переходов на сайт, из посетивших интернет-магазин клиентов 23% добавляют заказ в корзину и 14% оплачивают покупку.

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

Затрачено на конструктор чат-ботов Aimylogic на момент публикации: 68 990 руб.

Подробнее..

Все, что вы хотели знать про диалоговый UXUI в проектировании чат-ботов

21.05.2021 20:16:58 | Автор: admin

Читайте в статье: что такое диалоговый UX/UI и какего создавать, а также полезные лайфхаки при проектировании сценария длячат-бота.

В марте 2021 годааналитики Voicebot провели опрос300 маркетологов и узнали, что они думают про голосовых помощников. Оказалось, что более 60% специалистов уверены в пользе голосовых ассистентов длямаркетинга. Виртуальные помощники и чат-боты больше не новинка и не пустой повод дляхайпав новостях. Бизнесактивно использует разговорные технологии дляэффективной коммуникации спользователями, дляпрямых продаж и создания прочных связей сбудущими и настоящими клиентами. И мы в Just AI уверены, что в будущем эта тенденция будет толькорасти.

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

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

Для новичков. Что такое диалоговый UX и в чем его отличие отдиалогового UI?

Начнем спростого: UX это user experience или опыт, который получает пользователь в ходе его взаимодействия синтерфейсом сервиса, продукта или услуги. UI это user interface, пользовательский интерфейсили то, что мы привыкли называть дизайном.

Идем дальше. Диалоговый UX это опыт пользователя, который позволяет ему общаться сботом, свиртуальными помощниками или людьми. К нему относятся: общение сголосовыми помощниками, игра в голосовую игру, голосовое управление автомобилем, голосовая команда в поисковую строку.

А диалоговый UI это интерфейсы, которые позволяют взаимодействовать между пользователем и системой. Элементом диалога может стать голосовой или текстовый ввод и вывод информации, а также модальное окно на сайте, поп-ап в приложении и т. п.

В рамках диалогового UI мы рассматриваем два условных типа интерфейсов: голосовой и разговорный. Кажется, что это синонимы, но не все такпросто. Под разговорным интерфейсом или Conversational User Interface (CUI) подразумеваются все интерфейсы, скоторыми можно общаться на естественном языке кактекстом, таки голосом.

Соответственно, в понятие CUI входит Voice User Interface (VUI) или голосовой интерфейс. Он предполагает взаимодействие сустройством спомощью голоса.

Так выглядит схема диалогового интерфейсаТак выглядит схема диалогового интерфейса

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

Закрепим. Итак, Алиса в Яндекс.Станции это VUI, а в смартфоне, где сней можно говорить голосом и чатиться CUI. А все вместе это диалоговый UI.

Кто создает диалоговый UX и UI при проектировании чат-ботов

Созданием диалогового UХ и UI занимается отдельный специалист. Он разрабатывает диалоговый пользовательский интерфейс, продумывая пользовательский опыт.В Just AI мы называем такого специалиста дизайнер разговорных интерфейсов.

Но в русском языке точный термин до сих пор не закрепился. Поэтому можно встретить разные переводы. Так, на HH.ru мы встретили 17 разных названий вакансий: дизайнер диалогов, диалоговый редактор, digital-лингвист, voice UX designer, диалог-дизайнер, сценарист чат-бота и такдалее. Подробности о нашем исследовании смотрите в вебинаре Создатели разговорных интерфейсов: кто они и чем занимаются?. На нем мы рассказали, каксделать так, чтобы специалисты и компании нашли друг друга.

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

Собрали основные термины из этой статьи. Сохраняйте себе, чтобы не потерятьСобрали основные термины из этой статьи. Сохраняйте себе, чтобы не потерять

Для продвинутых. Какразработать диалоговый UX/UI

Шаг 1. Узнайте, подходит ли разговорный интерфейсдляваших задач.

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

Чек-лист диалогового UX/UI

  • Ваш вопросможно решить только при участии человека.

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

  • Чтобы выполнить задачу, сейчаснужно кликать на экран несколько раз.

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

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

  • Задачу можно выполнить, одновременно делая другие дела.

  • Задачу можно выполнить, даже если глаза и руки пользователя заняты другими делами.

  • Пользователю комфортно говорить или писать о теме задачи.

Отмечайте в чек-листе, какие пункты соответствуют вашей задачеОтмечайте в чек-листе, какие пункты соответствуют вашей задаче

Обратите внимание, что голосовой интерфейсможет не подойти в следующих ситуациях и пространствах:

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

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

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

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

Если голосовой интерфейс не подходит, возможно, подойдет текстовыйЕсли голосовой интерфейс не подходит, возможно, подойдет текстовый

Шаг 2. Узнайте все о пользователе

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

Чтобы составить пользовательскую персону, дляначала ответьте длясебя на вопросы:

  • Кто ваши пользователи?

  • Что хотят сделать? Какую проблему хотят решить?

  • Какони делают это сейчас?

  • Какие слова или фразы они используют, говоря о задаче?

  • Каков контекст, обстоятельства этих задач или проблем пользователей?

Перед разработкой сценария задайте себе эти вопросы о пользователяхПеред разработкой сценария задайте себе эти вопросы о пользователях

Продумайте tone of voice то, какую речь будет использовать ботили ассистент при общении спользователем. Если это чат-бот, какон обращается кклиенту на ты или на вы? Использует ли он профессиональные термины? Умеет ли общаться на отвлеченные темы и шутить,какботКвик?

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

Чтобы найти tone of voice, поизучайте ресурсы, на которых сидят пользователи это могут быть Известия, Ревдинский рабочий, Одноклассники, ВКонтакте и такдалее.

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

Ирина Степанова, аналитикразговорных интерфейсов отдела лингвистики в компании Just AI

Сравните сами, какможет отличаться Tone of Voice в сообщениях отразных компаний:

1. Привет, Иван! Посмотри новые тарифы на сайте в разделе Цены! Мы подготовили длятебя классные предложения!

2. Здравствуйте, Иван Иванович. Просим обратить внимание, что с1.06.2021 обновляются Тарифы. Актуальная информация находится в соответствующем разделе.

Тональность диалогов влияет на то, как пользователи воспринимают бота или голосового помощникаТональность диалогов влияет на то, как пользователи воспринимают бота или голосового помощника

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

Четыре максимы помогают сделать диалог бота спользователем наиболее человечным и эффективным.

Максима качества информации:

  • не говори того, что считаешь ложным;

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

Максима количества информации:

  • изложи не меньше информации, чем требуется;

  • изложи не больше информации, чем требуется.

Максима релевантности:

  • не отходи оттемы.

Максима ясности:

  • будь последовательным:

  • избегай неясности;

  • избегай двусмысленности;

  • будь краток;

  • будь систематичен.

В кратком изложении они описаны на картинке.

Эти принципы помогут сделать диалог бота с пользователем эффективнееЭти принципы помогут сделать диалог бота с пользователем эффективнее

Шаг 3. Спроектируйте диалог

Создание сценария чат-бота стоит начать со схемы диалога в голосовом или текстовом каналах (Voice Flow или Chat Flow). Это диаграмма, которая показывает пути, через которые может идти диалог.

Для начала пропишите happy path или счастливый путь идеальный диалог пользователя сботом отначала и до конца. А затем продумайте ответвления, которые могут возникнуть на этом пути: сложности, дополнительные вопросы, уточнения.

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

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

Шаг 4. Пропишите текстовый сценарий

Чтобы выполнить этотшаг, берите за основу путь пользователя и выбранный tone of voice. Готовые кусочки диалогов потом пойдут в код и превратятся в реальные реплики бота или ассистента.

Кусочек настоящего текстового сценария чат-бота. Показано, что произойдет, если бот не знает ответаКусочек настоящего текстового сценария чат-бота. Показано, что произойдет, если бот не знает ответа

Шаг 5. Сборка прототипа диалога

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

UX-дизайнер не просто рисует красивые кнопки. Он проектирует эмоциональный и чувственный опыт. Неважно приятный, неприятный, напряженный Эти оттенки зависят отпоставленной задачи, а UX-дизайнер спроектирует то, что необходимо.

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

Екатерина Юлина, Head of Product UX, Just AI

Чтобы узнать, какими будут дальнейшие шаги и увидеть практикум сборки прототипа диалога, посмотрите наш вебинар Дизайн голосовых интерфейсов: как, что, где и главное, зачем?. Специалисты Just AI рассказали и показали, каксоздают UX и UI при проектировании чат-бота HR дляпроизводственной компании, а также поделились практическими советами.

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

Подробнее..

Нерабочие дни закончились, рабочие начались, а над чем работать? ИТшник на распутье

11.09.2020 18:10:30 | Автор: admin
Какой же это кайф, оказывается, заказать капучино в обычном торговом центре, как приятно никого не спрашивая выйти на улицу и пообщаться с друзьями. Такие простые радости в марте и апреле были недоступны, подавляющее большинство сидело по домам и работало удаленно, насколько вообще возможно работать из дома (семьям в панельках и не только привет)

image

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

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

Цель же данной статьи не потуги айтишников в макроэкономических прогнозах, а лишь субъективный взгляд на происходящее, и попытка дать ответ на вопрос Что делать? и немного матчасти, куда же без неё, ведь это хабр, без конкретики тут нельзя :)

Что ж, с вводной частью закончено, поехали!

Факт глубокого кризиса в мировой экономике давно признан, но насколько глубоким он будет узнать очень полезно, чтобы знать, к чему готовиться. Один из индексов, наиболее часто используемый для прогнозирования аналитиками от экономики индекс PMI. Если он выше 50 заказы на продукцию растут, если ниже падают, показатели в РФ: ru.investing.com/economic-calendar/russian-markit-manufacturing-pmi-1630 в сентябре перевалило за 50, но летом был ужас-ужас.

На нас, как и на всех граждан, влияет ситуация с бюджетом РФ. А у бюджета РФ дефицит. Способов борьбы с дефицитом бюджета три:

  1. Секвестр бюджета
  2. Девальвация
  3. Заимствования на внешнем рынке.

И мы уже видим все три инструмента в действии.

  1. Минфин уже предложил (а мы хорошо знаем, что в России значит слово предложил) секвестр бюджета. Для нашей экономики секвестр не сулит ничего хорошего, а урезание оборонного бюджета говорит о том, что это не рядовой кризис, кому интересно, предлагаем почитать позитив по ссылочке https://www.rbc.ru/economics/21/07/2020/5f15ab829a7947382f5ec57e

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

Так же имеют место факты вроде остановки одной из ниток с помпой открывавшегося Турецкого потока, https://www.rbc.ru/society/10/07/2020/5f08c3ff9a7947c8483647fd потому что Турции газ дешевле покупать не у России, даже Белорусь начала покупать нефть у США и Норвегии, понятно, что это политика, но факты закупок это факты. А отросшим ценам на нефть радоваться не стоит, надо смотреть на объемы поставок, а объемы продаж у России сильно упали, все мы помним духоподъемные майские новости о рухнувшем на 52% экспорте Газпрома, на 32% сырой нефти и на 43% каменного угля. Это не может не повлиять на экономику нашей страны в среднесрочной перспективе.

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

image

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

Давайте попробуем проанализировать, какой экспертизой нужно обладать ИТ-специалисту в начале 20-х, чтобы успешно конкурировать за рабочие места, помимо стандартных технических компетенций для соответствия должности.

На какие тренды в ИТ пандемия 2020-го оказала стимулирующий эффект в России больше всего? Выделим три:

  1. инструменты для удалённой работы и общения
  2. автоматизация/цифровизация
  3. импортозамещение

Дисклеймер: Примеры программ ниже не охватывают всё известные/популярные/актуальные продукты, это именно примеры.

1. Удаленная работа


Удалённый рабочий стол в самом широком смысле. Классика, например: RDP, RemoteApp, VDI, не забывая про VPN и т.п. Есть ещё и сторонние сервисы типа VNC: AnyDesk, TeamViewer и пр. они, конечно, несут в себе определенные угрозы безопасности, но люди продолжают ими пользоваться. Сюда же отнесём любое собственное ПО для удалённой работы: например, мобильное приложение для топ-менеджмента для работы с бюджетами, вроде банк-клиента.
Инструменты для удалённого общения через интернет подразумевается максимально широкий спектр: эл.почта; портал; форумы; соц.сети; мессенджеры и т.д. Последние особенно плотно вошли в нашу жизнь (к хорошему быстро привыкаешь); привычка, что ответы на текущие и простые вопросы гораздо быстрее получить в режиме онлайн (или как будет минутка ответить), а также увидеть, прочитано или нет и т.п.: Telegram, Whatsapp и др.
Сюда же отнесём сервисы и для видео-конференций с шерингом экрана: Zoom, Skype для бизнеса, Slack, Google Meet (ранее Hangouts Meet) и пр.

Другие инструменты для удалённой и совместной работы (работа в команде без привязки к местоположению участников). Офисные пакеты: Google Таблицы, Google Документы и Google Презентации, Office 365, Quip, Apple iWork.

Менеджеры задач: есть великое множество CRM, также таких трекеров задач как Jiro, LeaderTask, Redmine, Todoist, GitHub и даже pachca.com.

Менеджеры проектов: Microsoft Project, Адванта, Asana, Битрикс24, Basecamp, ProofHub, Podio.
Облачные хранилища: Google Диск, Яндекс.Диск, Dropbox, OneDrive.

Сервисы для заметок: OneNote, Evernote, Notion. Канбандоски: Trello, MeisterTask, Blossom; интерактивные онлайн-доски: например, miro.com.

Редакторы ментальных карт (Ментальной картой называют схематическое изображение процессов или идей, которое упрощает восприятие информации): MindMeister, Mindomo, MindMup, X-mind.

Таймтрекеры (Таймтрекеры помогают следить за тем, сколько времени тратится на те или иные задачи, зачастую автоматически): Timely, Toggl, RescueTime, Harvest. Службы автоматизации: Zapier, Power Automate, IFTTT.

Платформы для массовой коммуникации: Google-формы или рассылки с использованием того же Мailchimp.

У подавляющего большинства этих сервисов есть одна общая черта наша информация хранится не на наших собственных серверах/хранилищах, а где-то ещё. Зато дешево, иногда на уровне бесплатности, а бесплатный сыр тоже как-то надо монетизировать, в коммерческих филантропов верится с трудом. Несмотря на декларируемую доступность 24*7 всё-таки существует зависимость от внешних сервис-провайдеров (ведь этим летом даже Git пару часов был не доступен), ну и доступ к ней с их стороны. Что является сильным останавливающим фактором. Т.е. одно дело провести разовый безобидный опрос через гугл-формы, другое хранить действительно важную информацию в неизвестно каком ЦОД-е. Вопросы ИБ и сохранности данных всегда будут актуальными.

2. Автоматизация/Цифровизация


Если вспомнить про первую часть данной статьи, про секвестры и тому подобное, то главное о чём здесь нужно помнить работников будут сокращать. Соответственно, сразу вспомнят про автоматизацию, т.к. эта штука позволяет освободить множество белых (а иногда и синих) воротничков от работы (или, как говорят HR-ы, освободить их время для прочих задач), данный процесс идет уже не одно десятилетие (скорее даже не одно столетие), последние 20-30 лет процесс автоматизирования был более плавным, нежели внедрение паровых механизмов в Англии из-за которых луддитов в 1812-м пришлось усмирять огнём на поражение со стороны военных (тогда еще и неурожаи наложились и континентальная блокада, устроенная Наполеоном все европейские рынки был потеряны, людей пришлось массово увольнять).

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

В этом сегменте, разумеется, наиболее актуальная тема документооборот, или даже ЕСМ-платформы (кое-что неплохо рассказано тут http://personeltest.ru/aways/habr.com/ru/company/alee/blog/137407/).

ЭДО так же почти везде актуален. Несмотря на все надежды, полностью от бумаги мы повсеместно уйдем еще очень и очень нескоро, поэтому в крупных организациях стоит обратить внимание на решения по оцифровке и обработке бумажных документов (OCR: Optical Character Recognition) и следом/параллельно обычно идет роботизация бизнес-процессов (RPA).

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

Про SAP, 1C здесь не будем, так как это отдельная Галактика для специализированных фирм и специалистов.

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

3. Импортозамещение


До пандемии из всех трех, данный тренд, пожалуй, был наиболее ярко выраженным, а после ушел в тень удаленки. Однако, проблемы в экономике, которые набирают обороты во всём мире, приводят к усилению протекционизма и торговых войн. Можно, разумеется, искать изъяны в отечественных ИТ-решениях, но вопрос наличия национальной ИТ-индустрии это слишком важный вопрос, если не сказать больше, значимость ИТ-индустрии плавно приближается к важности наличия собственной сильной армии. И нужно отметить, что по некоторым направлениям, по большей части это касается ПО в чистом виде, и firmware, в частности, где возможна реализация частных инициатив, за последние 5 лет появились вполне осязаемые достижения.

Что происходит с самых ходовым железом серверами (и, следом, СХД) давайте сделаем августовский снепшот на память:

Даже несмотря на то, что уже 5 лет как товарищ Сноуден бросил все свои дела, и лично приехал к нам в Россию со своей девушкой (в Россию. Со своей девушкой. Ну ведь и правда же уникальнейший человек) рассказать, как же всё на самом деле устроено, мы сказали ему спасибо, вид на жительство выдали, и продолжили закупать любимое, хорошо знакомое железо. Intel (как впрочем и AMD), например, ведь хорошие процессоры делает, про уязвимости/бэкдоры и их потенциальную/реальную опасность тоже все знают. Конечно, для эксплуатации большинства из них нужно уже находиться внутри периметра, но угроза ИБ всё равно есть. Т.е. если Meltdown и Spectre хоть как-то лечатся патчами (и обновлением микрокода процессора), то многие другие никак не лечатся, ещё есть необнаруженные уязвимости. Чтобы не казаться голословным приведем информацию с официальных сайтов: https://developer.amd.com/wp-content/resources/55449_1.16.pdf и https://www.intel.ru/content/dam/www/public/us/en/documents/specification-updates/xeon-scalable-spec-update.pdf, статус поиска/реализации способов лечения немалого кол-ва старых и новых уязвимостей, что у Epyc no fix planned, что у Xeon Scalable No Fix (также можно почитать, например, статью http://personeltest.ru/aways/habr.com/ru/post/427757/).
Российские серверы, актуальный список: https://gisp.gov.ru/pp719/p/pub/products/ в поле наименование (продукции) ввести Сервер (аналогично можно увидеть и СХД/хранения данных). На сегодня (09.09.2020) мы видим 23 реестровых номера серверов (и 12 СХД), а также есть информация о ещё некоторых на пути к внесению в этот список. Про Эльбрусы мы писали еще в 2015 году.

Обзор и сравнительное тестирование ПЭВМ Эльбрус 401 PC. Часть четвёртая бенчмарки
Обзор и сравнительное тестирование ПЭВМ Эльбрус 401 PC. Дополнение вопросы и ответы
Сейчас же на подходе (ожидаем серийно в 2021 году) Эльбрус-16С с 16-ю ядрами, частотой 2.0 ГГц и поддержкой памяти DDR4, многие отечественные производители уже вовсю готовятся предложить годные сервера и СХД на них.

Cisco с Juniper никуда не делись, а Huawei молодец, поймал момент, и, отправив своих партнеров в типографии печатать тысячи наклеек с красивым названием на кириллице, получил взрывной рост продаж. Хотя даже без той поддержки которую оказывало родное государство Huawei есть ряд довольно крупных заказчиков, у которых почти вся сетевая инфраструктура уже построена и успешно работает на отечественных https://www.qtech.ru/ и https://eltex-co.ru/ (мы хорошо знаем про этих, но это далеко не полный список отечественных производителей сетевого оборудования).

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

Про отечественное железо и ПО будет отдельная статья, а кому интересно сейчас для начала, вот познавательная ссылочка https://reestr-minsvyaz.ru/reestr/reestr-po-klassu-operacionnye-sistemy/ (попробуйте ответить на вопрос: а почему же все они зарегистрированы в 2016 году?).

Пробежались галопом по разным дисциплинам, в том числе гуманитарным, на что теперь обратить внимание ИТ-шнику, чтобы

  • и российское,
  • и про автоматизацию,
  • и чтобы к очередному возможному осеннему одомашниванию удаленкой юзеров пригодилось?

Вспомнилась одна из решаемых задач нашего заказчика (одна из крупнейших строительных компаний РФ):

Проблемы заказчика:

1. в ходе проектирования, строительства и обслуживания объектов несколько тысяч сотрудников этой организации всё больше и больше коммуницируют между собою и сотнями подрядчиков через мессенджеры типа WhatsApp, Telegram и т.п. В эти коммуникации входят не только обмен сообщениями, но и переговоры, а также всё больше и больше обмен документами (последний пункт руководство компании посчитало уже совсем неприемлемым).

image

2. Заказчик еще до этого проекта был в курсе, что при помощи чат-ботов можно сильно упростить рутинные процессы внутри компании, начиная с получения справки НДФЛ-2 и заказом пропуска на грузовые машины подрядчиков, заканчивая согласованием договоров.

3. Безопасники, как всегда, хотят всё контролировать, работа у них такая, и сразу же после сертификата ФСТЭК вспоминают про реестр отечественного ПО. Плюс проблема уволившихся сотрудников, которые месяцами (а в некоторых случаях и годами) имеют доступ к конфиденциальной переписке ни к информации, ни к составу участников общих групп в условном WhatsApp у служб заказчика нет, а информация сохраняется на частном смартфоне навсегда.

4. Далее высказались айтишники, вспомнив про то, что удаленка не так далека, как кажется, примерно там же, где и скорые холода + хоть обычный сезонный грипп, а это значит, что нужно чтобы не только на ios/android ставилось, а чтобы и desktop версия была и web-версия, ну чтоб не хуже чем WhatsApp-ы. Ну и разумеется, если речь идет о корпоративных коммуникациях, то рассматриваемая система должна без проблем интегрироваться с AD, exchange и т.п.

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

Что привлекало в этом данном корпоративном мессенджере изначально:

разворачивается на своём (корпоративном) сервере
клиенты как для мобильного (IOS или Android), так и для ПК (Приложение или Web).
интеграция с корпоративными ИС (из коробки только AD, а для остального есть документация BotX, см. следующий пункт)
встроенный чат-бот (а точнее платформа для разработки корпоративных ботов)
таск-менеджер (задачи на человека, разбиваются на подзадачи, дедлайн и т.п.).
разработка продукта на 100% в РФ
сертификат ФСТЭК
прицепом по умолчанию в этом мессенджере есть видеоконференции (сейчас на ПК или Web версиях) и голосовые вызовы.

Расскажем немного про инсталляцию, процесс установки потребовал:

0) Выбрать схему (один сервер или два (Front и Back)).
Схемы сетевого взаимодействия взяли из инструкции администратора.
Вариант один сервер (Single CTS):

image

Вариант два сервера (Front и End):

image

1) Создать ВМ с параметрами, исходя из предполагаемого кол-ва корпоративных пользователей и выбранной схемы одного или двух серверов (см. таблицу 1).
Таблица 1. Требования для одного сервера с хранением данных 1 год:

image

2) Установить на выбор гостевую ОС: RHEL, CentOS, Ubuntu; а на ОС установить: Docker

3) Предоставить FQDN созданного сервера разработчику, в ответ получить файл настроек.
Зачем? Ответ простой: мессенджер доступен не только корпоративным пользователям, им могут пользоваться и обычные пользователи (как у WhatsApp), но их обслуживают уже сервера разработчика. И между различными пользователями также можно общаться. Вот только доступа к корпоративному функционалу у обычных пользователей (скачавших свободно-распространяемую версию) без нашего разрешения не будет совсем.

4) Установить образы контейнеров из репозитория разработчика (здесь снова потребовалось связаться с разработчиком).

5) Настроить сетевое взаимодействие согласно выбранной схеме.

6) Настроить голосовой сервер.

7) Настроить интеграцию с AD. (конечно, можно добавлять корпоративных пользователей и по e-mail, но это выбор для небольших организаций).

8) Установить клиент на телефон мессенджер (android или iOS) и проверить, всё ли работает как задумано (начав с тестовых пользователей). Затем, регистрируя живых пользователей (интеграция уже есть, процесс крайне простой), ещё раз потестить.

9) С ботами из коробки оказалось немного сложнее: с одной стороны, есть дополняемый каталог ботов, а с другой нет 100% готовых корпоративных ботов. Одна из причин: ИС (информационные системы) у всех свои и интеграция с ними требует участия программиста, которые, кстати есть у того же разработчика. Хотя запилить простенького бота можно и самостоятельно, но нужно обладать минимальной квалификацией (соответствующая документация на BotX предоставлена разработчиком по первому требованию).

Проверим насколько корпоративный мессенджер Экспресс отечественный официально:
https://reestr.minsvyaz.ru/reestr/?sort_by=date&sort=asc&sort_by=date&sort=asc&name=Express&owner_status=&owner_name=&show_count=100&name=Express&owner_status=&owner_name=&set_filter=Y
Есть соответствие, под номером 5745 находим: Система коммуникаций Express.

Что еще интересного есть в архитектуре мессенджера Express:
Федеративная структура. Построенная федерация позволяет совершать защищённую и безопасную коммуникацию между серверами и сотрудниками разных компаний.

image

Фишки: Взаимную видимость контактов можно настроить не только в обе стороны, но и только в одну сторону;
Какие данные видны, также гибко настраивается (по сути какие поля из AD видны);
В том числе поэтому для топ-менеджмента обычно вводится свой сервер CTS со своими настройками (не только режим супервизора выключен, но и виден другой список полей AD, например, номер телефона точно не виден);
После настройки доверенного соединения между двумя CTS серверами дружественных организаций, по сути, трафик между пользователями этих дружественных корпоративных серверов не будет идти через паблик (RTS).
Причем, разработчики сделали красивую фичу с наглядным и интерактивным представлением состава участников группы с межсерверными связями (скрин примера ниже)
image
Выделим плюсы корпоративного мессенджера Express:
Снижение рисков утечек информации (ключевой, жирный плюс) при довольно небольшой стоимости (небольшие требования) и бОльший контроль;
Снижения рисков потери информации (при корректно налаженной отказоустойчивости/катастрофоустойчивости);
Защита персональных данных (тройное шифрование, в тоже время невозможность восстановить данные при утрате паролей от ключей шифрования);
Также проявлена забота и о приватности, например есть т.н. Стелс-режим для деликатных переговоров. По таймеру все сообщения сгорают (по времени, после отправки, либо после прочтения).
Объединенный список контактов: контакты телефона, коллеги (поиск по корпоративному каталогу) и бизнес-партнёры (поиск на доверенных серверах).
Минимальное время на адаптацию. Стандартный набор для мессенджера, а именно: сообщения, файлы, звонки, конференции.
Корпоративные чаты и каналы вместо рассылок по почте (можно включить видимость сообщений, опубликованных до присоединения пользователя к каналу).
Определенное управление контентом и пользователями; Аудит событий ИБ и в том числе, при необходимости: статистика по активностям пользователей и режим супервайзера (контроль переписки). А для руководства можно поднять ещё один сервер без контроля (т.е. для всех остальных сотрудников с контролем, ну или тоже без, решайте сами). При выключенном режиме супервайзера даже после его включения (режима) нет возможности проконтролировать более раннюю переписку.
Стоимость корпоративного мессенджера Express на наш взгляд вполне гуманна, а с ростом стоимости доллара и евро будет становиться всё гуманнее и гуманнее, а за работающий продукт всегда лучше заплатить российскому производителю, ведь в итоге это зарплата твоего сокурсника, соседа по району или стране.
Полное исключение страновых и значительное снижение политических рисков
image
(уже стала забываться эпопея с телеграмом, но лучше подержать её в памяти).

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

Кому будет интересно по ссылке на наш сайт можно найти семь примечаний про мессенджер Express из серии чтобы другим поменьше ходить по граблям.
Подробнее..

Как роботизировать техподдержку с помощью машинного обучения

06.10.2020 10:05:04 | Автор: admin

Служба техподдержки в крупной компании обычно обслуживает целый зоопарк сервисов, например: пару виртуальных АТС, онлайн-магазин, умный дом и охранную систему в придачу. У ребят всегда есть работа тысячи звонков с сотнями проблем от подключения новых телефонных номеров, до отвалившихся IP-камер.

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

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

Тысячи проблем и как их решить

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

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

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

Затем нужно интегрировать бота с helpdesk и корпоративными сервисами и надеяться, что все это будет хорошо работать.

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

Без обучения ты просто бесполезен!Без обучения ты просто бесполезен!

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

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

UI и почему это не главное

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

С виду AutoFAQ напоминает стандартный helpdesk со списком тикетов, разделением по тематикам вопросов, очередями и окном чата. Из этого же интерфейса доступна история переписки, дашборды, отчетность.

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

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

Возможности чат-бота

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

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

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

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

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

Через подключенные интеграции он идентифицирует пользователя и проверяет подключение к камере.

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

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

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

Сценарии и интеграции

C помощью AutoFAQ можно автоматизировать многоступенчатые сценарии решения проблем.

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

Сценарии могут взаимодействовать с REST и SOAP сервисами. Через них можно формировать SQL запросы. Из коробки поддерживаются MS SQL Server, PostrgreSQL, MySQL и MariaDB. Чтобы реализовать сложную логику, в сценарии можно встроить произвольный JavaScript-код.

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

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

Чат-бот и операторы

Конечно, наш бот не идеален и порой не понимает клиентов. Если он не уверен в ответе, и никакие уточняющие вопросы не помогают, система переводит запрос на оператора.

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

Чтобы в дело вступил бот, нужно кликнуть на подсказкуЧтобы в дело вступил бот, нужно кликнуть на подсказку

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

Под капотом

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

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

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

Это позволяет запускать AutoFAQ в работу с минимальной подготовкой и сразу получать хорошее понимание вопросов. Благодаря предобученной сетке бот понимает вопросы, сформулированные совершенно иначе, чем в примерах. Поэтому он нетребователен к объему и качеству обучающей выборки.

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

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

Обучение на практике

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

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

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

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

Ответ оператора попадает в реестр рекомендаций. Затем администратор системы просматривает реестр, отбирает и группирует удачные рекомендации и нажатием одной кнопки вносит их в базу знаний.

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

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

Как только AutoFAQ накапливает достаточный объем данных, предобученный алгоритм отключается, пайплайн перестраивается, и в дело вступают модели, использующие обучение с учителем. Мы заранее не знаем, какой метод будет лучше справляться с данными клиента, поэтому встроили в AutoFAQ сразу несколько алгоритмов: от простых TF-IDF, до BERT и LASER.

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

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

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

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

Запуск AutoFAQ

Мы разбили AutoFAQ на микросервисы и упаковали в докер. Система не требует подключения к сторонним сервисам и работает в изолированной среде. Все ее компоненты дублируются. Они либо работают параллельно, либо запускаются по мере надобности.

Мы рассматривали Kubernetes, но оказалось, что для оркестрации нам хватает Docker Compose. Он упрощает процесс развертывания и не требует kubernetes-кластера.

В результате

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

Чем больше обращений поступает в службу поддержки, тем лучше система их понимает и тем больше задач берет на себя. За 12 месяца AutoFAQ наполняет базу знаний, и автоматизация запускается в полную силу. Как правило, AutoFAQ решает порядка 45% обращений без помощи людей.

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

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

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

P.S. Если у вас остались вопросы по AutoFAQ, оставляйте их в комментариях или пишите на почту: EMelkova@croc.ru.

Подробнее..

Ускоряем разработку с помощью сервисов Azure создаем чат-боты и когнитивные службы средствами платформы

29.06.2020 12:20:00 | Автор: admin
Привет, Хабр! Сегодня мы расскажем, как решать с помощью Azure задачи, которые обычно требуют человеческого участия. Операторы тратят много времени, чтобы отвечать на одни и те же вопросы, обрабатывать телефонные звонки и текстовые сообщения. Чат-боты автоматизируют общение и распознавание и позволяют снизить нагрузку на людей. Также боты используются в Azure DevOps, где позволяют, например, утверждать релизы, управлять сборками просматривать, запускать и останавливать прямо из Slack или Microsoft Teams. По сути, чат-бот в чем-то напоминает CLI, только интерактивный, и позволяет разработчику не выходить из контекста обсуждения в чате.

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



Чат-боты и когнитивные сервисы: чем похожи и в чем различие


Для создания ботов в Microsoft Azure используются служба Azure Bot и платформа Bot Framework. Вместе они представляют собой набор ПО для сборки, тестирования, развертывания и администрирования ботов, который позволяет создавать из готовых модулей как простые, так и продвинутые системы общения с поддержкой речи, распознаванием естественного языка и другими возможностями.

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

  1. Сервисы быстрой разработки диалоговых интерфейсов (ботов).
  2. Готовые когнитивные сервисы ИИ под разные сценарии использования (распознавание образов, речи, база знаний и поиск).
  3. Сервисы создания и обучения моделей ИИ.

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



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

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

Создание чат-ботов


Рекомендуемая схема проектирования бота в Azure выглядит следующим образом:



Для проектирования и разработки ботов в Azure используется Bot Framework. На GitHub есть примеры ботов, возможности фреймворка меняются, поэтому необходимо учитывать версию SDK, которая используется в ботах.

Фреймворк подразумевает несколько вариантов создания ботов: с помощью классического кода, инструментов командной строки или блок-схем. Последний вариант визуализирует диалоги, для этого можно использовать менеджер Bot Framework Composer. Он создавался на базе Bot Framework SDK как наглядный инструмент разработки, который междисциплинарные команды могли бы использовать для создания ботов.



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

В Bot Framework Composer можно создать сложно разветвленную систему диалогов, используя Adaptive Dialogs. Диалоги могут использовать как когнитивные сервисы, так и карточки событий (Adaptive Cards):



После создания можно развернуть чат-бота в подписке, причем автоматически подготовленный скрипт создаст все необходимые ресурсы: когнитивные сервисы, Application plan, Application Insights, базу данных и так далее.

QnA Maker


Для создания простых ботов на основе корпоративных БД вопросов и ответов можно использовать когнитивный сервис QnA Maker. Реализованный в виде простого веб-визарда, он позволяет подать на вход ссылку на корпоративную базу знаний (FAQ Urls) или взять за основу базу документов в формате *.doc или *.pdf. После создания индекса бот будет сам подбирать наиболее подходящие ответы на вопросы пользователя.

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

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

Работа с другими когнитивными сервисами


На платформе Azure много разных когнитивных сервисов. Технически это самостоятельные веб-сервисы, которые можно вызывать из кода. В ответ сервис присылает json определенного формата, который можно использовать в чат-боте.


Чаще всего в чат-ботах могут использоваться следующие:

  1. Распознавание текста.
  2. Распознавание определяемых разработчиком категорий образов Custom Vision Service (производственный кейс: распознавание, надел ли сотрудник каску, защитные очки или маску).
  3. Распознавание лиц (отличный кейс использования проверка, свое ли лицо разместил анкетируемый, или, скажем, фото собачки или фото человека другого пола).
  4. Распознавание речи.
  5. Анализ изображений.
  6. Перевод (все мы помним, сколько шума наделал синхронный перевод в Skype).
  7. Проверка орфографии и предложения по исправлению ошибок.

LUIS


Также для создания ботов может потребоваться LUIS (Language Understanding Intelligent Service). Задачи сервиса:
  • Определять, имеет ли смысл высказывание пользователя и необходима ли реакция бота.
  • Сокращать усилия по транскрипции речи (текста) пользователя в понятные боту команды.
  • Прогнозировать истинные пользовательские цели/намерения и извлекать ключевые сведения из фраз в диалоге.
  • Дать возможность разработчику осуществлять запуск бота с использованием всего нескольких примеров распознавания смысла и последующим дообучением бота в процессе работы.
  • Дать возможность разработчику использовать визуализацию для оценки качества транскрипции команд.
  • Помочь в поэтапных улучшениях распознавания истинных целей.

По сути, главная цель LUIS с определенной вероятностью понять, что имел в виду пользователь и конвертировать естественный запрос в стройную команду. Для распознавания значений запросов LUIS использует набор интентов (смыслов, намерений) и сущностей (либо предварительно настроенных разработчиками, либо взятых и заранее сформированных доменов некоторых готовых библиотек типовых фраз, подготовленных Microsoft).

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

Интент Сущность Пример естественного запроса
CheckWeather {type: location, entity: moscow}
{type: builtin.datetimeV2.date, entity: future ," resolution ":" 2020-05-30 "}
Какая погода будет завтра в Москве
CheckWeather { type: date_range, entity: this weekend } Покажи мне прогноз для этих выходных


Для сочетания QnA Maker и LUIS можно использовать Dispatcher.



Когда вы работаете с QnA Maker и получаете запрос от пользователя, то система определяет, с каким процентом вероятности ответ из QnA подходит для запроса. Если вероятность высокая, пользователю просто выдается ответ из корпоративной базы знаний, если низкая запрос может быть отправлен в LUIS для уточнения. Использование Dispatcher позволяет не программировать эту логику, а автоматически определять эту грань разделения запросов и оперативно их распределять.

Тестирование и публикация бота


Для тестирования используется еще одно локальное приложение, Bot framework emulator. С помощью эмулятора можно общаться с ботом и проверять сообщения, которые он отправляет и получает. Эмулятор отображает сообщения так, как они будут выглядеть в интерфейсе веб-чата, и регистрирует запросы и ответы JSON при обмене сообщениями с ботом.

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


https://youtu.be/u7Gql-ClcVA?t=564

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

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

Также для создания полноценного чат-бота в качестве интерфейса общения с пользователем и когнитивными сервисами вам, конечно, понадобятся дополнительные сервисы Azure, такие как базы данных, serverless (Azure Functions), а также сервисы LogicApp и, возможно, Event Grid.



Оценка и аналитика


Для оценки взаимодействия с пользователями можно использовать как встроенную аналитику Azure Bot Service, так и специальный сервис Application Insights.

В результате можно собирать информацию по следующим критериям:

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

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

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



Всем спасибо за внимание! В этой статье мы использовали материал из вебинара архитектора Microsoft Azure, Анна Фенюшиной Когда люди не успевают. Как на 100% использовать чат-боты и когнитивные сервисы для автоматизации рутинных процессов, на котором мы наглядно показывали, что такое чат-боты в Azure и каковы сценарии их применения, а также демонстрировали, как за 15 минут создать бота в QnA Maker и как расшифровывается структура запросов в LUIS.

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

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru