Перейти к основному содержимому

Расширенные настройки NLU

При редактировании настроек проекта вы можете задать новые параметры для настройки NLU. Параметры передаются в виде JSON-объекта.

предупреждение

Чтобы обучить классификатор с новыми настройками:

  1. На боковой панели перейдите в раздел NLUИнтенты.
  2. В правом нижнем углу нажмите Тестировать.

Общие настройки

К общим настройкам относятся параметры, не зависящие от алгоритма классификатора в проекте:

{
"classificationAlgorithmVersion": 1,
"patternsEnabled": true,
"tokenizerEngine": "udpipe",
"dictionaryAutogeneration": true
}
  • classificationAlgorithmVersion — версия классификатора. Возможные значения:

    • null — версия в ранее созданных проектах. В ней алгоритм STS не всегда распознает самый длинный вариант сущности во фразе.
    • 1 — актуальная версия с улучшенным STS. Это значение указывается по умолчанию при создании нового проекта.
    предупреждение

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

  • patternsEnabled — при активном параметре в тренировочных фразах доступно использование паттернов.

  • tokenizerEngine — токенизатор, который будет выполнять токенизацию и лемматизацию текста.

  • dictionaryAutogeneration — при активном параметре пользовательский словарь заполняется согласно содержимому сущностей.

tokenizerEngine

Для разных языков NLU доступны разные движки токенизации.

Язык NLUТокенизаторыПримечания
Русскийudpipe
mystem
morphsrus
Токенизаторы mystem и morphsrus предназначены для миграции проектов на NLU.
Китайскийpinyin
Португальскийudpipe
Казахскийkaznlp
Другие языкиspacy

STS

Параметры для классификатора STS по умолчанию:

{
"allowedPatterns": [],

"stsSettings": {
"exactMatch": 1.0,
"lemmaMatch": 0.95,
"jaccardMatch": 0.5,
"jaccardMatchThreshold": 0.82,
"acronymMatch": 1.0,
"synonymMatch": 0.5,
"synonymContextWeight": 0.0,
"patternMatch": 1,
"throughPatternMatch": 0.8,
"wordSequence1": 0.8,
"wordSequence2": 0.9,
"wordSequence3": 1.0,
"idfShift": 0.0,
"idfMultiplier": 1.0,
"namedEntitiesRequired": false
}
}
  • allowedPatterns — список сущностей, для которых включен параметр Автоматически расширять интенты.

  • exactMatch — коэффициент, на который умножается вес слова при полном совпадении слов в запросе клиента и в одной из тренировочных фраз. Например, дом и дом.

  • lemmaMatch — коэффициент, на который умножается вес слова при совпадении слов по словарным формам (леммам). Например, дома и дом.

  • jaccardMatch — коэффициент, на который умножается вес слова при совпадении слов по мере Жаккара. jaccardMatch срабатывает, если:

    • Слова совпадают по символам, но символы расположены в разном порядке. Например, дома и мода.
    • Слова почти совпадают по символам, а их мера сходства больше или равна jaccardMatchThreshold. Например, компьютер и компютер.
  • jaccardMatchThreshold — минимальное значение меры Жаккара. По умолчанию параметр jaccardMatch учитывает совпадение двух слов, если их мера сходства больше или равна 0.82.

  • acronymMatch — коэффициент, на который умножается вес словосочетания при совпадении словосочетания и его аббревиатуры. Аббревиатуры определяются с помощью регулярного выражения. Например, Московский государственный университет и МГУ.

  • synonymMatch — коэффициент, на который умножается вес слова при совпадении по синониму. Готовый словарь синонимов встроен в NLU и поддерживается только для русского языка.

  • synonymContextWeight — коэффициент, на который штрафуется вес синонима:

    • При "synonymContextWeight": 0.0 синоним не штрафуется.
    • При "synonymContextWeight": 1.0 вес синонима существенно снижается.
  • patternMatch — коэффициент, на который умножается вес слова при совпадении по сущности, указанной в тренировочной фразе.

    Например, в интенте есть фраза Позови @agent. Сущность @agent содержит синонимы консультант, специалист и оператор. Если пользователь напишет боту Позови оператора, слово оператор распознается как сущность, и его вес будет умножен на значение patternMatch.

  • throughPatternMatch — коэффициент, на который умножается вес слова при совпадении по сущности, указанной в allowedPatterns.

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

    • На wordSequence1 умножается вес первого слова в последовательности.
    • На wordSequence2 умножается вес второго слова в последовательности.
    • На wordSequence3 умножается вес третьего слова в последовательности. Четвертое и последующие слова также будут умножаться на значение wordSequence3. Рекомендуется варьировать эти параметры в промежутке от 0 не включительно до 1 включительно. Сохраняйте соотношение wordSequence1 < wordSequence2 < wordSequence3.

    Например, в интенте есть тренировочная фраза Хочу купить курс по очень выгодной цене. Пользователь пишет боту Решил вот купить курс у вас по очень выгодной цене. Алгоритм находит совпадающие последовательности:

    ПоследовательностьСловоМножитель веса слова
    купитькупитьwordSequence1
    купить курскурсwordSequence2
    попоwordSequence1
    по оченьоченьwordSequence2
    по очень выгоднойвыгоднойwordSequence3
    по очень выгодной ценеценеwordSequence3
  • idfShift и idfMultiplier — параметры, которые влияют на расчет веса слова через IDF. Не рекомендуется менять их значения.

  • namedEntitiesRequired — при активном параметре в запросе пользователя должна быть найдена системная сущность, чтобы запрос попал в интент.

    Например, в интент была добавлена фраза с системной сущностью Мне нужно @duckling.number яблок. При активном параметре запрос пользователя Мне нужно яблок не попадет в интент, так как в запросе нет системной сущности.

