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