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

Вот несколько примеров этих моделей: Ulmfit, ElMo, Bert (и их различные вариации, такие как Albert, Roberta и т.д.), XLNet, GPT-2 и GPT-3, Megatron от NVIDIA’, T-NLG от Microsoft, Meena и Pegasus от Google, Blenderbot от Facebook, T5, MT5многие другие!).

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

  • генерация текста (отличные примеры GPT-2 здесь);
  • автоматическое реферирование текстов (см. Pegasus);
  • преобразование текста в код (инструменты, созданные с помощью GPT-3);
  • создание изображений на основе текста (если это звучит для вас как научная фантастика, просто посмотрите, как работает DALL-E);
  • формирование ответов на вопросы в таблицах (здесь и здесь).

И какое это имеет отношение к чат-ботам?

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

  1. Понять потребность пользователя, например смоделировать “запрос”.
  2. Извлечь информацию, например выполнить “запрос” и получить “ответ”.
  3. Выполнить действия с этой информацией, например продолжить разговор, запросить дополнительную информацию, разместить заказ и т. д. (здесь мы используем “ответ” на “запрос”).

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

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

Понимание естественного языка

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

Допустим, пользователь спрашивает: “Сколько стоит “Тысячелетний сокол?”. Здесь намерение было бы чем-то вроде “запрашиваемой цены”, а соответствующая сущность  —  “Тысячелетний сокол”. С помощью этой информации мы могли бы легко создать запрос для поиска нужной информации.

Наш разговор продолжается следующим образом.

  • Пользователь: Сколько стоит “Тысячелетний сокол”?
  • Бот: Он стоит $1.234.
  • Пользователь: Хорошо, спасибо.
  • Бот: Не за что.
  • Пользователь: А как насчет “Столетнего сокола”?
  • Бот: Он стоит $ 1.454.

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

  • Пользователь: Хорошо, а какого цвета ваш “Тысячелетний сокол”? Принимаете ли вы биткойн?

В этом случае вы можете видеть, что пользователь просит две разные вещи: цвет продукта и способ оплаты. Это ситуация с несколькими намерениями, когда пользователь сообщает две цели в одном заявлении. С помощью некоторых РЕГЭКСОВ (регулярных выражений) вы могли бы справиться с этим делом, но как насчет следующего.

  • Пользователь: Хорошо, а не могли бы вы отправить красного “Тысячелетнего сокола” на мой адрес? А вы принимаете биткоины?

Теперь в первой части предложения есть одно дополнительное намерение. В реальной ситуации все может стать намного сложнее.

  • Пользователь: Хорошо, а не могли бы вы отправить “Тысячелетнего сокола” на мой адрес?
  • Бот: У нас нет вашего адреса в файле, хотели бы вы его настроить?
  • Пользователь: О, так вы принимаете биткоины? И да, пожалуйста, добавьте адрес Скайуокер-авеню 4321.

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

Большинство помощников не имеют дело с высказываниями с одним намерением так же, как с примерами с несколькими намерениями. Проверьте это в Google.

Хорошо, вы можете подумать, что нет никакой связи между вопросом о президенте США и времени, и вы правы, поэтому попробуйте что-то вроде.

Или наоборот…

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

Теперь, возвращаясь к нашему разговору. Представьте, что система не принимает Bitcoin, но принимает Ethereum  —  что общего между этими двумя понятиями? И то, и другое  —  криптовалюты! Используя эти сходные элементы, мы могли бы дать новую рекомендацию пользователю. Подобного рода сведения иногда кодируются в сетях, называемых онтологиями, таких как WordNet и ConceptNet.

  • Бот: Боюсь, мы не принимаем Bitcoin, но мы используем Ethereum, это подходит?
  • Пользователь: О, да!

Наконец, на кассе…

  • Бот: Итак, мы отправим вам “Тысячелетнего сокола” на Скайуокер-авеню 4321, и общая сумма составит 0,62 ETH, это нормально?
  • Пользователь: Да, но подождите, можно мне его купить в красном цвете?

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

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

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

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

  • Здравствуйте, я хотел бы заказать кофе.
  • Папа, можно мне маффин? (Ребенок говорит на заднем плане).

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

  • Здравствуйте, я хотел бы заказать кофе. Хочешь маффин? (Здесь человек спрашивает кого-то другого)… и можно мне маффин?

Несколько заключительных слов. Допустим я напишу по-английски “tese probelms”. Вы, конечно, заметили тут ошибку, верно? (Надо писать “these problems”). Но когда вы разговариваете с помощником ASR (автоматическим распознавателем речи), он превратит ваш голос в текст вместе с ошибкой. Итак, мы обнаружили здесь новую проблему  —  исправление орфографической ошибки. Но тут есть еще проблема: одно дело, когда слово существует (“probelms” можно превратить в “problems”), и другое, когда не существует (нельзя изменить символы в “tese”, чтобы трансформировать его в “these”).

Конечно, вам нужно объяснить машине, что такое слова с ошибками. Это проблема обнаружения ошибок.

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

Будущее?

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

Один из любопытных открытых вопросов заключается в следующем: как объединить несколько отдельных моделей? Google (Meena) и Facebook (Blenderbot здесь и здесь) работают над решением этой проблемы. Они обучали свои модели, снабжая преобразователь реальными разговорами с целью предсказать следующий токен. Например, Blenderbot обучается с использованием последних 14 возвратов в разговоре.

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

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

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

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

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Zubair Talib: The Future of Real-World Chatbots

Предыдущая статьяСоветы по отладке JavaScript
Следующая статьяЧто нового в Python 3.10?