Бот на нейросетках: как работает и учится виртуальный ассистент

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

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

    В материале мы расскажем


    • Чем виртуальный ассистент отличается от обычного чат-бота
    • Правда ли, что виртуальные ассистенты понимают язык
    • Как мы научили робота понимать контекст и написали язык lialang
    • Проверка кейсами: как мы автоматизировали поддержку в трёх банках
    • Создание Lia Platform и движка для интерфейсов
    • Три шага: как работает платформа для сборки виртуальных ассистентов (где собрать робота может любой, даже не-программист)


    Чат-бот vs виртуальный ассистент


    Продвинутые чат-боты умели выделять ключевые слова и имитировать человеческий диалог ещё в 60-х. Хиппи закидывались ЛСД, The Beatles собирали стадионы, а Джозеф Вейценбаум создал Eliza — собеседника-психотерапевта, который даст фору многим современным ботам, а то и психологам.
    Например, в предложении «Мой отец меня ненавидит» Элиза реагировала на ключевое слово «отец» и спрашивала: «Кто ещё из семьи вас ненавидит?». Но суть вопросов робо-психотерапевт не понимал. Так же работают современные чат-боты: ключевые слова, линейные сценарии и пародия на живой диалог.

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

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

    Этап 1


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

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

    Фантазировать можно бесконечно, но всё равно мы не сможем предугадать все вопросы пользователей. Когда нам кажется, что описанных ситуаций будет достаточно для покрытия 98% запросов, мы останавливаемся (хотя потом суровая реальность обломает и мы узнаем, что покрыто будет в лучшем случае 80%).

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

    Список намерений


    Намерение 1 — хочу любое вино
    Фразы:

    — Помоги выбрать вино
    — Какое вино посоветуешь?
    — Хочу самое лучшее вино
    — …
    Что с этим делать: случайно выбрать одно из самых популярных вин и сообщить пользователю.

    Намерение 2 — вино подешевле

    Фразы:

    — есть ли хорошие вина до 1000 рублей?
    — а нет ничего дешевле?
    — слишком дорого для меня
    — …
    Что делать: добавить к запросу фильтр на цену и выбрать одно из самых популярных вин.

    Намерение 3 — хочу вино под мясо
    Фразы:

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

    … (и так ещё сотни разных намерений)

    Намерение 290 — мы не поняли пользователя
    Фразы: любые другие

    Что делать: выдать фразу-заглушку: «Не знаю, что вы имели ввиду, но пинотаж Barista восхитителен в любое время года».

    Этап 2


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

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

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

    Выбор вина с чат-ботом Выбор вина с виртуальным AI-ассистентом Что случилось
    User: Привет! Хочу выбрать вино на ужин до 2000р
    Bot: Здравствуйте!
    Bot: В каком ценовом диапазоне ищем?
    User: до 2000р
    Bot: Могу порекомендовать Ramirez de la Piscina. В меру терпкий красавец из Испании подойдет и к ужину, и под любимый сериал. 1240₽ за бутылку
    User: Привет! Хочу выбрать вино на ужин до 2000р
    Assistant: Здравствуйте! Могу порекомендовать Ramirez de la Piscina. В меру терпкий красавец из Испании подойдет и к ужину, и под любимый сериал. 1240₽ за бутылку
    Бот — пошел по ключевым словам выбрать+вино. Не понял ценовой диапазон и переспросил. Ассистент — пошел по самому близкому намерению и извлек ценовой диапазон.
    User: Не люблю терпкое
    Bot: Ваш кандидат — «Casillero del Diablo» Cabernet Sauvignon Reserva
    Bot: Чилийский терпкий совиньон точно вас согреет. Всего 872₽
    User: Не люблю терпкое
    Assistant: Ваш кандидат — Antigal, «Uno» Malbec.
    Assistant: Мягкий аргентинец прямиком из 2015. Цена за бутылку — 1101₽
    Чат-бот ориентировался на ключевое слово «терпкое» и ошибся. А ассистент понял, что ближайшее к «Не люблю терпкое» намерение — мягкие вина.
    User: Хорошо, что оно такое недорогое. Пожалуй, возьму его.
    Bot: Тогда попробуйте «FYI» Red Blend
    Bot: Несмотря на высокий рейтинг, его цена всего 557₽
    Bot: Хороший выбор
    User: Хорошо, что оно такое недорогое. Пожалуй, возьму его.
    Assistant: Хороший выбор
    Роботы обрабатывают предложения по одному. Господин чат-бот посмотрел на слово «недорогое», ответил по шаблону — в итоге не угадал и запутался. Ассистент просто проигнорировал первое предложение, так как понял второе.

    Как это работает: таблица-сравнение чат-ботов и виртуальных ассистентов
    Чат-бот Виртуальный ассистент
    Чтобы понять пользователя, мы берём ключевые слова.
    При создании чат-бота технологии машинного обучения и NLU не используются.
    Чтобы понять пользователя, мы проводим «умное» сравнение и выбираем ближайшее намерение (чуть позже поясним, как это работает).
    Машинное обучение и алгоритмы NLU позволяют нам измерить расстояние между репликами. Например, фраза «космический корабль» ближе к «самолету», чем «самокату». А от «продажи почки» — совсем далеко.
    Подготовка: Для каждого намерения выписываем ключевые слова (вино_под_мясо: стейк, мясо, гуляш, вино+мясо)

    Алгоритм:
    • Берём слова из реплики пользователя («Посоветуй вино к стейку» → советовать, вино, стейк).
    • Выбираем намерение, в котором больше всего ключевых слов из реплики пользователя (вино_под_мясо).
    • Если бот не нашёл пересечений по ключевым словам — выбираем намерение «мы не поняли пользователя».
    • Выполняем действие, которое соответствует намерению.

    Подготовка: Обучаем модель для «умного» сравнения

    Алгоритм:
    • Сравниваем фразу пользователя с фразами из намерений с помощью «умного» сравнения.
    • Выбираем намерение с самыми близкими фразами
    • Если выбранное намерение недостаточно близко к реплике пользователя (не прошло установленный порог) — выбираем намерение «мы не поняли пользователя».
    • Выполняем действие, которое соответствует намерению.

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


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


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

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

    vectorize("хочу вино") = (0.004, 17.43, -0.021, ..., 18.68)
    vectorize("хочу белое вино") = (0.004, 19.73, -0.001, ..., 25.28)
    vectorize("не хочу вино") = (-8.203, 15.22, -9.253, ..., 10.11)
    vectorize("марс атакует") = (89.23, -68.99, -10.62, ..., -0.982)

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

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

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

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

    Как мы научили робота понимать контекст: lialang


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

    Основная задача lialang-программиста — описать все ситуации, которые могут случится в диалоге человека с машиной. Для этого в нашем языке можно связывать названия намерений и действия.

    Рассмотрим простой пример — приветствие:

    if intent(привет) {
        reaction(сказать_привет)
    }

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

    А вот как можно описать контекстные ситуации.
    Мы ввели конструкцию «was», чтобы ловить неуместные приветствия в любом месте диалога:

    if intent(привет) {
        if was_reaction(сказать_привет) {
            reaction(сказать_что_уже_здоровались)
        } else {
            reaction(сказать_привет)
        }
    }

    Здесь написано: Lia, если тебе сказали «привет» — скажи в ответ привет. А если после этого вновь сказали «привет» — скажи, что уже здоровались.

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

    Сам код отправки текста и функций существует отдельно от языка – язык максимально просто описывает ситуации.

    Теперь попробуем написать штуку посложнее — в чате с банком клиенты часто запрашивают свои реквизиты. Давайте научимся отправлять их в чат и на почту с помощью lialang.

    if intent(отправь_реквизиты) or intent(отправь_реквизиты_в_чат) {
        reaction(отправить_реквизиты_в_чат) {
            if intent(отправь_на_почту) {
                reaction(отправить_реквизиты_на_почту)
            }
        }
    }
    if intent(отправь_реквизиты_на_почту) {
        reaction(отправить_реквизиты_на_почту)
    }

    Здесь описаны две ситуации:

    1. Lia, если тебя попросили отправить реквизиты — отправь их в чат. Если после попросили «надо на почту», то отправь их на почту.
    2. Lia, если сразу попросили отправить реквизиты на почту — отправь реквизиты на почту.

    Так lialang выполняет свою задачу — работает в контексте. Даже если человек напишет «на почту, пожалуйста», робот поймёт, что речь про реквизиты.

    Lia научилась поддерживать сложные сценарии — в нужный для пользователя момент достанет/положит данные из/в CRM, отправит SMS, поможет с оплатой или поговорит о жизни.

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

    Проверка кейсами: как мы автоматизировали поддержку в трёх банках


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

    Мы запустились вполне успешно — особенно для продукта, который был создан за четыре месяца. Наш гибридный робот для «ВТБ» базировался на нейросетях и сразу был эффективным: отвечал больше чем на 800 вопросов, поддерживал несколько сложных сценариев (выписки, смена тарифа, настройка пользователей) и говорил как человек. В итоге за два месяца наша Lia на 74% снизила нагрузку на саппорт. Стало понятно: идея с автоматизацией поддержки работает.

    image

    Дальше мы на базе Lia автоматизировали FAQ в «Рокетбанке» и «ДелоБанке» — и за две недели закрыли 32% заявок без операторов.

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

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

    Lia Platform и движок для интерфейсов


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

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

    Смотрите, как это выглядит:

    Lia Patform
    Диалоги штука нелинейная и написать универсальный движок для всевозможных схем разговора очень сложно. Но до того, как мы задумались про схемы, у нас уже был lialang — он и стал движком.

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

    Как работает платформа для создания виртуальных ассистентов


    Чтобы собрать собственного виртуального ассистента в Lia, пользователю нужно пройти через три этапа.

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


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

    Пример немерений пользователей

    Со временем эффективность Lia будет расти. Сообщения, на которые робот не смог ответить, вновь распределяются по кластерам: например, «кто ты?», «ты кто?», «как тебя зовут?» и «ты робот?» попадут в одну группу. Так платформа полуавтоматически самообучается: пользователь видит, где пробел и закрывает его, добавляя новые сценарии — в результате процент покрытых запросов вырастает с 30% до 70% за полгода.

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

    Шаг 2. Прописываем намерения: 10-20 вариантов самых частых запросов пользователя


    На втором этапе прописываем намерения на основе 10-20 самых популярных запросов: такого количества вариантов достаточно благодаря нейронным сетям. Так фраза вроде «Я хочу заказать вино» обучает бота распознавать аналогичные запросы пользователей: например, «Получить вино» или «Заказать вино».

    Пример разметки намерения

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

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

    Шаг 3. Создаем сценарий: прописываем несколько вариантов ответов или действий


    Здесь пользователь должен придумать ответы на запросы пользователей. 95% от среднестатического проекта обычно занимает простой сценарий Question-Answer — ответы на популярные вопросы.

    image

    Кстати, ассистент умеет отвечать картинками, видео и аудиофайлами, а если нужно отправит геолокацию.

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

    Пример диалога jump to:

    Assistant: Нам нужно уточнить адрес доставки, так как получатель не отвечает.
    Client: А по поводу чего? Какой заказ? (JumpTo на уточнение заказа)
    Assistant: Заказ от 21 Августа, Antigal, «Uno» Malbec.
    Assistant: Так сможем уточнить актуальный адрес доставки? (Возврат в главный сценарий)

    Когда создатель хочет, чтобы его ассистент не только отвечал текстом, а совершал действия, он сможет позвать программиста, чтобы спец прописал JS-сниппеты. Мы позволяем запускать JavaScript прямо во время сценариев: обратиться к внешнему API, послать e-mail или сделать другое сложное действие.

    4. Итог


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

    Сборка умного ассистента в платформе занимает от пары часов до месяца. Затем робот учится реалистично понимать запросы и узнавать паттерны — на это уходит около шести месяцев (все это время его курирует живой человек). На робо-девочку Lia бизнес может скинуть большинство рутинных задач: от согласования доставки и вызова такси до консультации клиентов.

    Пример чата с виртуальным ассистентом о вине

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

    В скором будущем мы планируем добавить экстракторы, что позволит нашим пользователям извлекать более сложные данные (например, робот поймёт фразу «послезавтра после обеда»). Доработаем и контроль версионности — чтобы клиенты смогли быстро накатывать и откатывать версии проектов. А также зарелизим систему ролей организации.

    Мы рассчитываем, что прогнозы Gartner верны — и в 2022 году до 70% всех взаимодействий с клиентами будет проходить через какую-нибудь разновидность ИИ. По нашей задумке конструкторы вроде Lia помогут перекинуть клиентский сервис на роботов ещё быстрее.

    Комментарии 7

      0
      Спасибо за статью. Интересно написали.
      0
      Спасибо очень интересно, было бы ещё интересней почитать, какие нейронных сети используете, как обучаете, какие проблемы возникли, как решали.
        0
        Уже в планах, скоро будет на хабре
      • НЛО прилетело и опубликовало эту надпись здесь
          0
          Да вроде не было проблемы? пишешь, прошу переключить на оператора, он тут же в ответ «Понятно, перевожу на оператора»- нет?
          • НЛО прилетело и опубликовало эту надпись здесь

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

        Самое читаемое