selectNLUResult
При совместном использовании в одном сценарии нескольких типов правил активации они срабатывают в порядке убывания приоритета:
- Паттерны.
- Примеры и группы примеров.
- Интенты.
Если такое поведение нежелательно, вы можете самостоятельно определить механизм выбора нужного правила при одновременном срабатывании правил разных типов.
Задание обработчика
Для настройки нужного поведения необходимо в сценарии задать обработчик selectNLUResult
и передать его в функцию bind
:
bind("selectNLUResult", function($context) {
// ...
});
Объект с текущим контекстом, который принимает функция-обработчик в качестве аргумента, содержит вложенный объект nluResults
со следующей структурой:
{
"patterns": [
// Все правила активации, которые вернул классификатор на паттернах
],
"examples": [
// Правила, которые вернул классификатор на примерах
],
"intents": [
// Правила от классификатора на интентах
],
"selected": {
// Выбранное правило активации
}
}
Чтобы переопределить примененное правило активации, запишите нужное значение в nluResults.selected
.
Примеры использования
Переопределение порядка срабатывания правил
Изменим порядок срабатывания правил активации, например, так, чтобы интенты имели приоритет над паттернами.
Задать обработчик можно в разделе init
либо в отдельном файле с расширением .js
, который затем нужно подключить в сценарий при помощи тега require
.
bind("selectNLUResult", function($context) {
// Для отладки выведем результаты в лог.
log($context.nluResults);
if ($context.nluResults.intents.length > 0) {
// Если есть хотя бы один результат от классификатора на интентах, используем первый результат.
$context.nluResults.selected = $context.nluResults.intents[0];
return;
}
if ($context.nluResults.patterns.length > 0) {
// Если результата от интентов нет, но есть результат от паттернов, используем паттерны.
$context.nluResults.selected = $context.nluResults.patterns[0];
return;
}
if ($context.nluResults.examples.length > 0) {
// Если нет результата от интентов и паттернов, используем результат от примеров.
$context.nluResults.selected = $context.nluResults.examples[0];
}
});
Срабатывание правила с максимальным весом
Настроим порядок активации так, чтобы приоритет был у правила с наибольшим весом — вне зависимости от того, от паттернов, примеров или интентов получен результат.
bind("selectNLUResult", function($context) {
// Получим все результаты от всех классификаторов в виде массива.
var allResults = _.chain($context.nluResults)
.omit("selected")
.values()
.flatten()
.value();
// Сосчитаем максимальное значение `score` среди всех результатов.
var maxScore = _.chain(allResults)
.pluck("score")
.max()
.value();
// Запишем в `nluResults.selected` результат с максимальным весом.
$context.nluResults.selected = _.findWhere(allResults, {
score: maxScore
});
});
В примере используются возможности библиотеки Underscore.js.