Расширенные настройки NLU
При редактировании настроек проекта вы можете задать новые параметры для настройки NLU. Параметры передаются в виде JSON-объекта.
Общие настройки
К общим настройкам относятся параметры, не зависящие от алгоритма классификатора в проекте:
{
"patternsEnabled": true,
"tokenizerEngine": "udpipe",
"dictionaryAutogeneration": true
}
patternsEnabled
— при активном параметре в тренировочных фразах доступно использование паттернов.tokenizerEngine
— токенизатор, который будет выполнять токенизацию и лемматизацию текста.dictionaryAutogeneration
— при активном параметре пользовательский словарь заполняется согласно содержимому сущностей.
tokenizerEngine
Для разных языков NLU доступны разные движки токенизации.
Язык NLU | Токенизаторы | Примечания |
---|---|---|
Русский | udpipe mystem morphsrus | Токенизаторы mystem и morphsrus предназначены для миграции проектов на CAILA. |
Китайский | 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
— коэффициент, на который умножается вес слова при совпадении по синониму. Готовый словарь синонимов встроен в CAILA и поддерживается только для русского языка.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" |
Внешний 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-сервиса и интенты CAILA.
- Установите
"nluType": "external"
для параметраner
и"nluType": "internal"
дляmarkup
иclassification
. - Использование сущностей внешнего NLU-сервиса при настройке интентов и слотов не будет доступно.
- В сценарии сущности доступны по тегу
q
.
- Установите
Использовать интенты внешнего NLU-сервиса и сущности CAILA.
- Установите
"nluType": "external"
для параметраclassification
и"nluType": "internal"
дляmarkup
иner
. - В сценарии интенты доступны по тегу
intent
.
- Установите
Использовать разметку внешнего NLU-сервиса с сущностями и интентами CAILA.
- Установите
"nluType": "external"
для параметраmarkup
и"nluType": "internal"
дляclassification
иner
. - В разделе CAILA → Интенты вы можете использовать Тренировочные фразы на языках, которые не поддерживаются платформой. Они будут распознаны в сценарии.
- Установите