如何在dialogflow中使流程保持相同的意图

问题描述

我正在使用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确实使用基于场景的方法来提供对话流程设计。
    • 意图仍然存在-但它们更清楚地代表了用户所说的内容,而不是对话的状态。