Classic ML

Параметры для классификатора Classic ML:

{
"classicMLSettings": {
"C": 1,
"lang": "ru",
"word_ngrams": [
1,
2
],
"lemma_ngrams": [
0
],
"stemma_ngrams": [
1,
2
],
"char_ngrams": [
3,
4
],
"lower": true,
"useTfIdf": false,
"min_document_frequency": 1
}
}
  • C — коэффициент регуляризации, с помощью которого можно контролировать переобучение модели. Используется при работе с большими значениями коэффициентов целевой функции, штрафует их на величину параметра. Принимает следующие значения: 0.01, 0.1, 1, 10.

  • word_ngrams — количество слов, которые будут объединены в словосочетания. При значении "word_ngrams": [2, 3] будут использованы словосочетания из двух и трех слов. Например, для фразы я люблю зеленые яблоки будут составлены словосочетания:

    • я люблю,
    • люблю зеленые,
    • зеленые яблоки,
    • я люблю зеленые,
    • люблю зеленые яблоки.
    предупреждение
    Не рекомендуется использовать значение параметра больше 3.
  • lemma_n_grams — количество слов, которые будут приведены в нормальную форму и объединены в словосочетания. При значении "lemma_n_grams": [2] будут использованы словосочетания из двух слов. Например, для фразы я люблю зеленые яблоки будут составлены словосочетания:

    • я любить,
    • любить зеленый,
    • зеленый яблоко.
    предупреждение
    Не рекомендуется использовать значение параметра больше 3.
  • stemma_ngrams — количество стемов, которые будут объединены в словосочетания. Стем — основа слова, не обязательно совпадает с морфологическим корнем слова. При значении "stemma_ngrams": [2] будут использованы словосочетания из двух стемов. Например, для фразы я люблю зеленые яблоки будут составлены словосочетания:

    • я любл,
    • любл зелен,
    • зелен яблок.
    предупреждение
    Не рекомендуется устанавливать значение для stemma_ngrams больше 3 и использовать параметр stemma_ngrams вместе с lemma_n_grams, поскольку модель может переобучиться.
  • char_n_grams — количество символов, которые рассматриваются в качестве отдельной единицы. Например, при значении "char_n_grams": [5] фраза зеленые яблоки преобразуется в набор:

    • зелен,
    • елены,
    • леные и т. д.
  • lower — при значении true все фразы приводятся к нижнему регистру.

  • useTfIdf — параметр определяет, какой алгоритм использовать при векторизации тренировочных фраз. Значение по умолчанию — false.

    • Если true, используется TF-IDF. Он вычисляет значимость слова или выражения в контексте всех тренировочных фраз. Рекомендуется для проектов с небольшой выборкой, чтобы повысить качество распознавания интентов. Векторизация будет проходить медленнее, чем при значении false, но ее качество будет выше.
    • Если false, используется CountVectorizer. Он вычисляет, как часто слова или выражения встречаются в интенте. Рекомендуется для проектов со средней или большой выборкой. Векторизация будет проходить быстрее, но при работе с небольшой выборкой точность алгоритма будет снижаться.
  • min_document_frequency — минимальная частота, с которой слово должно встречаться в тренировочных фразах, чтобы оно учитывалось при векторизации и классификации. Значение по умолчанию — 1.

    • Если вы работаете со средней или большой выборкой, повысьте значение параметра, чтобы ускорить обучение классификатора. Слова, которые редко встречаются в выборке, не будут учитываться.
    • Если вы работаете с небольшой выборкой, менять значение по умолчанию не рекомендуется.

