Как построить естественный поток разговора с помощью диалога? - PullRequest
0 голосов
/ 20 февраля 2020

Я создаю чат-бота с помощью Dialogflow. Это помогает пользователям получать некоторую информацию, например, часы работы, контактную информацию и т. Д. c. врачей. Я создал три намерения определить, когда пользователь хочет знать рабочее время, контактную информацию или адрес офиса. Так, например, пользователь может спросить бота: «Каков адрес электронной почты доктора Грина?». Работает правильно. Но я хочу достичь и этого результата:

User: When can I find Dr Green in his office?
Bot: answer with office hours
User: Where is his office?
Bot: answers with address
User: what is his email?
Bot: answers with email
User: what about the phone?
Bot: phone number

Я частично достиг этого результата с помощью Follow-Up Intents, но я думаю, что это не правильный путь. В настоящее время у меня есть структура:

  • Намерение контакта

    • Сопровождение - Часы работы офиса
    • Сопровождение - Адрес офиса
  • Часы работы офиса

    • Последующие действия - контакт
    • Последующие действия - адрес офиса
  • Адрес офиса Намерение

    • Сопровождение - Часы работы офиса
    • Сопровождение - Контактная информация

Я хотел бы Попробуйте объединить два намерения, относящиеся к служебной информации, но, прежде всего, я хотел бы разрешить разговор, подобный приведенному в примере выше. Для этого в последующем я получил хранимую информацию в контексте, ссылаясь на нее через обозначение «#», а не «$», используемое в основном намерении, которое необходимо для получения пользовательского ввода и обучения. Интересно: как мне все это упростить? Можно ли свести все к одному намерению для служебной информации и одному к контактной информации, одновременно позволяя получить результат, аналогичный примеру?

Пример, который лучше объясняет, чего я хотел бы достичь.

User: When can I find Dr Green in his office?
User: what is his email?
Bot: answers with email
User: what about the phone?
Bot: phone number

Могу ли я достичь этого результата с ОДНЫМ намерением и ОДНЫМ намерением для контактной информации? NB. Намерение контакта в этом примере также должно работать, если первый ответ пользователей: «Что такое электронная почта доктора Грина?» и конечно если пользователь продолжает спрашивать: «А его номер телефона?». Это возможно? Как?

1 Ответ

0 голосов
/ 20 февраля 2020

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

Решение состоит в том, что ваш механизм диалога / выполнения должен отслеживать факт того, что пользователь запросил определенного c доктора, и сохранять эту информацию для будущих запросов. Вы должны сделать это на стороне вашего заявления. Для более сложных ситуаций, подобных этой, использование инструмента создания диалогов может иметь смысл.

Вариант 1: Использование переменных выполнения для отслеживания контекста

Если вы хотите поддерживать ТОЛЬКО вышеуказанное диалоговое окно, вы может сделать следующее:

Начиная с вашего намерения "whereIsDoctor" будет обязательный объект "доктор". Кажется, у вас уже есть это.

User: When can I find Dr Green in his office?
Bot: answer with office hours

Здесь вам нужно установить переменную в вашем исполнении, возможно, doctor = "Dr Green".

User: what is his email?
Bot: answers with email

Как только вы получите queryEmail Намерение совпало, вам нужно проверить, если вы установили переменную доктора, и если да, предоставьте динамический c ответ.

Если нет, ваше выполнение, скорее всего, захочет ответить «Какой вы доктор? ссылаясь на?" и затем у вас есть намерение, когда пользователь должен только спросить, к какому врачу вы обращаетесь, queryDoctor намерение с той же сущностью доктора.

Вы также можете захотеть ответить "Что такое электронная почта доктора Гринса?" сразу же, в этом случае вы добавите сущность доктора к намерению queryEmail также как необязательную сущность.

Опция 2: Использование инструмента для создания диалогов, такого как Narrative

Если вы используете инструмент, подобный Narrative (полное раскрытие; я автор), для построения вашего диалога, фреймворк обрабатывает настройки контекста и переменные для вас.

Сначала мы будет определять нашу сущность доктора и наши два намерения, queryOfficeHours и queryEmail:

// NLU
const doctor: Entity = {
  name: "Doctor",
  enums: [
    { name: "Dr Green", alts: ["Doctor Green", "Mr Green"] },
    { name: "Dr Brown", alts: ["Doctor Brown", "Mrs Brown"] }
  ]
}

const queryOfficeHours: Intent = {
  entities: {
    doctor
  },
  noEntityReset: true, // Since we don't want to reset the entity on an empty query
  examples: [
    // Examples With the doctor entity
    "when is _doctor here?",
    "when can I meet _doctor?",
    "When can I find _doctor in his office?",

    // Examples without the doctor entitiy
    "when is the doctor in his office",
    "what are your office hours",
    "when is the doctor here"
  ]
}

const queryEmail: Intent = {
  entities: {
    doctor
  },
  noEntityReset: true, // Since we don't want to reset the entity on an empty query
  examples: [
    "what is _doctor email",
    "what is the email to _doctor",
    "can I get _doctor email",
    "what is his email",
    "what is her email",
    "can I get his email"
  ]
}

Обратите внимание, что оба намерения имеют сущность доктора в качестве необязательного слота, то есть есть примеры с AND без сущности.

Диалог, который мы определяем в простом повороте бота, с условиями, если переменная доктора верна (т.е. установлена):

const queryDoctor: BotTurn = {
  say: "How can I help you?",
  user: [
    {
      intent: queryOfficeHours,
      bot: [
        {
          cond: { doctor: true },
          say: "_doctor's office hours are 8am - 3pm" // This would be dynamically fetched from an API likely
        },
        {
          say: "Which doctor are you referring to?",
          repair: true
        }
      ]
    },
    {
      intent: queryEmail,
      bot: [
        {
          cond: { doctor: true },
          say: "_doctor can be reached at _email"
        },
        {
          say: "Which doctor's email do you want?",
          repair: true
        }
      ]
    }
  ]
}
...