Нейросеть чат бот php

Chatbot на базе рекуррентной нейронной сети своими руками за 1 вечер/6$ и

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

Шаги, которые на предстоит пройти на нашем тернистом пути

Реализация нейронки, которую можно использовать для нашей цели

TensorFlow включает реализацию RNN (рекурентной нейронной сети), которая используется для обучения модели перевода для пары языков английский / французский. Именно эту реализацию мы и будем использовать для обучения нашего чат-бота.

Вероятно, кто-то может спросить: «Почему, черт возьми, мы смотрим на обучения модели перевода, если мы делаем чат-бот?». Но это может показаться странным только на первом этапе. Задумайтесь на секунду, что такое “перевод”? Перевод может быть представлен в виде процесса в два этапа:

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

Для нетерпеливых: картинка в начале статьи это собственно пример разговора с ботом после всего 50 тысяч учебных итераций. Как видите, бот способен давать более или менее информативные ответы на некоторые вопросы. Качество бота улучшается с количеством итераций обучения. Например, вот как глупо он отвечал после первых 200 итераций:

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

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

Подготовка данных (корпуса) для обучения

Для обучения нашего первого бота мы будем использовать корпус диалогов из кинофильмов “Cornell Movie Dialogs Corpus”. Для его использования нам нужно сконвертировать диалоги в нужный для обучения вид. Для этого я подготовил небольшой скрипт.

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

К концу выполнения вы будете иметь 2 файла, которые можно использовать для дальнейшего обучения: train.a и train.b

Обучение модели

В поисках Атлантиды машины для обучения

Для того, чтобы сделать этот процесс как можно более простым, я буду использовать собранный AMI — «Bitfusion TensorFlow AMI», который будет использоваться с AWS. Он имеет предварительно установленный TensorFlow, который был собран с поддержкой GPU. К моменту написания статьи, Bitfusion AMI включал TensorFlow версии 0.11.

Процесс создания EC2 инстанса из AMI образа достаточно прост и его рассмотрение выходит за рамки этой статьи. Однако стоит обратить внимание на две важных детали, которые имеют отношение к процессу, это тип instance и размер SSD. Для типа я бы рекомендовал использовать: p2.xlarge — это самый дешевый тип, который имеет NVIDIA GPU с достаточным количеством видеопамяти (12 Гбит). Что касается размера SSD — я бы рекомендовал выделить по крайней мере 100GB.

Теперь нам нужно изменить оригинальный «translate» скрипт

На этом этапе, я надеюсь, я могу предположить, что у вас есть ssh доступ к машине, где вы будете обучать TensorFlow.

Во-первых, давайте обсудим, зачем вообще нам нужно изменять исходный скрипт. Дело в том, что сам скрипт не позволяет переопределить источник данных, которые используются для обучения модели. Чтобы это исправить я создал feature-request. И постараюсь скоро подготовить реализацию, но на данный момент, вы можете поучаствовать добавляя +1 к “реквесту”.

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

Переименуйте файлы «train.a» и «train.b» на «train.en» и «train.fr» соответственно. Это необходимо, так как учебный скрипт все еще считает, что он обучается на перевод с английского на французский.

Оба файла должны быть загружены на удаленные хосты — это можно сделать с помощью команды rsync:

Теперь давайте подключимся к удаленному хосту и запустим tmux сессию. Если вы не знаете, что такое tmux, вы можете просто подключиться через SSH:

Давайте проверим, что TensorFlow установлен и он использует GPU:

Как видно, установлен TF версии 0.11 и он использует библиотеку CUDA. Теперь давайте склоним учебный скрипт:

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

Поздравляю! Вы дошли до этапа начала обучения. Смело запускайте это самое обучение:

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

Давайте убедимся в том, что обучение продолжается, и все идет по плану

Вы успешно начали обучение. Но давайте подтвердим, что процесс продолжается и все в порядке. Мы не хотим, чтобы в конечном итоге через 6 часов мы выяснили, что что-то в самом начале было сделано не так. Мы с Глебом уже как-то обучили нечто полуразумное =)

Прежде всего, мы можем подтвердить, что процесс обучения “откусил” себе памяти у GPU:

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

Как видно, не хило так кусанул, почти вся память на GPU занята. Это хороший знак. И не нужно бояться, что ваш процесс вот-вот “откинет копыта” с ошибкой OutOfMemory. Просто во время запуска TF прибирает к своим рукам всю память на GPU, до которой может дотянуться.

Затем можно проверить папку «train» — она должна содержать несколько новых файлов:

Здесь важно заглянуть в файлы vocab4000.* и train.ids40000.*. Там должно быть атмосферно и душевно, вот посмотрите:

Каждая строка в файле — это уникальное слово, которое было найдено в исходных данных. Каждое слово в исходных данных будет заменено числом, которое представляет номер строки из этого файла. Можно сразу же заметить, что есть некоторые технические слова: PAD (0), GO (1), EOS (2), UNK (3). Наверное самое важное из них для нас — «UNK», так как количество слов помеченных этим кодом (3) даст нам некоторое представление о том, насколько корректно выбран нами размер нашего словаря.
Теперь давайте посмотрим на train.ids40000.en:

