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

Расширенные настройки 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"
}
}
  • 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.