Диалоговое окно createIntent, приводящее к заполнению нечетных слотов списками, если вы не зайдете в консоль и не нажмете «Сохранить» - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь использовать SDK Dialogflow Node (с использованием v2 API) версии 0.8.2 для создания намерения, которое выполняет заполнение слота созданной пользователем сущностью, определенной мной.

На высоком уровне,У меня есть и тип объекта (еда), который поступает из внешней базы данных, которую я не контролирую.У меня есть несколько примеров продуктов со следующими категориями -> Списки экземпляров:

Junk food -> [beer, doughnuts, pizza]
Meat, Dairy or Eggs -> [steak, 'eggs, brown', 'eggs, green', ham]
...

Я немного опасаюсь присутствия запятых и союзов / дизъюнкций в синонимах и канонических именах экземпляров, происходящих из этого внешнегобаза данных;но как человек, управляемый данными;Я бы предпочел отказаться от простой реализации, если на этом этапе есть причина.

В любом случае, главное намерение, которое я хочу сейчас, - ответить на такие вопросы, как:

do you guys have ham, doughnuts or pizza?
can I get broccoli here?
do you offer beer, steak, radishes, ketchup or asparagus?
...

Идея состоит в том,что клиент может запросить об одном или любом количестве товаров.Очевидный способ сделать это (для меня) - создать намерение с примерами обучения и указать один параметр для заполнения слотов, для которого установлено isList=true.

Что я пытаюсь сделать более технически?

Мне нужно иметь возможность управлять агентом Dialogflow из кода с помощью Node SDK.Сущности и намерения будут генерироваться другим инструментом, который просматривает внешние API, базы данных и т. Д. И помогает мне автоматически генерировать некоторый контент для управления разговором.

Сейчас я отправляю запрос createIntent с примерно 6 примерами обучения для тестирования.Примерно так:

 "intent": {
  "displayName": "test-complex-list",
  "trainingPhrases": [
   {
    "type": "EXAMPLE",
    "parts": [
     {
      "text": "do you have "
     },
     {
      "text": "pizza",
      "entityType": "@food",
      "userDefined": true,
      "alias": "food"
     },
     {
      "text": " or "
     },
     {
      "text": "beer",
      "entityType": "@food",
      "userDefined": true,
      "alias": "food"
     },
     {
      "text": "?"
     }
    ]
   },

...

 "parameters": [
   {
    "displayName": "food",
    "entityTypeDisplayName": "@food",
    "isList": true
   }
  ]

...

Я получаю ответ об успешном возвращении из Dialogflow API ... ууу!

Теперь я переворачиваюсь на консоль Dialogflow для проверки, прежде чем двигаться вперед, ивведите: do you have ham, doughnuts or pizza? в верхнюю правую область текста теста.Ответ, который я вижу, указывает, что правильное намерение было обнаружено, но я возвращаюсь: Parameter=food и Value=[Meat, Dairy or Eggs].Кажется, он не подхватил мою нездоровую пищу (эй, может быть, Dialogflow полезен).

Я вспомнил, как тестировал этот вариант использования в консоли раньше, и он работал;поэтому я нажимаю «Сохранить», жду «Обучение агента завершено», а затем снова вставляю свой запрос.На этот раз значение заполнения слота составляет [ "Meat, Dairy or Eggs", "Junk Food", "Junk Food" ] ... именно то, что я ожидал.

Мой вопрос такой: : какая черная магия происходит, когда я нажимаю «Сохранить» вконсоль Dialogflow?Я экспортировал агент в файл .zip до и после «сохранения» и вывел результаты.Похоже, единственное отличие состоит в том, что идентификаторы, которые присваиваются различным элементам агента, различны.

На самом деле нет проблем с другими моими намерениями (здесь опущены), но это, пожалуй, самое сложное.

Я подозреваю, что это ошибка в Dialogflow;но прежде чем жаловаться, я подумал, что изучу более вероятный вариант (я что-то упустил).

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