Намерение для отслеживания не будет подходящим инструментом для этой работы, вы можете использовать его для упрощения управления контекстом для последующих вопросов, которые задает бот . В этом случае пользователь задает дополнительный вопрос.
Решение состоит в том, что ваш механизм диалога / выполнения должен отслеживать факт того, что пользователь запросил определенного 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
}
]
}
]
}