Deep Learning

Параметры для классификатора Deep Learning:

{
"cnnSettings": {
"lang": "ru",
"kernel_sizes": [
1,
2
],
"n_filters": 1024,
"emb_drp": 0.25,
"cnn_drp": 0.25,
"bs": 64,
"n_epochs": 15,
"lr": 0.001,
"pooling_name": "max"
}
}
  • lang — язык классификатора:

    • Если значение не указано, то по умолчанию используется язык из настроек проекта.

    • Если вы укажете значение multi, классификатор сможет обрабатывать фразы на 275 языках BPEmb. Добавьте в интенты тренировочные фразы на каждом из языков, которые должен понимать бот.

      подсказка

      Мы рекомендуем также указывать значение multi, если запросы пользователей содержат символы из разных алфавитов. Это поможет снизить количество ложных срабатываний интентов.

  • kernel_sizes — список размеров сверточных ядер. Сверточное ядро — размер контекстного окна, на которое классификатор будет обращать внимание. Например, "kernel_sizes": [3] означает, что модель будет находить признаки в тексте, основываясь на всех тройках соседних слов. Для одной модели может быть задано несколько сверточных ядер.

  • n_filters — количество фильтров. Один фильтр — это определенный паттерн, выученный моделью. Для каждого ядра модель имеет свой набор паттернов. Например, если указать "kernel_sizes": [2, 3] и "n_filters": 512, то всего фильтров будет 1024 (на каждое ядро по 512).

  • emb_drp — вероятность исключения нейрона на первом скрытом слое. Метод исключения искусственно отключает часть весов в процессе обучения, чтобы избежать переобучения нейронной сети. Благодаря ему сеть не только запоминает весь набор данных, но и сохраняет способность к обобщению информации. Принимает значение от 0 до 1.

  • cnn_drp — вероятность исключения нейрона на сверточных слоях сети.

  • bs — размер входного пакета для обучения. Параметр определяет, какое количество тренировочных примеров будет подаваться на входной слой сети за один шаг в процессе обучения. Если в выборке менее 3 000 примеров, рекомендуемое значение составляет 16–32. При большой выборке это значение может составить 32–128.

  • n_epochs — количество эпох обучения. Параметр определяет, сколько раз модель увидит все тренировочные данные.

  • lr — коэффициент скорости обучения. Множитель, с которым модель будет обновлять свои веса в процессе обучения.

  • pooling_name — стратегия агрегации. После нахождения паттернов во входной строке модель должна их обобщить перед финальным классификационным слоем. Стратегии агрегации: max, mean, concat.

Параметры для классификатора Deep Learning:

ПараметрОбъем выборки
1–3 тысячи примеров3–10 тысяч примеров10–30 тысяч примеров30–100 тысяч примеровБолее 100 тысяч примеров
kernel_sizes[2, 3][2, 3] или [2, 3, 4][2, 3] или [2, 3, 4][2, 3, 4][2, 3, 4]
n_filters512102410241024–20481024–2048
emb_drp0.50.4–0.50.3–0.50.3–0.40.3–0.4
cnn_drp0.50.4–0.50.3–0.50.3–0.40.3–0.4
bs16–323232–6432–12864–128
n_epochs7–154–73–533
lr0.0010.0010.0010.0010.001
pooling_name«max»«max»«max»«max» или «concat»«max» или «concat»

