Расширенные настройки 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 яблок. При активном параметре запрос пользователя Мне нужно яблок не попадет в интент, так как в запросе нет системной сущности.
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_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 → Интенты вы можете использовать Тренировочные фразы на языках, которые не поддерживаются платформой. Они будут распознаны в сценарии.
- Установите