В этой статье я хочу познакомить с новой библиотекой 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> );}
Визуальный пример, чтобы увидеть как будет работать код.
Если вы почувствовали концепцию, то уже поняли, что можно создавать десятки, сотни компонентов, комбинировать их вместе, либо разделять роутером, делиться компонентами между разными чат-ботами и строить действительно сложные 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>);
С помощью 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 (но не очень хочется много читать) вот ссылка, милости прошу: 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
они тоже
туда попадут.
С технической стороны, конечно, тут всё просто: я использую веб-сокеты чтобы проталкивать все обновления на клиент, если у вас открыта соответствующая вкладка (если открытых страниц нет, лишней нагрузки это создавать не должно). Возможно, если бы я начинал этот проект сейчас, я бы попробовал использовать Server-sent events вместо веб-сокетов, но вряд ли есть какой-то повод переходить на них.
Кроме бесконечного лога, куда все события сыпятся вперемешку, Botsman ещё умеет показывать интерфейс, похожий на обычный список диалогов в самом мессенджере то, как их видит ваш бот. При желании можно даже никак не обрабатывать запросы, а просто вручную открывать диалоги и отвечать от имени бота (этакий режим техподдержки возможно, впоследствии я добавлю поддержку управления ботами с нескольких аккаунтов с разными ролями, если это действительно будет актуально).
Ну и конечно же, статистика и графики, куда без них. Честно говоря, аналитик из меня так себе, поэтому сейчас Botsman показывает только довольно базовые метрики общее число апдейтов, число чатов, число пользователей, дневную и месячную аудиторию (DAU и MAU). Графики по числу апдейтов на каждый день/час, и по среднему времени обработки запросов. Было бы, конечно, интересно смотреть на всякую демографию, но в Telegram в этом плане мало информации о пользователях.
Графики в разделе Stats. Как видно, через одного из моих ботов уже прошло почти 20 млн апдейтов.Для подсчёта статистики я с самого начала выбрал старый добрый Redis, а вот на клиентской стороне решил рисовать графики с помощью библиотеки, которую до этого сам же написал на конкурс того же Телеграма. Не пропадать же добру :)
Но вернёмся к тому, как вообще оживить вашего бота. Просто проксировать запросы к другому серверу скучно (да и от дополнительного звена всё-таки лучше избавиться). Мне хотелось дать возможность прямо внутри сервиса описать логику работы бота. Знаю, что существует множество конструкторов ботов для этого (хотя я и старался всё делать без оглядки на них), но мне хотелось возможности писать полноценный код прямо в браузере.
При этом мне не очень хотелось прибегать к компилируемым в нативный код языкам: это производительно, но тогда пришлось бы строить сложную систему, оборачивая код каждого бота в контейнер и держать их все непрерывно запущенными.
Поэтому я выбрал JavaScript: моя изначальная идея была взять встроенную в Node песочницу, немного доработать (как это сделано в библиотеках Sandcastle или vm2), чтобы сделать её безопаснее, и выполнять код ботов в ней.
Но в процессе очередного подхода к допиливанию проекта пришло осознание, что даже с доработками такой подход неидеален: код в таком случае выполнялся бы все равно в одном общем потоке и при росте нагрузке неизбежно привёл бы к тормозам. Да и риск проблем с изолированностью исполняемого кода всё-таки сохраняется.
В итоге я обратил внимание на библиотеку isolated-vm: она тоже реализует песочницу в JS, но делает это другим, более безопасным (и, что важно, многопоточным) образом. По сути это обёртка над присутствующим в V8 механизмом изолятов независимых контекстов, которые ничего не знают друг про друга. Эта же библиотека, кстати, используется в игре Screeps, где игрокам тоже нужно писать своих ботов.
Что особенно хорошо для ботов: состояние одного такого изолята можно держать в памяти как кусок данных (не расходуя процессорное время), и только когда боту понадобится обработать прилетевший апдейт от Телеграма оживлять это состояние, вызывая в нём функцию-обработчик. И конечно можно ограничить как потребляемую память, так и процессорное время (с этим, помнится, в нодовской песочнице были некоторые сложности).
Дальше одним из камней преткновения было дать удобное внутреннее 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'
). Пока что, впрочем,
иерархическая структура состояний особых преимуществ по сравнению с
линейной не имеет (но может помочь их логически упорядочить).
Отдельно поделюсь одной, казалось бы, незначительной, но весьма радующей лично меня деталью. Если вы уже пробовали использовать 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 самой
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 нет разбивки кода на отдельные файлы в этом тоже может быть неудобство, если вы собираетесь писать сложного бота. Зато код сохраняется автоматически, и есть возможность хранить все его предыдущие версии это ещё не Git, но всё же.
И ещё одна небольшая, но довольно ценная возможность: проверка кода перед деплоем с помощью тестов. При этом Botsman по нажатию одной кнопки сразу покажет подробный лог выполнения (см. скриншот выше): время инициализации, обработки запроса, отладочный вывод и возникшие ошибки (код с синтаксическими ошибками задеплоить не выйдет в принципе).
Ну и последняя небольшая, но довольно полезная фича Botsman, о которой хотелось бы рассказать панель для формирования запросов к Telegram. Нередко социальные сети предоставляют собственный инструмент для этого, но у Телеграма его, к сожалению, нет. Поэтому я сделал страницу, где можно выбрать нужный метод API, заполнить его параметры и наглядно увидеть результат вызова. Заодно можно сразу скопировать эквивалентный код, делающий этот запрос.
Панель вызова методов Telegram APIКак было сказано ранее, Botsman находится в самом начале своего пути. Возможно, его даже настигнет Хабраэффект (надеюсь, что нет!). Возможно, ему станет тяжко, если созданные на нём боты наберут популярность не исключено, что тогда придётся вводить платные возможности. Поскольку занимаюсь им я сейчас в одиночку, сложно сказать, что с ним будет.
В очень примерных планах сейчас такие фичи:
Визуальный конструктор в дополнение к скриптингу
Глобальное key-value хранилище + создание собственных хранилищ
Поддержка других платформ, кроме Telegram
Доступный снаружи эндпоинт для вызова кода бота
Управление ботом с нескольких аккаунтов
Навигация по коду, разбивка на модули, поддержка сторонних модулей
Более гибкое тестирование кода, автоматические тесты
Больше статистики и графиков
Оповещения (если с ботом что-то не так)
Улучшение вида чатов
Улучшение работы с файлами (скачивание, загрузка), в том числе в песочнице
В любом случае, надеюсь, что из этого сервиса выйдет что-то хорошее! Буду рад услышать ваши мысли, пожелания и соображения в комментариях.
Часть 2: Роботизация бизнес-процессов
Часть 3: Волшебные интерфейсы и оживление железа
Часть 4: Автоматические личные кабинеты и чат-боты (в этой публикации)
На следующем слайде сразу показываю единую систему, охватывающую полный контур работы с заказами - от создания клиентами, до отгрузки на заводе и доставки на пункт разгрузки.
Автоматическая система управления заказами - от создания заказов клиентов, до отгрузки на заводе и доставкиКомплекс систем автоматически работает 24/7 в режиме real-time и полностью реализован за 1,5 года. Хабом является корпоративная ERP-система.
Клиенты оформляют заказы в личном кабинете клиента.
Заказы из личного кабинета автоматически попадают в ERP-систему.
По заказам клиентов в ERP автоматически формируются задания на перевозку.
Задания на перевозку в ERP автоматически распределяются между перевозчиками.
Заявки на перевозку из ERP автоматически попадают в личный кабинет перевозчика.
Перевозчики автоматически из ERP получают уведомления в чат-боте Telegram или по SMS о новых заявках в личном кабинете.
Перевозчики берут заявки в работу в личном кабинете и назначают водителей для выполнения доставки.
Водители автоматически из ERP получают уведомления в чат-боте Telegram о новых заявках.
Водители приезжают на завод и регистрируют прибытие в чат-боте Telegram или на уличном терминале, и автоматически встают в электронную очередь на погрузку в ERP - подробнее в третьей части.
Водители автоматически вызываются из электронной очереди на погрузку в чат-боте Telegram или по SMS, и на LED-табло - подробнее в третьей части.
Продукция отгружается на заводе, машины покидают территорию завода и выполняют доставку клиенту.
Клиенты автоматически из ERP получают серию уведомлений в личном кабинете, чат-боте Telegram или по SMS об изменении статуса доставки продукции.
Важно! Участие в этом процессе менеджеров по продажам, менеджеров по логистике и других сотрудников компании сведено к минимуму, и требуется только при нештатных ситуациях или сценариях, где нужно получить предварительное согласование.
А теперь подробнее о том, что для этого было
сделано...
Напомню, что завод отгружает ~ 2 млн. тонн продукции в год, из них ~ 50% составляют отгрузки грузовым автотранспортом, что составляет ~ 40 000 рейсов в год.
В третьей части я уже рассказывал о процессе отгрузки продукции на заводе, электронную очередь для грузового автотранспорта, уличный терминал и чат-бот для водителей в Telegram.
Продукция доставляется клиентам с доставкой или на самовывозе. На завода нет своего грузового автотранспорта, поэтому на доставке задействованы только компании-перевозчики со своими водителями и автопарком.
Контур системы управления зданиями на перевозку включает 4 подсистемы:
ERP-система (формирование заявок и распределение между перевозчиками).
Личный кабинет перевозчика на сайте (получение заявок по квотам, ежедневные торги, отчеты о выполненных рейсах, объяснительные по опозданиям).
Чат-бот для перевозчиков в Telegram (мгновенные уведомления о новых заявках, торгах и опозданиях водителей).
Чат-бот для водителей в Telegram (мгновенные уведомления о новых заявках, опозданиях на погрузку и регистрация прибытия на завод), подробнее в третьей части.
В основе алгоритма автоматического распределения заявок между перевозчиками 3 базовых критерия:
Квота перевозчика (отношение количества транспортных средств перевозчика к общему количеству транспортных средств всех перевозчиков).
Чем больше автопарк перевозчика, тем выше его базовая квота при распределении.
Рейтинг перевозчика (выполнение заявок и отказы от выполнения за последние 30 дней).
Каждой заявке в ERP автоматически присваивается количество баллов от +1 до +4 (срочные заявки и заявки в дальние регионы получают максимальный балл). При отказе перевозчика от заявки баллы автоматически снимаются от -1 до -4. Рейтинг перевозчика это сумма баллов за последние 30 дней пропорционально количеству транспортных средств.
Общая загрузка перевозчика (процент загрузки транспортных средств перевозчика за последние 30 дней).
Общий процент загрузки заявками перевозчика за последние 30 дней по отношению у другим перевозчикам за тот же период.
Есть и другие индивидуальные критерии, но они являются узконаправленными.
Например: предопределенные грузополучатели перевозчика или бизнес-регионы, в которые перевозчик не осуществляет доставку.
Ежедневно по расписанию 3 раза в день, по заказам клиентов, роботом в ERP автоматически формируются задания на перевозку: 2 раза в день (утром и вечером) задания автоматически распределяются между перевозчиками, 1 раз днем задания попадают на торги.
Личный кабинет представляет собой пользовательский интерфейс и не хранит в себе данные. Обмен с ERP-системой выполняется через веб-сервис, API реализовано на стороне ERP.
Лайфхак: Правило оформления левого верхнего угла сайта личного кабинетаВ левом верхнем углу сайта выводите название профиля личного кабинета. Тогда при просмотре сеансов вебвизора вы будете однозначно понимать, кто именно работает с личным кабинетом - как в десктопной так и мобильной версии.
Название профиля пользователя личного кабинета всегда видно при просмотре сеансов в вебвизореЛогика интерфейса личного кабинета перевозчика реализована таким образом, чтобы исключить ошибочные действия пользователей. В моменте перевозчику доступно выполнение только тех действий, которые допустимы при текущем состоянии задания на перевозку.
Лайфхак: Используйте числовую индикацию пунктов главного менюИндикация с отображением количества значимых данных позволяет пользователям быстро ориентироваться на сайте и не делать лишних переходов между страницами.
Пример: когда в Моих заявках индикатор (0), значит у перевозчика нет новых заявок, которые он может или должен взять в работу.
Сайт личного кабинета перевозчика полностью адаптивен для работы на смартфонах и планшетах (сейчас это 50% пользователей).
Примеры других страниц личного кабинета перевозчикаОбщая логика работы перевозчиков с заявками в личном кабинете:
Мои заявки
Это заявки перевозчика по квоте, которые он получил после автоматического распределения в ERP. Чтобы взять в работу или отказаться у перевозчика есть 30 минут, после чего они автоматически становятся общими. Если перевозчик не взял в работу хоть одну заявку или отказался хотя бы от одной заявки, ему до конца дня автоматически устанавливается запрет на взятие других заявок. Это мотивирует перевозчика брать все распределенные ему заявки, а не только "хорошие".
Общие заявки
Это срочные заявки или заявки, от которых отказались другие перевозчики. Эти заявки видят все перевозчики - кто первый взял в работу, тот и получает заявку. Это возможность для перевозчиков получить больше заявок, чем распределение по квоте.
Заявки на торгах
Один раз в день заявки попадают на торги. У перевозчиков есть 30 минут, чтобы сделать свои ставки. Один перевозчик может сделать только одну ставку по одной заявке. Перевозчики не видят ставки по заявкам других перевозчиков. Это мотивирует перевозчика давать минимальную ставку, чтобы гарантированно получить заявку.
Все ставки перевозчиков по заявкам автоматически поступают в ERP. Через 30 минут после начала торгов робот в ERP определяет наилучшие ставки и распределяет заявки с торгов на перевозчиков по тем ставкам, которые они сделали в личном кабинете. Это дает существенную экономию по тарифам на доставку - до 20%.
Торги по заявкам среди перевозчиков помогают нам оптимизировать тарифы на доставку. Мы видим предложения перевозчиков и количество ставок по конкретным регионам и зонам доставки, после чего точечно снижаем стандартные тарифы на доставку.
Бывают ситуации, когда перевозчики торгуются сами с собой, потому что не видит ставки других перевозчиков. И даже не знают, делал кто-то кроме него ставки или нет.
В данном случае перевозчик мог снизить тариф всего на 1 рубль и гарантированно получить заявку с торгов, так как кроме него больше никто ставок не делал. Но делая "слепую" ставку перевозчик снижает тариф на 138 рублей (11,15%).
Перевозчик торговался сам с собой, так как не видит ставки других перевозчиков для этой заявкиО чат-боте в Telegram для водителей я уже рассказывал в третье части. У него есть командный интерфейс для быстрой регистрации прибытия на погрузку и в нем водители получают мгновенные уведомления о новых или отмененных заявках.
Чат-бот в 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-системыСопоставление пользователей чат-ботов в Telegram с контактными лицами перевозчиков или водителями в ERP выполняется автоматически по номеру мобильного телефона. Когда пользователь Telegram не найден в ERP, ответственный сотрудник получает мгновенное служебное уведомление в чат-боте и может подключиться для решения проблемы.
Автоматическая регистрация нового пользователя в чат-боте TelegramНовый водитель нажал в чат-боте команду СТАРТ и получил мгновенный ответ.
Водитель написал в чат-боте номер своего телефона и получил мгновенное приветствие.
Водитель нажал в чат-боте команду Я - ПРИБЛ НА ПОГРУЗКУ и получил мгновенный ответ.
Сотрудники линии тех.поддержки работают в режиме 8/5. При работе систем и сервисов в режиме 24/7 мы обнаружили, что веб-сервисы могут молча "отвалиться", а на стороне сервера этого не видно. Чтобы оперативно узнавать об этом, мы разместили на нашем основном сайте небольшой скрипт, который каждые 5 минут опрашивает состояние веб-сервисов.
В случает отрицательного ответа, автоматически уведомляет по email и в Telegram нескольких сотрудников тех.поддержки. Это позволяет оперативно диагностировать и решать возникающие проблемы, и принимать меры для повышения общей отказоустойчивости.
Пример служебного уведомления сотрудникам тех.поддержки о том, что веб-сервис недоступенВ нашей компании всего 6 менеджеров по продажам. 3 менеджера обеспечивают 80% продаж, что составляет ~ 1,6 млн. тонн продукции в год.
КАК БЛО (ручной процесс):
Клиент >отправка заявки по email> Менеджер по продажам >создание заказа по заявке> ERP-система >согласование доставки по заказу> Менеджер по логистике >отправка заявки на доставку по email> Перевозчик >передача информации по телефону> Водитель
Большое количество участников процесса внутри компании. Большое количество коммуникаций между всеми участниками процесса (по телефону, по email, в мессенджерах, лично).
В результате: замедленные бизнес-процессы, большой человеческий фактор и ошибки, потеря информации, обратная связь затруднена или отсутствует, авральный и хаотичный режим работы на заводе, срывы поставок, недовольные клиенты.
КАК СТАЛО (автоматический процесс):
Личный кабинет клиента >заказ клиента> ERP-система >заявка на доставку> Личный кабинет перевозчика >заявка на рейс> Личный кабинет водителя
Участие сотрудников компании сведено к минимуму (только при нештатных ситуациях). Коммуникации между всеми участниками процесса выполняет ERP-система (задачи, уведомления, обратная связь).
В результате: максимально исключен человеческий фактор и ошибки, системный характер работы на заводе, поставки вовремя, довольные клиенты.
Дальше подробнее о том, как реализован личный кабинет
клиента...
Личный кабинет разработан на платформе "1С-Битрикс". Интеграция с 1С реализована через встроенный в ERP стандартный модуль, который прилично доработан. Автоматический обмен реализован через веб-сервис в режиме real-time. Сайт полностью адаптивен для работы на смартфонах, сейчас это 20% пользователей.
Личный кабинет клиента - главная страницаНа главной странице показана основная информация - актуальное состояние расчетов по договорам (обновление расчетов каждые 15 минут по данным ERP) и список активных заказов (заказы в работе, которые не завершены и не отменены). Кнопки создания заказа и запроса счета на оплату сделаны плавающими и доступны на всех страницах.
Личный опыт: Удобный пользовательский интерфейс на первом местеИнтерфейс должен быть одновременно компактным, удобным и функциональным. Чтобы любую информацию пользователь мог получить за 3 клика.
Что для этого сделано:
Подробный вид (1 клик) карточек договоров и заказов в списках, без открытия формы.
Замена выпадающих списков (2 клика) на радио-кнопки (1 клик).
Замена выпадающих списков (2 клика) на чек-боксы (1 клик), когда доступен выбор нескольких значений.
Автоматический выбор единственного значения радио-кнопки в формах (0 кликов).
Функционал повтора заказов (1 клик) для создания аналогичного по существующему.
Пошаговое заполнение заказов для исключения лишних и недоступных действий (кликов).
Многократное самостоятельное тестирование всех экранных форм на удобство.
Цветные статусы, прогресс выполнения заказа, дата и время текущего статуса также помогают пользователям быстро ориентироваться на сайте.
У каждого статуса заказа свой цвет, текущий статус с датой и временем, общий прогресс выполненияЦветные статусы и общий прогресс выполнения заказов в спискахВ личном кабинете реализована система уведомлений по заказам. Краткий текст уведомления показывается в списках и карточках заказов. Видно, что заказ не принят из-за нехватки денег.
Краткое уведомление о проблеме по заказу прямо в списке (не достаточно денег)Полный текст уведомлений отображаются в центре нотификации (колокольчик). Подробно видно расшифровку причины, почему заказ не принят.
Полное уведомление о проблеме по заказу в центре нотификации (сколько не хватает денег)Пример других страниц сайта личного кабинетаВ личном кабинете клиента реализовано моментальное получение счетов на оплату по email (без участия наших менеджеров по продажам). Ключевая особенность, что счет может быть отправлен на несколько email одновременно.
Клиент запрашивает счет в личном кабинете и получает в почте через 3-5 секунд (именно столько времени требуется для автоматического формирования счета в ERP и его отправки роботом из ERP на email контактного лица).
При запросе счета на оплату можно выбрать контактное лицо, которому он придет на emailСчет на оплату автоматически сгенерирован в ERP и сразу отправляются на email контактного лица в формате PDF (на фирменном бланке и с факсимиле).
Счет на оплату, отправленный роботом из ERP на email контактного лица по запросу из личного кабинетаДля уведомлений клиентов о статусе мы используем Email-робота и SMS-робота (подробнее в первой части), чат-бот в Telegram.
О чат-ботах подробнее написано выше, здесь только покажу скриншот смартфона клиента с примером уведомлений. В этот чат-бот мы также отправляем ежедневные отчеты по данным ERP (о состоянии взаиморасчетов или реестры отгрузок).
Пример уведомлений клиентов в чат-боте TelegramМобильность в работе менеджеров и руководителей коммерческой дирекции - это важная составляющая хороших продаж. Менеджеры по продажам часто в командировках, а менеджеры бэк-офиса остаются на первой линии для приема звонков и заявок от новых клиентов. Поэтому важно обеспечить оперативную обработку всех обращений, чтобы не потерять потенциальных клиентов.
Бэк-офис регистрирует новые интересы в CRM-системе (подробнее в первой части), а робот в ERP мгновенно уведомляет менеджеров в чат-боте Telegram.
Скриншот смартфона менеджера по продажам с уведомлениями о заявках от потенциальных клиентовВторой сценарий для этого чат-бота - согласование технических кредитов руководителями коммерческой дирекции для открытия отгрузок при недостаточных денежных средствах на расчетном счете клиента (например, клиент предоставил гарантийное письмо или копию платежки со списанием денежных средств, которые до нас еще не дошли по данным ERP).
Менеджер по продажам или менеджер бэк-офиса может запросить согласование технического кредита в ERP по различным параметрам:
С лимитом по сумме
С лимитом по тоннажу
С лимитом по количеству машин
С лимитом по количеству вагонов
На увеличение ранее согласованного тех.кредита (по сумме, тоннажу, машинам или вагонам)
Руководители двух коммерческих дирекций получают мгновенные уведомления в чат-боте Telegram на согласование тех.кредитов.
Уведомление руководителю в чат-бот Telegram на согласование тех.кредитаРуководитель может инициировать согласование тех.кредита для клиента командой НАЧАТЬ СОГЛАСОВАНИЕ, ознакомившись с информацией - СОГЛАСОВАТЬ или НЕ СОГЛАСОВАТЬ.
Результат согласования мгновенно получает уведомление в чат-боте Telegram ответственный за работу с клиентом менеджер по продажам. Заказы клиентов в ERP автоматически проводятся в рамках согласованных лимитов тех.кредитов, начиная с первого не проведенного по времени создания заказа.
Уведомление менеджера в чат-боте Telegram о результате согласования тех.кредита руководителемТехнически, бизнес-процесс согласования тех.кредитов выполняется в ERP, где автоматически создаются задачи для сотрудников и руководителей. Чат-бот в Telegram служит интерфейсом для пользователей. При выполнении согласований в чат-боте, задачи в ERP автоматически завершаются.
Все эти инструменты упрощают работу сотрудникам и руководителям, уменьшают количество "лишних" коммуникаций, высвобождают время на решение стратегических задач, и существенно ускоряют бизнес-процессы в компании.
Мы также реализовали новую систему отгрузки паллет со склада под кодовым названием "TESLA". Напишите в комментариях, если вам интересно узнать об этом подробнее.
Тизер для будущей публикации о новой системе для кабины автопогрузчикаСпасибо, что дочитали до конца!
Здравствуйте, коллеги!
Новый год подкрадывается всё ближе, а это значит, что нам снова пора собраться вместе для того чтобы хорошо провести время!
Для тех кто еще не знаком с новогодним хабрачатом, расскажу немного про него. Это несколько чатов на разных платформах, объединенных мостом. Боты в каждой из платформ пересылают сообщения из остальных и получается, что все как-бы находятся в одном чате, при этом не покидаю любимой платформы. В этом чате мы традиционно встречаем Новый год уже четвертый раз (в прошлом году только в одном SSH-чате было больше сотни человек).
В центре внимания, конечно, SSH-чат, который работает только несколько дней до нового года и несколько после. В этом году разные люди так же подняли чаты в XMPP (Jabber), Телеграмме и IRC. Так же традиционно есть чат-бот tars, который может вывести ёлку и поздравить с новым годом. В прошлые года таких ботов делали несколько человек (кто-то даже на баше).
Небольшой отрывок из прошлогоднего чата, который у меня сохранилсяSSH-чат обычно открывает @podivilov, для этого используется
кастомный SSH сервер, написанный
на go. Устанавливается и настраивается он довольно просто. Для
начала можно освободить стандартный порт SSH, чтобы при заходе в
наш чат не вводить порт. В ubuntu server, например, это делается
так. В файле /etc/ssh/sshd_config
находим строку
Port 22
и меняем число на нужный порт. После этого
перезапускаем ssh демон sudo systemctl restart sshd
и
стандартный порт свободен (убедитесь, что фаерфол пропустит вас по
новому порту).
Скачивается бинарник под нужную платформу из релизов на github. Можно
положить его, например, в /usr/bin
. Далее пишем
простой скрипт, который будет перезапускать сервер, в случае
падения.
#!/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}] <{NICK}> "[sshchat.mychat]Server="habr2021.podivilov.ru:22"RemoteNickFormat="[{PROTOCOL}] <{NICK}> "[telegram.mytelegram]Token=""RemoteNickFormat="[{PROTOCOL}] `<{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 сессию может писать либо читать прямо из нее. Кроме этого, код довольно заурядный, с его последней версией вы можете ознакомиться на гитхабе.
Выбирайте любой понравившийся и присоединяйтесь. С наступающим Новым Годом!
SSH чат:хост:habr2021.podivilov.ru, порт 22. Для подключения к SSH-чату можно использовать любой SSH-клиент. Например,OpenSSH.
XMPP чат:ny@conference.helldev.net. Список клиентов доступенздесь.
Telegram чат:@habrachat2021.
IRC чат:#habr2021 на FreeNode.
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 документация
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 # аналогично
git clone https://github.com/kpu/kenlm.gitmkdir -p kenlm/buildcd kenlm/buildcmake ..make -j 4
# Создаём рабочую директорию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 .
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
export PATH=$PATH:/path/to/your/kenlm/build/bin # Здесь указываете путь до вашего kenlm
export PATH=$PATH:/path/to/your/kaldi/src/lmbin
!SIL SIL[unk] GBGа a0а a1а-а a0 a1а-а-а a0 a0 a1
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
a0a1bbjc
SIL
SILGBG
git clone https://github.com/DinoTheDinosaur/russian_g2p_neuro.gitcd russian_g2p_neuro/python setup.py install
generate_transcriptions extra/db/input.txt extra/db/output.dict
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
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
utils/prepare_lang.sh --phone-symbol-table graph/phones.txt data/local/dict "[unk]" data/tmp/ data/dict/
lmplz -o 3 --limit_vocab_file graph/words.txt < extra/db/your.corpus > 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
sed -i "s/<unk>/[unk]/g" data/local/lang/lm.arpa
arpa2fst --disambig-symbol=#0 --read-symbol-table=data/dict/words.txt data/local/lang/lm.arpa graph/G.fst
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
gunzip /path/to/your/vosk-model-ru-0.10/extra/db/ru.lm.gz
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 --disambig-symbol=#0 --read-symbol-table=data/dict/words.txt data/local/lang/lm_joint.arpa graph/G.fst
0 1 [unk] [unk]0 1 да да0 1 нет нет1 0.0
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
utils/mkgraph.sh --self-loop-scale 1.0 data/lang/ am/ graph/
from vosk import Modelmodel = Model("/path/to/your_asr_project/")
Мессенджеры стали важным инструментом коммуникации бизнеса и клиентов. При этом, компании используют как приватные чаты, где общение идет один на один, так и публичные об этом явлении я подробно писала в одной из прошлых статей.
С маркетингом понятно собственный публичный чат помогает решать ряд задач от создания сообщества вокруг продуктов компании, до поддержки клиентов и формирования имиджа лидера отрасли. Но можно ли чаты использовать еще как-то и именно для рекламы? Сегодня разберем именно этот кейс.
Публичные чаты могут быть очень эффективны, но проблема с ними в том, что сама площадка Telegram практически не дает администраторам чата никаких инструментов по аналитике и контролю качества общения. Поэтому компании просто вынуждены использовать сторонние инструменты ботов для решения конкретных задач вроде модерации или аналитики пользователей.
В итоге получается так, что один бот например, для модерации сообщений в чате может быть установлен в тысяч чатов с десятками тысяч пользователей. И раз бот может писать в эти чаты сообщения, то если включить в них релевантный теме чата рекламный месседж это может быть вполне эффективно.
Поговорим о том, как это работает на практике.
Наиболее эффективными для рекламы в чатах считаются боты, специфика которых подразумевает большой охват. К примеру, бот-модератор ChatKeeperBot устанавливают тогда, когда ручная модерация чата становится трудной и затратной то есть при активном развитии сообщества. В итоге бот находится в тысячах крупных чатов и позволяет получать существенный охват объявлений. В тех чатах, владельцы которых используют бесплатную версию бота, в его сообщения включается реклама.
Объявления показываются в приветственном сообщении оно появляется при вступлении в группу нового пользователя.
В случае таких объявлений видит их не только пользователь, вступивший в чат, но и все его участники. Главный плюс этого подхода в том, что реклама это не спам, а релевантное сообщение в том чате, где оно соответствует интересам аудитории, и появляется оно в ответ на активность в группе.
Существует и другой подход, когда реклама еще более нативно показывается в сообщениях бота, связанных с основной тематикой чата.
Тематика чата поиск работы, реклама предлагает связанную с темой сообщества услугуПо формату объявления могут отличаться некоторые боты предлагают размещения групповых промо, где упоминаются сразу несколько рекламодателей, где-то можно заказать индивидуальное размещение.
Бот из примера выше установлен более чем в 17 тысячах чатов, общая аудитория которых превышает 3,5 млн пользователей. Важный момент рекламу важно заказывать именно в активных чатах, то есть там, где бот действительно обрабатывает сообщения живых людей. Если в течение суток в чате ничего не происходит, то запускать в нем рекламу точно не стоит.
В итоге для крупных ботов, которые установлены в популярных чатах 1500-5000 новых пользователей в день, статистика показов объявлений в активных сообществах колеблется в районе 150-180 тысяч показов в сутки. Итоговая цена зависит от планируемого охвата и формата объявления единственный сервис/продукт будет рекламироваться или нет.
В описанном способе рекламы на данный момент есть два главных недостатка:
Пока нет ботов, которые позволяли бы выбирать конкретные тематики групп для размещения объявлений. То есть рекламная кампания будет широковещательной с не самым точным таргетингом.
Не существует открытых сервисов по сбору статистики бота, то есть вам придется верить разработчикам на слово. Минимизировать риски можно, заказывая рекламу у крупных продуктов, про которые есть информация в сети.
Реклама в групповых чатах Telegram относительно новый канал, который только развивается. Несмотря на некоторые ограничения, с его помощью уже сейчас можно получать масштабный охват аудитории с бюджетами, которые ощутимо меньше тех, что нужны в контекстной рекламе или при промо в соцсетях. При развитии рекламной функциональности ботов и добавлении функций аналитики и точного таргетинга стоит ожидать и роста стоимости размещений.
Чат-бот МЕГИ и ИКЕА распознает 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 руб.
Читайте в статье: что такое диалоговый UX/UI и какего создавать, а также полезные лайфхаки при проектировании сценария длячат-бота.
В марте 2021 годааналитики Voicebot провели опрос300 маркетологов и узнали, что они думают про голосовых помощников. Оказалось, что более 60% специалистов уверены в пользе голосовых ассистентов длямаркетинга. Виртуальные помощники и чат-боты больше не новинка и не пустой повод дляхайпав новостях. Бизнесактивно использует разговорные технологии дляэффективной коммуникации спользователями, дляпрямых продаж и создания прочных связей сбудущими и настоящими клиентами. И мы в Just AI уверены, что в будущем эта тенденция будет толькорасти.
В этой статье мы поделимся выстраданными на собственном опыте советами по проектированию чат-ботов и голосовых помощников, а также полезными лайфхаками при создании сценариев. И конечно, расскажем, каксделать пользовательский опыт в диалоговых сервисах максимально комфортным дляпользователя.
Мы будем двигаться отсамого простого ксложному. Если знаете азы сразу листайте кблоку дляпродвинутых пользователей.
Начнем спростого: UX это user experience или опыт, который получает пользователь в ходе его взаимодействия синтерфейсом сервиса, продукта или услуги. UI это user interface, пользовательский интерфейсили то, что мы привыкли называть дизайном.
Идем дальше. Диалоговый UX это опыт пользователя, который позволяет ему общаться сботом, свиртуальными помощниками или людьми. К нему относятся: общение сголосовыми помощниками, игра в голосовую игру, голосовое управление автомобилем, голосовая команда в поисковую строку.
А диалоговый UI это интерфейсы, которые позволяют взаимодействовать между пользователем и системой. Элементом диалога может стать голосовой или текстовый ввод и вывод информации, а также модальное окно на сайте, поп-ап в приложении и т. п.
В рамках диалогового UI мы рассматриваем два условных типа интерфейсов: голосовой и разговорный. Кажется, что это синонимы, но не все такпросто. Под разговорным интерфейсом или Conversational User Interface (CUI) подразумеваются все интерфейсы, скоторыми можно общаться на естественном языке кактекстом, таки голосом.
Соответственно, в понятие CUI входит Voice User Interface (VUI) или голосовой интерфейс. Он предполагает взаимодействие сустройством спомощью голоса.
Так выглядит схема диалогового интерфейсаЧтобы разобраться, посмотрите на иллюстрацию. Есть общее понятие диалоговой интерфейс (длявзаимодействия пользователя ссистемой), его частью является разговорный интерфейс(длявзаимодействия пользователя ссистемой естественным языком), а уже в него входит голосовой интерфейс(длявзаимодействия пользователя ссистемой естественным языком и спомощью голоса).
Закрепим. Итак, Алиса в Яндекс.Станции это VUI, а в смартфоне, где сней можно говорить голосом и чатиться CUI. А все вместе это диалоговый UI.
Созданием диалогового UХ и UI занимается отдельный специалист. Он разрабатывает диалоговый пользовательский интерфейс, продумывая пользовательский опыт.В Just AI мы называем такого специалиста дизайнер разговорных интерфейсов.
Но в русском языке точный термин до сих пор не закрепился. Поэтому можно встретить разные переводы. Так, на HH.ru мы встретили 17 разных названий вакансий: дизайнер диалогов, диалоговый редактор, digital-лингвист, voice UX designer, диалог-дизайнер, сценарист чат-бота и такдалее. Подробности о нашем исследовании смотрите в вебинаре Создатели разговорных интерфейсов: кто они и чем занимаются?. На нем мы рассказали, каксделать так, чтобы специалисты и компании нашли друг друга.
Дизайнер разговорных интерфейсов учит ботов говорить по-человечески. Он продумывает, какпользователь будет общаться сботом, о чем будет диалог, какие сложности могут возникнуть. Задачи такого дизайнера прописать пути взаимодействия сботом и нестандартные кейсы поведения пользователя, проработать навигацию по возможностям бота, а также составить реплики в соответствии сзадуманным характером бота.
Собрали основные термины из этой статьи. Сохраняйте себе, чтобы не потерятьЧтобы разобраться в этом вопросе, просмотритечек-листоткомпании Google. Для вашего удобства мы адаптировали его на русский язык. Отметьте каждый пункт, который вам подходит. Чем больше пунктов вы отметили, тем больше вероятность, что вам нужно использовать диалоговый интерфейс.
Чек-лист диалогового UX/UI
Ваш вопросможно решить только при участии человека.
В качестве формата диалога подойдет вопрос-ответ без дополнительных уточнений.
Чтобы выполнить задачу, сейчаснужно кликать на экран несколько раз.
Чтобы выполнить задачу, сейчаснужно переключаться между экранами или приложениями.
Сейчаспользователю сложно или долго искать, где решить проблему.
Задачу можно выполнить, одновременно делая другие дела.
Задачу можно выполнить, даже если глаза и руки пользователя заняты другими делами.
Пользователю комфортно говорить или писать о теме задачи.
Обратите внимание, что голосовой интерфейсможет не подойти в следующих ситуациях и пространствах:
В общественных местах. Причина в технических проблемах распознавание речи может сработать некорректно или распознать не голоспользователя, а постороннюю речь или фоновый шум. Из-за этого навыкили ассистент неправильно поймет ваш вопрос.
Если неудобно общаться синтерфейсом. Например, когда клиент находится в офисе среди работающих коллег или в пространстве, где посторонние шумы ограничены или запрещены.
Когда пользователь предпочитает текст. Есть целая группа пользователей, которым просто удобнее общаться текстом, и они не готовы кголосовому каналу. Им лучше предложить текстовый интерфейс.
В случаях, когда речь идет о чем-то личном. Если в переписке счат-ботом необходимо сообщить персональные данные или личные сведения, то голосовой интерфейсдлятакого не подойдет.
Итак, вы определились, что разговорный интерфейсподходит дляваших задач. Пора приступить кпроектированию чат-бота на диалоговом уровне. На втором шаге нужно составить пользовательскую персону краткое и конкретное описание пользователя, который будет пользоваться навыком, ботом или голосовым ассистентом. Можно создать несколько пользовательских персон. Понимание целевых групп поможет спроектировать и создать диалоги.
Чтобы составить пользовательскую персону, дляначала ответьте длясебя на вопросы:
Кто ваши пользователи?
Что хотят сделать? Какую проблему хотят решить?
Какони делают это сейчас?
Какие слова или фразы они используют, говоря о задаче?
Каков контекст, обстоятельства этих задач или проблем пользователей?
Продумайте tone of voice то, какую речь будет использовать ботили ассистент при общении спользователем. Если это чат-бот, какон обращается кклиенту на ты или на вы? Использует ли он профессиональные термины? Умеет ли общаться на отвлеченные темы и шутить,какботКвик?
Tone of voice основывается на стратегии поведения компании в отношении пользователей. Это то, какботбудет разговаривать свашим пользователем. В отрыве отполитики компании ботможет выглядеть очень странно, например, если он слишком шутлив в диалогах, а в компании принято говорить склиентом серьезно и на Вы сбольшой буквы.
Чтобы найти tone of voice, поизучайте ресурсы, на которых сидят пользователи это могут быть Известия, Ревдинский рабочий, Одноклассники, ВКонтакте и такдалее.
Поищите, какпользователи сейчасрешают похожие проблемы. Возможно, вы найдете похожие кейсы боты, навыки. И посмотрите, какпользователи общаются при этом, чтобы говорить сними на одном языке.
Ирина Степанова, аналитикразговорных интерфейсов отдела лингвистики в компании Just AI
Сравните сами, какможет отличаться Tone of Voice в сообщениях отразных компаний:
1. Привет, Иван! Посмотри новые тарифы на сайте в разделе Цены! Мы подготовили длятебя классные предложения!
2. Здравствуйте, Иван Иванович. Просим обратить внимание, что с1.06.2021 обновляются Тарифы. Актуальная информация находится в соответствующем разделе.
Тональность диалогов влияет на то, как пользователи воспринимают бота или голосового помощникаПри создании диалогов обязательно используйтемаксимы Грайса. Это правила ведения разговора, которые подчиняются принципу кооперации, введенному философом Гербертом Полом Грайсом. Они актуальны и дляголосового ассистента сискусственным интеллектом, и дляпростого бота в Facebook Messenger.
Четыре максимы помогают сделать диалог бота спользователем наиболее человечным и эффективным.
Максима качества информации:
не говори того, что считаешь ложным;
не говори того, в чем сомневаешься, длядоказательства чего нет исчерпывающих аргументов.
Максима количества информации:
изложи не меньше информации, чем требуется;
изложи не больше информации, чем требуется.
Максима релевантности:
не отходи оттемы.
Максима ясности:
будь последовательным:
избегай неясности;
избегай двусмысленности;
будь краток;
будь систематичен.
В кратком изложении они описаны на картинке.
Эти принципы помогут сделать диалог бота с пользователем эффективнееСоздание сценария чат-бота стоит начать со схемы диалога в голосовом или текстовом каналах (Voice Flow или Chat Flow). Это диаграмма, которая показывает пути, через которые может идти диалог.
Для начала пропишите happy path или счастливый путь идеальный диалог пользователя сботом отначала и до конца. А затем продумайте ответвления, которые могут возникнуть на этом пути: сложности, дополнительные вопросы, уточнения.
На этом этапе не нужно подробно прописывать реплики, достаточно общей информации, о чем должен говорить бот.
Так выглядит схема диалога от начала и до конца. Нажмите, чтобы увеличить картинку и рассмотреть подробнееЧтобы выполнить этотшаг, берите за основу путь пользователя и выбранный tone of voice. Готовые кусочки диалогов потом пойдут в код и превратятся в реальные реплики бота или ассистента.
Кусочек настоящего текстового сценария чат-бота. Показано, что произойдет, если бот не знает ответаИтак, вы узнали самое важное про диалоговый UX и UI, изучили задачу и аудиторию, а также подготовили сценарий. После этого нужно заняться UX-проектированием диалога и собрать его прототип. Это поможет узнать, кактекст будет восприниматься в мессенджере, проверить навигацию и протестировать гипотезы. Такой работой обычной занимается дизайнер-проектировщик UX-дизайнер, специализирующийся на разговорных интерфейсах.
UX-дизайнер не просто рисует красивые кнопки. Он проектирует эмоциональный и чувственный опыт. Неважно приятный, неприятный, напряженный Эти оттенки зависят отпоставленной задачи, а UX-дизайнер спроектирует то, что необходимо.
Из формата сценария в гугл-доке очень сложно получить эмоциональный и чувственный опыт, в нем сложно проверить и протестировать идеи. Поэтому необходимо делать прототип диалога.
Екатерина Юлина, Head of Product UX, Just AI
Чтобы узнать, какими будут дальнейшие шаги и увидеть практикум сборки прототипа диалога, посмотрите наш вебинар Дизайн голосовых интерфейсов: как, что, где и главное, зачем?. Специалисты Just AI рассказали и показали, каксоздают UX и UI при проектировании чат-бота HR дляпроизводственной компании, а также поделились практическими советами.
Во второй части цикла на вебинаре Создатели разговорных интерфейсов: кто они и чем занимаются? специалисты разобрали, какие сотрудники нужны длясоздания диалогового UX и что каждый из них должен делать, чтобы система работала.
Служба техподдержки в крупной компании обычно обслуживает целый зоопарк сервисов, например: пару виртуальных АТС, онлайн-магазин, умный дом и охранную систему в придачу. У ребят всегда есть работа тысячи звонков с сотнями проблем от подключения новых телефонных номеров, до отвалившихся IP-камер.
Чтобы упростить работу техподдержки, команда из нашего акселератора разработала автоматизированную систему на базе машинного обучения. Она запускается за 2 дня без подготовки и без помощи специалистов по data science.
Меня зовут Екатерина Мелькова, я тимлид группы продуктовых инноваций в КРОК. Сегодня мы с разработчиками расскажем, как AutoFAQ автоматизирует клиентскую и техническую поддержку.
Без автоматизации техподдержка крупной компании либо вечно перегружена типовыми обращениями и плохо справляется со сложными вопросами, либо разрастается и рискует развалиться на отдельные подразделения.
Для того чтобы разгрузить техническую поддержку, нужен интеллектуальный промежуточный слой. Он решит стандартные вопросы с помощью чат-бота на нулевой линии поддержки и облегчит работу оператора первой линии при помощи бота-ассистента.
Helpdesk не проблема, на рынке много готовых решений, а вот запустить чат-бота уже сложнее. Чтобы клиенты его не возненавидели, нужно машинное обучение, а это значит: лингвисты, дата-сайентисты и тщательная разметка данных.
Затем нужно интегрировать бота с helpdesk и корпоративными сервисами и надеяться, что все это будет хорошо работать.
Гораздо проще использовать решение типа все в одном, но цена некоторых подобных систем переваливает за десятки миллионов рублей в год. И им тоже требуется предварительное обучение.
Без обучения ты просто бесполезен!Наша практика показывает, что даже у больших компаний редко есть качественные обучающие выборки. Вместо того чтобы ждать пока их подготовят, можно запустить бота и обучить его на практике.
С этой мыслью мы разработали единую систему обработки обращений для совместной работы людей и алгоритмов. Она получила название AutoFAQ, потому что для запуска не нужны обучающие выборки и долгая подготовка, достаточно FAQ с сайта компании.
Мы стремились к тому, чтобы нашим решением мог управлять пользователь без специальных знаний. Поэтому для сотрудников службы поддержки все выглядит просто и привычно.
С виду 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 накапливает достаточный объем данных, предобученный алгоритм отключается, пайплайн перестраивается, и в дело вступают модели, использующие обучение с учителем. Мы заранее не знаем, какой метод будет лучше справляться с данными клиента, поэтому встроили в AutoFAQ сразу несколько алгоритмов: от простых TF-IDF, до BERT и LASER.
Система проверяет объем и сбалансированность обучающей выборки. В зависимости от результатов формируется новый программный конвейер, подбираются алгоритмы и гиперпараметры.
Сперва используются простые модели логистическая регрессия и SVM. По мере накопления выборки подключаются и нейронные сети. Выбор алгоритма может происходить на основе подсчета метрик классификации или при помощи предустановленных требований к обучающей выборке.
На практике, в AutoFAQ часто строятся ансамбли из нескольких алгоритмов. Система постоянно сравнивает их результаты по внутренним метрикам и выдает на выход наиболее уверенные ответы.
Интерфейс базы знаний позволяет без специальных знаний создавать новые классы, понимать причины тех или иных ответов и менять их, внося изменения в классификатор. Так что, AutoFAQ легко управлять, даже когда собирается огромная обучающая выборка.
Мы разбили AutoFAQ на микросервисы и упаковали в докер. Система не требует подключения к сторонним сервисам и работает в изолированной среде. Все ее компоненты дублируются. Они либо работают параллельно, либо запускаются по мере надобности.
Мы рассматривали Kubernetes, но оказалось, что для оркестрации нам хватает Docker Compose. Он упрощает процесс развертывания и не требует kubernetes-кластера.
AutoFAQ разворачивается за пару часов, подключается к практически любым текстовым каналам коммуникации от электронной почты до Slack и Skype for business. После этого система готова к работе понимает письменную речь, начинает обрабатывать запросы в службу поддержки и накапливать базы знаний.
Чем больше обращений поступает в службу поддержки, тем лучше система их понимает и тем больше задач берет на себя. За 12 месяца AutoFAQ наполняет базу знаний, и автоматизация запускается в полную силу. Как правило, AutoFAQ решает порядка 45% обращений без помощи людей.
Система не заменяет операторов, но избавляет их от большинства рутинных запросов. У сотрудников службы поддержки появляется время на тщательный разбор сложных обращений.
Информация, разбросанная по разным документам у разных операторов, постепенно собирается в единую базу знаний. Отвечать на вопросы и искать решения проблем становится заметно проще.
Все это хорошо отражается на качестве поддержки. Уровень удовлетворенности клиентов у наших заказчиков в среднем не падает ниже 4 из 5 баллов. Но это уже заслуга сотрудников поддержки. Они настраивают новые интеграции, пополняют базы ответами на редкие вопросы и редактируют формулировки. Мы лишь разработали для них новый инструмент.
P.S. Если у вас остались вопросы по AutoFAQ, оставляйте их в комментариях или пишите на почту: EMelkova@croc.ru.
Интент | Сущность | Пример естественного запроса |
CheckWeather | {type: location, entity: moscow} {type: builtin.datetimeV2.date, entity: future ," resolution ":" 2020-05-30 "} |
Какая погода будет завтра в Москве |
CheckWeather | { type: date_range, entity: this weekend } | Покажи мне прогноз для этих выходных |