Transformer

Сервис классификации Transformer развернут на платформе Caila. Если в своем проекте вы выбрали этот тип классификатора, то при помощи расширенных настроек вы можете:

Изменение настроек обучения

Вы можете изменить настройки обучения:

Укажите следующие настройки в секции mlp.trainingModel.config:

"mlp": {
"trainingModel": {
"config": {
"regularizationCoefficient": 1.0,
"maxNumIterations": 100,
"toLowercase": true,
"doRemovePunctuations": true
}
}
}

Здесь:

  • regularizationCoefficient — коэффициент регуляризации. С помощью него вы можете контролировать переобучение модели:

    • При значениях меньше 1.0 модель может недообучиться и не выявить закономерности в данных.
    • При высоких значениях — модель может переобучиться и запомнить только обучающие данные.

    Значение по умолчанию: 1.0.

  • maxNumIterations — максимальное количество итераций для обучения:

    • Если указано мало итераций, например 10, то модель может не успеть обучиться.
    • Если указано слишком много итераций, например 1000, то модель может переобучиться и запомнить только обучающие данные.

    Значение по умолчанию: 100.

  • toLowercase — приводить тексты к нижнему регистру. Если значение true:

    • Все данные во время обучения будут приводиться к нижнему регистру.
    • В сценарии регистр будет игнорироваться во время классификации запросов пользователей.

    Значение по умолчанию: false.

  • doRemovePunctuations — удалять из текстов все знаки пунктуации, кроме знаков в URL, датах, времени и email. Если значение true:

    • Знаки пунктуации будут удаляться во время обучения.
    • В сценарии знаки пунктуации будут игнорироваться во время классификации запросов пользователей.

    Значение по умолчанию: false.

подсказка

Значения параметров toLowercase и doRemovePunctuations передаются в predict-конфигурацию сервиса Caila. Поэтому они влияют на классификацию запросов в сценарии.

Подключение другого классификатора

примечание

В описании настроек ниже используются такие понятия, как базовый сервис, производный сервис, predict-конфигурация. Вы можете ознакомиться с ними в документации Caila.

Параметры для классификатора Transformer:

{
"mlp": {
"restUrl": "https://caila.io",
"mlpAccessKey": "1234567.8.xxxxxxxxxxx",
"noTraining": false,
"trainingModel": {
"account": "just-ai",
"model": "text-classifier-logreg-labse",
"config": {
"regularizationCoefficient": 1.0,
"maxNumIterations": 100,
"toLowercase": true,
"doRemovePunctuations": true
}
},
"derivedModel": {
"account": "1000005",
"model": "my-little-wizard",
"token": "8765432.1.xxxxxxxxxxx"
},
"nerModels": [
{
"account": "just-ai",
"model": "ner-duckling",
"config": {
"language": "ru",
"version": "v1"
}
}
],
"markup": {
"account": "just-ai",
"model": "ner-duckling",
"config": {}
}
}
}
  • restUrl — адрес сервера Caila. Если вы указываете этот параметр, обязательно также задать mlpAccessKey.

  • mlpAccessKey — токен доступа к Caila. Токены создаются в интерфейсе Caila в разделе Мое пространствоAPI-токены.

  • noTraining — этот флаг указывает, что JAICP не должна запускать обучение сервиса в Caila при публикации бота. Используйте этот параметр, если сервис обновляется вручную.

  • trainingModel — параметры базового сервиса, от которого нужно создать производный сервис:

    • account — ID аккаунта, из-под которого создан сервис.

    • model — ID сервиса. Оба идентификатора могут быть как строковыми, так и числовыми.

      Где найти значения account и model

      Оба идентификатора можно найти в URL карточки сервиса, например:

      • Сервис из каталога caila.io/catalog/just-ai/FAQ: account = just-ai, model = FAQ.
      • Личный сервис caila.io/workspace/model/12345/67890: account = 12345, model = 12345.
    • config — настройки обучения. Указывайте только для text-classifier-logreg-caila-roberta и text-classifier-logreg-labse.

  • derivedModel — параметры производного сервиса. Одновременно можно указать либо только trainingModel, либо только derivedModel. Если указать оба параметра, будет ошибка.

    • token — токен доступа к производному сервису, необязательный параметр. Указывайте его, если используете приватный сервис из другого аккаунта.
  • nerModels — список сервисов для распознавания именованных сущностей. Для каждого сервиса помимо основных параметров можно задать config — predict-конфигурацию сервиса.

  • markup — параметры сервиса для морфологической разметки текста. Для сервиса помимо основных параметров можно задать config — predict-конфигурацию сервиса.

    примечание

    Если вы хотите использовать параметры nerModels и markup, также нужно добавить настройки внешнего NLU-сервиса и установить nluType для нужных провайдеров в значение mlp:

    {
    "externalNluSettings": {
    "nluProviderSettings": {
    "markup": {
    "nluType": "mlp",
    "url": null
    },
    "ner": {
    "nluType": "mlp",
    "url": null
    },
    "classification": {
    "nluType": "mlp",
    "url": null
    }
    }
    }
    }

