Помощники AI должны выполнять две задачи: понимать пользователя и давать правильные ответы. Rasa Stack решает эти задачи с помощью компонента понимания естественного языка Rasa NLU и компонента управления диалогами Rasa Core. Основываясь на нашей работе с сообществом Rasa и клиентами со всего мира, мы теперь делимся нашими лучшими практиками и рекомендациями по настройке Rasa NLU для вашего индивидуального контекстного помощника по ИИ. Чтобы дать вам возможность глубже понять каждый компонент, мы решили разделить его на серию из трех последовательных сообщений в блоге:

  • Часть 1. Распознавание намерений - как лучше понять своих пользователей
  • Часть 2: Извлечение сущностей - выберите подходящий экстрактор для каждой сущности.
  • Часть 3: Гиперпараметры - как их выбрать и оптимизировать

Что делает НЛП для контекстных помощников ИИ таким особенным, что мы решили рассказать об этом в серии из трех сообщений в блоге? Причина в том, что контекстные помощники искусственного интеллекта могут сильно зависеть от предметной области, что означает, что они должны быть адаптированы для вашего варианта использования, так же как веб-сайты настраиваются для каждой компании. Rasa NLU обеспечивает эту полную настраиваемость, обрабатывая сообщения пользователей в так называемом конвейере. Конвейер определяет различные компоненты, которые последовательно обрабатывают пользовательское сообщение и в конечном итоге приводят к классификации пользовательских сообщений по намерениям и извлечению сущностей. Ознакомьтесь с нашим последним сообщением в блоге о пользовательских компонентах, если вы хотите узнать больше о том, как работает конвейер и как реализовать свой собственный компонент NLU.

Это сообщение в блоге знаменует начало этой серии из трех частей и предоставит вам подробную информацию о компонентах NLU, которые отвечают за понимание ваших пользователей, в том числе

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

Намерения: что говорит пользователь

Rasa использует концепцию намерений для описания того, как следует классифицировать сообщения пользователей. Rasa NLU классифицирует пользовательские сообщения на одно или несколько пользовательских намерений. Вы можете выбрать один из двух компонентов:

Предварительно обученные вложения: Sklearn классификатора намерений

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

Встраивание слов зависит от языка, на котором они были обучены. Следовательно, вы должны выбирать разные модели в зависимости от языка, который вы используете. См. Этот обзор доступных языковых моделей spaCy. Если вы хотите, вы также можете использовать разные вложения слов, например Вложения FastText от Facebook. Для этого следуйте руководству по spaCy здесь, чтобы преобразовать вложения в совместимую модель spaCy, а затем свяжите преобразованную модель с языком по вашему выбору (например, en) с помощью python -m spacy link <converted model> <language code> .

Rasa NLU берет среднее значение всех вложений слов в сообщении, а затем выполняет gridsearch, чтобы найти лучшие параметры для классификатора опорных векторов, который классифицирует усредненные вложения по различным намерениям. Gridsearch обучает несколько классификаторов опорных векторов с различными конфигурациями параметров, а затем выбирает лучшую конфигурацию на основе результатов тестирования.

Когда следует использовать этот компонент:

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

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

Контролируемые вложения: встраивание классификатора намерений TensorFlow

Классификатор намерений intent_classifier_tensorflow_embedding был разработан Расой и основан на космической статье Facebook. Вместо использования предварительно обученных встраиваний и обучения классификатора поверх этого, он обучает вложения слов с нуля. Обычно он используется с компонентом intent_featurizer_count_vectors, который подсчитывает, как часто отдельные слова ваших обучающих данных появляются в сообщении, и предоставляет это в качестве входных данных для классификатора намерений. На рисунке ниже вы можете увидеть, как векторы подсчета будут различаться для предложений Мой бот - лучший бот и Мой бот - отличный, например бот дважды появляется в Мой бот - лучший бот. Вместо использования подсчета токенов слов вы также можете использовать подсчет ngram, изменив свойство analyzer компонента intent_featurizer_count_vectors на char. Это делает классификацию намерений более устойчивой к опечаткам, но также увеличивает время обучения.

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

