如何在对话流中保持流的相同意图
How to keep the flow in the same intent in dialogflow
我正在使用 google 上的操作和 dialogflow 代理来构建聊天机器人。我正在开发一个开放式对话,用户可以在其中回答一个问题,然后必须提出一个新问题。
代码如下:
app.intent('First', (conv) => {
const ans = conv.parameters.any;
if(type[0] === 'RATING'){
if(ans == 1){
senddata[0] = qstion[0] + ans;
conv.ask(qstion[1]);
}
else if(ans == 2){
senddata[0] = qstion[0] + ans;
conv.ask(qstion[1]);
}
else if(ans == 3){
senddata[0] = qstion[0] + ans;
conv.ask(qstion[1]);
}
else if(ans == 4){
senddata[0] = qstion[0] + ans;
conv.ask(qstion[1]);
}
else if(ans == 5){
senddata[0] = qstion[0] + ans;
conv.ask(qstion[1]);
}
else{
conv.add('Please give a number between 1 and 5.');
}
}
});
当一个问题被问到时,用户需要给出 1 到 5 的答案。如果用户提供任何其他答案,那么他们将收到一条警告消息,提示 'Please give a number between 1 and 5.' 然后流程需要在 'First' 意图本身中,它需要留在那里,直到用户输入从 1 到 5 的数字。但是因为我在 dialogflow 中设置了流程,它应该从第一到第二。因此,即使在提示消息之后,流程也会转到 'Second' 意图。
如何在 'First' 意图本身中保持流程?
问题是 Intents 应该确定用户说了什么而不是你用它做了什么或对话流程.因此,一般来说,您需要一个 Intent 来捕获给出评分的用户,并且您的代码将确定他们正在回复什么问题并适当地处理它。
您可能想使用 Followup Intents,它在幕后使用上下文来管理流程。这只会让事情变得更糟——尤其是当你所有的意图都有相同的训练短语时。同样,虽然您可以通过使用输入和输出来管理对话 contexts,但如果您的所有 Intent 都具有相同的训练短语,那么您需要做更多的工作。
最好使用您设置的 Context parameters 来跟踪当前问题。然后,您可以拥有一个“评分”Intent,该 Intent 在用户给出评分时进行捕获,读取正在处理的问题,保存该问题的值,然后前进到下一个问题。
简化您的代码以删除冗余部分,它可能看起来像这样:
app.intent('Rating', (conv) => {
// Determine what question we're working with
const questionContext = conv.contexts.get( 'question' );
const questionNumber = (questionContext && questionContext.parameters['number']) || 0;
const ans = conv.parameters.any;
if(type[0] === 'RATING'){
if( ans >= 1 && ans <= 5 ){
// Record the rating
senddata[questionNumber] = qstion[questionNumber] + ans;
// Set the context for the next question with a long lifespan
conv.contexts.set( 'question', 99, {
number: questionNumber+1;
});
// Ask the next question
conv.ask(qstion[questionNumber+1]);
} else {
// They didn't answer between 1 and 5, so this is an error
conv.add('Please give a number between 1 and 5.');
}
}
});
还有几点需要注意:
- 您似乎正在接受
@sys.any
类型。这可能非常低效,并且没有真正利用 Intents 的功能。请记住 - 意图代表用户所说的内容。
- 一个改进可能是使它成为一个
@sys.number
实体类型,因为你知道你想要一个数字。
- 更好的方法可能是创建一个仅具有 1 到 5 评级的自定义实体类型。
- 在这两种情况下,您都会有一个 Fallback Intent,它旨在捕获不匹配的内容并根据您的需要重新提示。
- 由于您正在为 Google 助手构建,您可能希望查看 Actions Builder,其中 使用 scene-based 方法。
- 意图仍然存在 - 但它们更清楚地代表了用户所说的内容,而不是对话的状态。
我正在使用 google 上的操作和 dialogflow 代理来构建聊天机器人。我正在开发一个开放式对话,用户可以在其中回答一个问题,然后必须提出一个新问题。
代码如下:
app.intent('First', (conv) => {
const ans = conv.parameters.any;
if(type[0] === 'RATING'){
if(ans == 1){
senddata[0] = qstion[0] + ans;
conv.ask(qstion[1]);
}
else if(ans == 2){
senddata[0] = qstion[0] + ans;
conv.ask(qstion[1]);
}
else if(ans == 3){
senddata[0] = qstion[0] + ans;
conv.ask(qstion[1]);
}
else if(ans == 4){
senddata[0] = qstion[0] + ans;
conv.ask(qstion[1]);
}
else if(ans == 5){
senddata[0] = qstion[0] + ans;
conv.ask(qstion[1]);
}
else{
conv.add('Please give a number between 1 and 5.');
}
}
});
当一个问题被问到时,用户需要给出 1 到 5 的答案。如果用户提供任何其他答案,那么他们将收到一条警告消息,提示 'Please give a number between 1 and 5.' 然后流程需要在 'First' 意图本身中,它需要留在那里,直到用户输入从 1 到 5 的数字。但是因为我在 dialogflow 中设置了流程,它应该从第一到第二。因此,即使在提示消息之后,流程也会转到 'Second' 意图。
如何在 'First' 意图本身中保持流程?
问题是 Intents 应该确定用户说了什么而不是你用它做了什么或对话流程.因此,一般来说,您需要一个 Intent 来捕获给出评分的用户,并且您的代码将确定他们正在回复什么问题并适当地处理它。
您可能想使用 Followup Intents,它在幕后使用上下文来管理流程。这只会让事情变得更糟——尤其是当你所有的意图都有相同的训练短语时。同样,虽然您可以通过使用输入和输出来管理对话 contexts,但如果您的所有 Intent 都具有相同的训练短语,那么您需要做更多的工作。
最好使用您设置的 Context parameters 来跟踪当前问题。然后,您可以拥有一个“评分”Intent,该 Intent 在用户给出评分时进行捕获,读取正在处理的问题,保存该问题的值,然后前进到下一个问题。
简化您的代码以删除冗余部分,它可能看起来像这样:
app.intent('Rating', (conv) => {
// Determine what question we're working with
const questionContext = conv.contexts.get( 'question' );
const questionNumber = (questionContext && questionContext.parameters['number']) || 0;
const ans = conv.parameters.any;
if(type[0] === 'RATING'){
if( ans >= 1 && ans <= 5 ){
// Record the rating
senddata[questionNumber] = qstion[questionNumber] + ans;
// Set the context for the next question with a long lifespan
conv.contexts.set( 'question', 99, {
number: questionNumber+1;
});
// Ask the next question
conv.ask(qstion[questionNumber+1]);
} else {
// They didn't answer between 1 and 5, so this is an error
conv.add('Please give a number between 1 and 5.');
}
}
});
还有几点需要注意:
- 您似乎正在接受
@sys.any
类型。这可能非常低效,并且没有真正利用 Intents 的功能。请记住 - 意图代表用户所说的内容。- 一个改进可能是使它成为一个
@sys.number
实体类型,因为你知道你想要一个数字。 - 更好的方法可能是创建一个仅具有 1 到 5 评级的自定义实体类型。
- 在这两种情况下,您都会有一个 Fallback Intent,它旨在捕获不匹配的内容并根据您的需要重新提示。
- 一个改进可能是使它成为一个
- 由于您正在为 Google 助手构建,您可能希望查看 Actions Builder,其中 使用 scene-based 方法。
- 意图仍然存在 - 但它们更清楚地代表了用户所说的内容,而不是对话的状态。