Перейти к основному содержимому

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СтрокаСтейт, в который произошел переход.

Примеры использования

Переопределение порядка срабатывания правил

Изменим порядок срабатывания правил активации, например, так, чтобы интенты имели приоритет над паттернами.

подсказка
Задать обработчик можно в разделе 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];
}
});

Срабатывание правила с максимальным весом

Настроим порядок активации так, чтобы приоритет был у правила с наибольшим весом — вне зависимости от того, от паттернов или интентов получен результат.

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.