Dialogflow es 如何使用dialogflow构建自然的对话流?

Dialogflow es 如何使用dialogflow构建自然的对话流?,dialogflow-es,chatbot,Dialogflow Es,Chatbot,我正在Dialogflow的帮助下构建一个聊天机器人。帮助用户检索医生的办公时间、联系方式等信息。我创建了三个intent do detect,当用户想要知道办公时间、联系信息或办公地址时。例如,用户可以问机器人:“格林医生的电子邮件是什么?”。它工作正常。 但我也想达到这个结果: User: When can I find Dr Green in his office? Bot: answer with office hours User: Where is his office? Bot:

我正在Dialogflow的帮助下构建一个聊天机器人。帮助用户检索医生的办公时间、联系方式等信息。我创建了三个intent do detect,当用户想要知道办公时间、联系信息或办公地址时。例如,用户可以问机器人:“格林医生的电子邮件是什么?”。它工作正常。 但我也想达到这个结果:

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
我已经通过后续行动部分实现了这一结果,但我认为这不是正确的方法。我目前的结构是:

  • 接触意图

    • 跟进-办公时间
    • 跟进-办公室地址
  • 办公时间意向

    • 跟进-联络
    • 跟进-办公室地址
  • 办公地址意向

    • 跟进-办公时间
    • 跟进-联系方式
我想尝试结合与office信息相关的两种意图,但最重要的是,我想允许进行上面示例中的对话。为此,在接下来的讨论中,我通过符号“#”引用上下文中存储的信息,而不是在获取用户输入和培训所需的主要意图中使用的“$”。我想知道:我怎样才能简化这一切?是否可以将所有内容简化为一个用于办公室信息的意图和一个用于联系信息的意图,同时允许获得类似于示例的结果

这是一个更好地解释我想要实现的目标的例子

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

我可以用一个目的和一个目的来获取联系信息吗?注意。在本例中,如果用户的第一个答案是“What is The email of dr.Green?”,当然如果用户继续问:“and his phone number?”,那么联系意图也需要起作用。有可能吗?怎么做

后续意图不是此工作的正确工具,您可以使用它简化bot正在询问的后续问题的上下文管理。在这种情况下,用户提出了一个后续问题

解决方案是,您的对话框引擎/实现需要跟踪用户已查询特定医生的事实,并保存该信息以备将来查询。您必须在应用程序的实现端执行此操作。对于像这样更复杂的情况,使用对话框创作工具是有意义的

选项1:使用实现变量跟踪上下文 如果只想支持上述对话框,可以执行以下操作:

首先,您的“whereIsDoctor”意图将有一个强制性的医生实体。你好像已经有这个了

User: When can I find Dr Green in his office?
Bot: answer with office hours
在这里,您需要在履行中设置一个变量,可能是
doctor=“Dr Green”

一旦您获得了查询邮件目的匹配,您需要检查是否设置了医生变量,如果设置了,则提供动态答案

如果不是,您的履行可能希望回答“您指的是哪位医生?”然后有一个意图,即用户只需要询问您指的是哪位医生,一个具有相同医生实体的queryDoctor意图

您可能还希望能够立即回答“What is Dr Greens email?”问题,在这种情况下,您还可以将医生实体作为可选实体添加到queryEmail意图中

选项2:使用对话框创作工具,如“讲述人” 如果您使用诸如(完全公开;我是作者)之类的工具来构建对话框,那么框架将为您处理上下文设置和变量

首先,我们将定义我们的医生实体和两个意图,queryOfficeHours和queryEmail:

//NLU
常量医生:实体={
姓名:“医生”,
枚举:[
{姓名:“格林博士”,备选:[“格林博士”、“格林先生”]},
{姓名:“布朗博士”,备选:[“布朗博士”、“布朗夫人”]}
]
}
常数查询办公时间:意图={
实体:{
医生
},
noEntityReset:true,//因为我们不想在空查询中重置实体
示例:[
//具有doctor实体的示例
“你的医生什么时候来?”,
“我什么时候可以见医生?”,
“我什么时候能在他的办公室找到医生?”,
//没有医生实体的例子
“医生什么时候在办公室”,
“您的办公时间是什么时候”,
“医生什么时候来?”
]
}
const querymail:Intent={
实体:{
医生
},
noEntityReset:true,//因为我们不想在空查询中重置实体
示例:[
“什么是医生电子邮件”,
“给医生的电子邮件是什么”,
“我能收到医生的电子邮件吗”,
“他的电子邮件是什么”,
“她的电子邮件是什么”,
“我能收到他的电子邮件吗?”
]
}
请注意,这两个意图都将doctor实体作为可选插槽,即有带实体和不带实体的示例

我们在一个简单的bot回合中定义的对话框,如果doctor变量为true(即set),则该对话框具有以下条件:

const queryDoctor:BotTurn={
说:“我能帮你什么?”,
用户:[
{
目的:查询办公时间,
机器人:[
{
条件:{医生:正确},
比如:“医生的办公时间是上午8点到下午3点”//这可能是从API动态获取的
},
{
说:“你指的是哪位医生?”,
修复:正确
}
]
},
{
意向:QueryMail,
机器人:[
{
条件:{医生:正确},
说:“可以通过电子邮件联系医生”
},
{
说:“你想要哪封医生的电子邮件?”,
修复:正确
}
]
}
]
}
User: what is his email?
Bot: answers with email