В последние несколько лет мы стали свидетелями гонки между компаниями за создание самой большой, самой мощной и самой интересной модели под названием 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);
- формирование ответов на вопросы в таблицах (здесь и здесь).
И какое это имеет отношение к чат-ботам?
Вообще-то говоря, коммерческие чат-боты (в отличие от обычных доменных чат-ботов) должны решать три задачи.
- Понять потребность пользователя, например смоделировать “запрос”.
- Извлечь информацию, например выполнить “запрос” и получить “ответ”.
- Выполнить действия с этой информацией, например продолжить разговор, запросить дополнительную информацию, разместить заказ и т. д. (здесь мы используем “ответ” на “запрос”).
Процесс понимания потребности пользователя обычно включает в себя обнаружение намерений и классов-сущностей. С помощью этой информации система может создать запрос (например, с помощью 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 позволит свершиться чуду.
И последнее, но не менее важное: модели генерации текста звучат все более и более по-человечески, но все они имеют большой недостаток, заключающийся в том, что их результат действительно трудно контролировать. Сообщество ИИ работает над тем, чтобы модели не генерировали оскорбительные выражения, и вокруг этой темы идет много дискуссий.
Читайте также:
- Чем отличается разработка продукта для ИИ
- ИИ-технологии на службе у инфлюенс-маркетинга
- Будет ли ИИ главенствовать в 2021 году? Большой вопрос
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Zubair Talib: The Future of Real-World Chatbots