Внешний NLU-сервис

К JAICP можно подключить внешний NLU-сервис с помощью Model API. Вы можете использовать сторонние сервисы для распознавания именованных сущностей и интентов в проектах JAICP.

Чтобы подключить внешний NLU-сервис к проекту, используйте в расширенных настройках поле externalNluSettings:

{
"externalNluSettings": {
"nluProviderSettings": {
"markup": {
"nluType": "external",
"url": "http://example.com"
},
"ner": {
"nluType": "external",
"url": "http://example.com"
},
"classification": {
"nluType": "external",
"url": "http://example.com"
}
},
"language": "ja",
"nluActionAdditionalProperties": {
"markup": null,
"ner": null,
"classification": {
"modelId": "123",
"classifierName": "example",
"properties": null
}
}
}
}
  • nluProviderSettings — объект, определяющий, где будет выполняться действие NLU.

  • markup — параметры для запросов на разметку.

  • nluType — тип NLU. Может быть установлен внешний external или внутренний internal NLU.

  • ner — параметры для распознавания именованных сущностей.

  • classification — параметры для запросов на классификацию интентов.

  • language — язык внешнего NLU. Если не установлен, будет использован язык из настроек проекта.

  • nluActionAdditionalProperties — дополнительные настройки для внешнего NLU-сервиса.

  • modelID — ID модели классификатора.

  • classifierName — имя классификатора.

Использование

предупреждение
В проекте нельзя одновременно использовать интенты и сущности от внешнего NLU-сервиса и от NLU-ядра.

В проекте JAICP вы можете:

  1. Использовать сущности и интенты внешнего NLU-сервиса.

    • Установите "nluType": "external" для параметров markup, ner и classification.
    • В сценарии интенты доступны по тегу intent, а сущности — по тегу q.
    • Визуальная настройка в разделе NLU для интентов и сущностей внешнего NLU-сервиса не поддерживается.
  2. Использовать сущности внешнего NLU-сервиса и интенты NLU-ядра.

    • Установите "nluType": "external" для параметра ner и "nluType": "internal" для markup и classification.
    • Использование сущностей внешнего NLU-сервиса при настройке интентов и слотов не будет доступно.
    • В сценарии сущности доступны по тегу q.
  3. Использовать интенты внешнего NLU-сервиса и сущности NLU-ядра.

    • Установите "nluType": "external" для параметра classification и "nluType": "internal" для markup и ner.
    • В сценарии интенты доступны по тегу intent.
  4. Использовать разметку внешнего NLU-сервиса с сущностями и интентами NLU-ядра.

    • Установите "nluType": "external" для параметра markup и "nluType": "internal" для classification и ner.
    • В разделе NLU → Интенты вы можете использовать Тренировочные фразы на языках, которые не поддерживаются платформой. Они будут распознаны в сценарии.
подсказка
Вы можете ознакомиться с примером внешнего NLU-сервиса в репозитории на GitHub.