Как хранить литералы с помощью @entity.values ​​в Slot IBM Conversation Service?

Я пытаюсь использовать слоты в моих диалоговых узлах в разговоре с Watson, но кажется, что это не очень полезно, если вы хотите играть с массивом литералов. У меня есть объект «@email», который является шаблоном, поэтому я должен использовать .literal, если я хочу сохранить «реальное значение», отправленное пользователем, в переменной контекста. Проблема начинается, когда я пытаюсь использовать @entity.values для хранения всех значений, отправленных пользователем. На самом деле невозможно сохранить массив литералов, и я застрял на этом этапе.

Кто-нибудь разработал обходной путь для этого?


person davide sarais    schedule 20.12.2017    source источник


Ответы (1)


literal — это метод, а не атрибут. entities содержит поле location, которое можно программно использовать на уровне приложения для анализа входного текста.

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

Например:

В узле вашего слота «Тогда ответьте» добавьте следующий бит контекста.

  "context": {
    "counter": "<? entities.size() ?>",
    "literals": ""
  },

Затем создайте три дочерних узла.

Узел 1: создайте фиктивный узел, установите для условия значение true. Пусть он перейдет ко второму узлу.

Узел 2. Для второго узла задайте условие $counter > 0 и добавьте следующий код в раздел JSON.

  "context": {
    "counter": "<? $counter - 1 ?>",
    "literals": "<? entities[$counter].literal + ',' + $literals ?>"
  },

Сделайте так, чтобы он вернулся к узлу 1. Причина этого в том, что разговор не позволит вам перейти к тому же узлу.

Узел 3: выводит ответ. Например: Literal Values: $literals

Вот пример рабочего пространства.

https://pastebin.com/xwgnLq9n

Предупреждение

Watson Conversation имеет встроенную функцию обнаружения бесконечных циклов. Если узел попадает 50 раз за один запрос, он выдаст следующую ошибку:

Detected recursion when processing the node with id
[node_20_1513835954092]. This node has been already processed [50] times
in this execution step

В этот момент узел выйдет из строя, и вы не получите никакого результата. Поэтому, если вы ожидаете более 50 объектов, вам нужно сделать это на прикладном уровне.

person Simon O'Doherty    schedule 21.12.2017
comment
Большое спасибо! - person davide sarais; 21.12.2017
comment
@davidesarais не беспокойтесь. Не забудьте отметить ответ на вопрос, если это решит ваш вопрос. - person Simon O'Doherty; 21.12.2017
comment
ответ позвольте мне создать что-то близкое к желаемому. Следующая проблема, которую нужно решить, это: у меня есть узел с 2 слотами, которые могут хранить X и Y (сущности). Ваше решение полностью работает для Y, потому что пользователь может указать массив Y. Проблема начинается когда пользователь вводит первый ввод как blabla Y Y Y, поэтому Watson должен также заполнить второй слот X и запросить у пользователя X. Затем пользователь вводит X, и, наконец, поток может продолжиться с фиктивным узлом для извлечения литералов из Y - но - сущность Y в это время больше не действует! Решение заключается в том, чтобы заставить пользователя сначала ввести текст X, а затем Y или X и Y одновременно. - person davide sarais; 22.12.2017