JAICP

selectNLUResult


При совместном использовании в одном сценарии нескольких типов правил активации они срабатывают в порядке убывания приоритета:

  1. Паттерны.
  2. Примеры и группы примеров.
  3. Интенты.

Если такое поведение нежелательно, вы можете самостоятельно определить механизм выбора нужного правила при одновременном срабатывании правил разных типов.

Задание обработчика

Для настройки нужного поведения необходимо в сценарии задать обработчик 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.