selectNLUResult
При совместном использовании в одном сценарии нескольких типов правил активации они срабатывают в порядке убывания приоритета: сначала паттерны, затем интенты.
Если такое поведение нежелательно, вы можете самостоятельно определить механизм выбора нужного правила при одновременном срабатывании правил разных типов.
Задание обработчика
Для настройки нужного поведения необходимо в сценарии задать обработчик selectNLUResult
и передать его в функцию bind
:
bind("selectNLUResult", function($context) {
// ...
});
Функция-обработчик принимает в качестве аргумента объект с текущим контекстом.
Он содержит вложенный объект nluResults
.
Объект nluResults
{
"patterns": [
// Массив со всеми правилами активации, которые вернул классификатор на паттернах.
],
"intents": [
// Массив со всеми правилами от классификатора на интентах.
],
"selected": {
// Объект с выбранным правилом активации.
}
}
nluResults.selected
.В массивах, которые содержатся в nluResults
, находятся объекты со следующими полями:
Поле | Тип | Описание |
---|---|---|
clazz | Строка | Путь к стейту, в который попал запрос. |
score | Число | Вес, с которым сработало правило активации. |
pt | Объект | Алиас для поля parseTree . |
debugInfo | Объект | Служебная информация о сработавшем правиле. |
answer | Строка | Ответ на интент. Отсутствует у паттернов и у ответов из базы знаний Q&A. |
ruleType | Строка | Тип сработавшего правила: pattern , intent или intentGroup . |
priority | Число | Приоритет интента. Имеет значение, если у интентов одинаковый вес и контекстное расстояние до стейта. Отсутствует у паттернов. |
content | Объект | Поле содержит массив replies , в котором находится информация об ответах из базы знаний Q&A: type — тип ответа. text , image , audio , file — содержание ответа. |
distance | Число | Контекстное расстояние до стейта, в который попал запрос. |
locator | Объект | Объект содержит поля: filename — имя файла, в котором находится стейт. line — номер строки в редакторе кода, на которой начинается стейт. col — номер первого символа паттерна, интента или события, который указан после тега активации, по которому запрос попал в стейт. Используется обратная нумерация, т. е. справа налево. storageType — место хранения файла, в котором содержится стейт. Возможные значения: "SYSTEM" , "GIT" , "LOCAL" , "RUNTIME" . |
parseTree | Объект | Полное дерево разбора запроса. |
targetState | Строка | Стейт, в который произошел переход. |
Примеры использования
Переопределение порядка срабатывания правил
Изменим порядок срабатывания правил активации, например, так, чтобы интенты имели приоритет над паттернами.
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];
}
});
Срабатывание правила с максимальным весом
Настроим порядок активации так, чтобы приоритет был у правила с наибольшим весом — вне зависимости от того, от паттернов или интентов получен результат.
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
});
});