Когда следует использовать этот компонент:

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

Обратите внимание, что на некоторых языках (например, китайском) невозможно использовать подход Rasa NLU по умолчанию для разделения предложений на слова с использованием пробелов (пробелов, пробелов) в качестве разделителя. В этом случае вам необходимо использовать другой компонент токенизатора (например, Rasa предоставляет токенизатор Jieba для китайского языка).

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

Общие проблемы

Отсутствие обучающих данных

Когда бот фактически используется пользователями, у вас будет много разговорных данных, из которых можно будет выбрать свои обучающие примеры. Однако, особенно вначале, распространенной проблемой является то, что у вас практически нет обучающих данных, а точность ваших классификаций намерений низкая. Часто используемый подход для решения этой проблемы заключается в использовании инструмента генерации данных chatito, разработанного Родриго Пиментелом. Создание предложений из предопределенных блоков слов может быстро дать вам большой набор данных. Избегайте слишком частого использования инструментов генерации данных, так как ваша модель может чрезмерно соответствовать вашим сгенерированным структурам предложений. Мы настоятельно рекомендуем вам использовать данные ваших реальных пользователей. Другой вариант получить больше данных для обучения - это краудсорсинг, например с Amazon Mechanical Turk (mturk). По нашему опыту, интерактивная функция обучения Rasa Core также очень полезна для получения новых обучающих данных Core и NLU: когда вы на самом деле разговариваете с ботом, вы автоматически формируете свои сообщения иначе, чем когда вы думаете о потенциальных примерах в изолированной среде. .

Слова вне словарного запаса

Неизбежно пользователи будут использовать слова, для которых ваша обученная модель не имеет встраивания слов, например делая опечатки или просто используя слова, о которых вы не думали. В случае, если вы используете предварительно обученные вложения слов, вы мало что можете сделать, кроме как попробовать языковые модели, которые были обучены на более крупных корпусах. Если вы обучаете вложения с нуля с помощью классификатора intent_classifier_tensorflow_embedding, у вас есть два варианта: либо включить дополнительные обучающие данные, либо добавить примеры, которые включают OOV_token (вне -vocabulary токен). Последнее можно сделать, настроив параметр OOV_token компонента intent_classifier_tensorflow_embedding, например установив для него значение ‹OOV›, и добавив примеры, включающие токен ‹OOV› (Мой ‹OOV› - Сара). Таким образом классификатор учится работать с сообщениями, содержащими невидимые слова.

Подобные намерения

Когда намерения очень похожи, их труднее различить. То, что кажется очевидным, часто забывается при создании намерений. Представьте себе случай, когда пользователь сообщает свое имя или назначает дату. Интуитивно вы можете создать намерение provide_name для сообщения Это Сара и намерение provide_date для сообщения Это в понедельник . Однако с точки зрения NLU эти сообщения очень похожи, за исключением их сущностей. По этой причине было бы лучше создать намерение inform, которое объединяет provide_name и provide_date. Затем в ваших историях Rasa Core вы можете выбрать различные сюжетные пути, в зависимости от того, какую сущность извлек Rasa NLU.

Перекошенные данные

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

В этой статье блога отражены наши передовые практики и рекомендации, основанные на нашей повседневной работе с Rasa, чтобы идеально настроить распознавание намерений NLU в соответствии с вашими индивидуальными требованиями. Независимо от того, начали ли вы свой проект контекстного помощника по ИИ, нуждаетесь в кратчайшие сроки обучения или хотите обучить встраиванию слов с нуля: Rasa NLU дает вам полную настраиваемость для этого. После прочтения части 1 нашей серии статей Rasa NLU in Depth теперь вы должны быть уверены в том, какой компонент выбрать для классификации намерений и как его настроить.

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

Что вы можете сделать тем временем?

Первоначально опубликовано на blog.rasa.com 21 февраля 2019 г.