Расширенные настройки NLU
При редактировании настроек проекта вы можете задать новые параметры для настройки NLU. Параметры передаются в виде JSON-объекта.
Чтобы обучить классификатор с новыми настройками:
- На боковой панели перейдите в раздел NLU → Интенты.
- В правом нижнем углу нажмите Тестировать.
Общие настройки
К общим настройкам относятся параметры, не зависящие от алгоритма классификатора в проекте:
{
"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 яблок. При активном параметре запрос пользователя Мне нужно яблок не попадет в интент, так как в запросе нет системной сущности.
Слишком тонкие настройки NLU могут уменьшить качество классификации при добавлении новых тренировочных фраз. Кроме того, настройки, адаптированные под один проект, могут не подойти для другого.
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_filters | 512 | 1024 | 1024 | 1024–2048 | 1024–2048 |
emb_drp | 0.5 | 0.4–0.5 | 0.3–0.5 | 0.3–0.4 | 0.3–0.4 |
cnn_drp | 0.5 | 0.4–0.5 | 0.3–0.5 | 0.3–0.4 | 0.3–0.4 |
bs | 16–32 | 32 | 32–64 | 32–128 | 64–128 |
n_epochs | 7–15 | 4–7 | 3–5 | 3 | 3 |
lr | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 |
pooling_name | «max» | «max» | «max» | «max» или «concat» | «max» или «concat» |
Transformer
Сервис классификации Transformer Caila. Если в своем проекте вы выбрали этот тип классификатора, то при помощи расширенных настроек вы можете:
развернут на платформе- Изменить настройки обучения Transformer для стандартного сервиса.
- Использовать вместо стандартного сервиса любой другой классификатор из Caila. Ознакомьтесь с примерами такой интеграции в статье Подключение сервисов Caila в JAICP.
Изменение настроек обучения
Вы можете изменить настройки обучения:
- Если вы используете стандартный сервис.
- Если вы сами подключаете классификатор
text-classifier-logreg-caila-roberta
илиtext-classifier-logreg-labse
.
Укажите следующие настройки в секции 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
.
- Сервис из каталога caila.io/catalog/just-ai/FAQ:
-
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
— имя классификатора.
Использование
В проекте JAICP вы можете:
-
Использовать сущности и интенты внешнего NLU-сервиса.
-
Использовать сущности внешнего NLU-сервиса и интенты NLU-ядра.
- Установите
"nluType": "external"
для параметраner
и"nluType": "internal"
дляmarkup
иclassification
. - Использование сущностей внешнего NLU-сервиса при настройке интентов и слотов не будет доступно.
- В сценарии сущности доступны по тегу
q
.
- Установите
-
Использовать интенты внешнего NLU-сервиса и сущности NLU-ядра.
- Установите
"nluType": "external"
для параметраclassification
и"nluType": "internal"
дляmarkup
иner
. - В сценарии интенты доступны по тегу
intent
.
- Установите
-
Использовать разметку внешнего NLU-сервиса с сущностями и интентами NLU-ядра.
- Установите
"nluType": "external"
для параметраmarkup
и"nluType": "internal"
дляclassification
иner
. - В разделе NLU → Интенты вы можете использовать Тренировочные фразы на языках, которые не поддерживаются платформой. Они будут распознаны в сценарии.
- Установите