问题描述
我正在使用Google和dialogflow代理上的操作来构建聊天机器人。我正在开发一个开放式对话,用户在该对话中回答一个问题,然后必须提出一个新问题。
代码如下:
query = """INSERT INTO Wikipedia(Timestamp,URL,Response,StatusCode,Message,IsCriticalError) VALUES (?,?,?)"""
params = (Timestamp,IsCriticalError)
Cursor.execute(query,params)
当用户提出问题时,用户需要提供1到5的答案。如果用户提供了其他答案,则将提示他们“请输入1到5之间的数字”。然后,流程本身必须处于“第一”意图中,并且需要一直停留在该位置,直到用户输入从1到5的数字为止。但是,由于我在dialogflow中设置了流程,因此流程应该从第一至第二。因此,即使在提示消息后,流程仍将转到“第二”意图。
如何使流程保持“第一”意图本身?
解决方法
问题在于,意图应该确定用户说了什么,而不是确定您如何使用它或对话流程。因此,通常,您将需要一个Intent来捕获给出评分的用户,并且您的代码将确定他们正在回答的问题并适当地进行处理。
您可能会想使用“跟进意图”来管理流程,该意图在后台使用了上下文。这只会使事情变得一团糟-尤其是如果您所有的Intent具有相同的训练短语。同样,虽然您可以通过使用输入和输出contexts来管理对话,但是如果所有Intent都具有相同的训练短语,那么您将为自己做更多的工作。
最好使用您设置的Context parameters来跟踪当前问题。然后,您可以有一个“评分”意图,该意图可在用户给出评分时捕获,读取正在处理的问题,将值保存为该问题,然后前进到下一个问题。
简化代码以删除多余的部分,可能看起来像这样:
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
类型。这可能是非常低效的,并且并没有真正利用Intent的功能。记住-意图代表用户所说的话。- 一种改进可能是使
@sys.number
实体类型成为可能,因为您知道自己想要一个数字。 - 更好的做法可能是创建一个仅具有1到5评分的自定义实体类型。
- 在这两种情况下,您都将拥有一个“后备意图”,该意图旨在捕获与您想要的不匹配并重新提示的内容。
- 一种改进可能是使
- 由于您正在为Google Assistant进行构建,因此您不妨查看Actions Builder,确实使用基于场景的方法来提供对话流程设计。
- 意图仍然存在-但它们更清楚地代表了用户所说的内容,而不是对话的状态。