Думаю вы уже догадались, что это данные из input.en, но со всеми словами замененными на коды согласно словарю. Теперь мы можем проверить, сколько же слов помечены как «неизвестные» (UNK/3):

Можете попробовать в последующих экспериментах увеличить размер словаря с 40k до 45k, или даже до 50к. Но, мы пока продолжим процесс “as is” и не станем его прерывать.

6 часов спустя… “Оно ожило!”

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

Источник

Русский нейросетевой чатбот

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

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

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

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

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

Почему нейронные сети?
Нельзя ли подойти к задаче более классическим методом? Загрузить набор ответов в БД и искать полнотекстовым индексом по предыдущей фразе? Ответ, так сделать можно, но результат получается не очень. Вот допустим:

Ч: привет!
К: грег, мария, это али…
Ч: как дела?
К: из соседнего номера поступила жалоба на шум, месье
Ч: как тебя зовут?
К: спасибо, спасибо.
Ч: сколько тебе лет?
К: ты живешь где-то рядом.

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

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

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

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

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

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

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php
Рис.1. Архитектура нейронных сетей

Результаты
По способности выбирать правильный ответ из нескольких предложенных вариантов (случайно взятых ответов), самый лучший результат показала модель номер 2, с пятью слоями для анализа данных по 700 нейронов в каждом (+1 слой репрезентации входных данных, тоже из 700 нейронов). Чтобы обучить такую глубокую сеть, пришлось использовать Хайвей (Highway) слои, которые позволяют информации проще распространятся от нижних слоев к верхним, также подождать несколько дней пока модель рассчитывалась на GPU. Модель номер 1 явно недообучилась, а номер 3 долго думала, и тоже не добрала до результатов модели номер 2 несколько процентов. Что напоминает нам о том, хотя самые простые модели не годятся для больших объемом данных, все же никогда не следует умножать сущности сверх необходимости.

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

Какие же диалоги можно в результате получить?

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

Достаточно хорошо, на мой взгляд. Вот еще пример:

Ч: Где живет бегемот?
К: Жил
Ч: а что, сейчас не живет?
К: Я не знаю.
Ч: тогда где он жил раньше?
К: у парка, на мэйпл стрит.
Ч: куда же он пропал?
К: куда он пропал?
Ч: я тебя спрашиваю, куда он пропал?
К: я не понимаю, почему я снова в больнице.
Ч: потому что ты болеешь
К: я просто хочу помогать людям.
Ч: Тогда скажи мне, где бегемот!
К: почему ты так сильно хочешь это знать?
Ч: просто ответь мне
К: ты хочешь, чтобы я помогла тебе попрощаться с родными?
Ч: Это угроза?
К: Наблюдение
Ч: Так где же все-таки бегемот?
К: он на гавайях, но радж управляет отсюда
Ч: Кто такой радж?
К: не встречалась с ним?
Ч: Нет, никогда
К: жили-были муж с женой, только муж каждую ночь исчезал.

Я попробовал сделать android-приложение которое общается с сервером, на котором расположен бот. Приложение сырое, находится в стадии тестирования, чтобы его установить надо вступить в группу бета-тестировщиков:
plus.google.com/u/0/communities/103302070341792486151

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

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

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

Источник

Chatbot на нейронных сетях

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

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

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

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

Вот что получилось:

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

Перевод (примерный) (Ч: — человек, П: — программа):
Ч: привет
П: я вижу посетителей здесь, это хорошо
Ч: Как дела
П: улыбается
Ч: как тебя зовут?
П: пожимает плечами
Ч: Кто ты?
П: у меня все хорошо
Ч: ты понимаешь меня?
П: Абсолютно все, хмм…
Ч: Мне надо идти
П: ^^
Ч: увидимся позже
П: Я не уверена

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

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

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

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

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

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

После обучения сети получилось следующее:
Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

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

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

Перевод (примерный) диалога (Ч: — человек, П: — программа)
Ч: привет
П: ох, привет
Ч: как дела?
П: Я не могу видеть
Ч: упс… ну извини
П: похоже мне сниться хороший сон
Ч: ты можешь чувствовать?
П: Я полагаю
Ч: Ты могла видеть раньше?
П: Да
Ч: Кто ты?
П: Я
Ч: Мне пора идти
П: Я не уверена, что могу принять это
Ч: увидимся позже
П: Да

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

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

Источник

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

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

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

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

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

Но с 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 позволяют нам измерить расстояние между репликами. Например, фраза «космический корабль» ближе к «самолету», чем «самокату». А от «продажи почки» — совсем далеко.
Подготовка: Для каждого намерения выписываем ключевые слова (вино_под_мясо: стейк, мясо, гуляш, вино+мясо)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

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

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

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

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

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

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

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

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

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

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

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

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

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

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

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

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

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

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

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

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

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

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

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

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

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

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

4. Итог

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

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

Нейросеть чат бот php. Смотреть фото Нейросеть чат бот php. Смотреть картинку Нейросеть чат бот php. Картинка про Нейросеть чат бот php. Фото Нейросеть чат бот php

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

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *