如何使用DialogFlow触发意图?

时间:2018-04-08 07:03:23

标签: dialogflow

我与对话框流程进行对话,选择喜欢的饮品类型,然后根据饮品类别提供跟进问题(即跟进意图)。

在意图选项卡下,我有以下意图:

  • 默认欢迎意图
  • 最喜欢的饮料意图
  • 咖啡意图
    • 跟进
  • 软饮料意图
    • 跟进
  • 果汁意图
    • 跟进

我使用喜欢的饮料意图中的训练短语并询问:

"你最喜欢的饮料是什么?"

并将响应存储在实体@drink中。

但我不知道如何触发意图"软饮料"," juice"或"咖啡"意图取决于用户的反应。如果我正在编写代码,我会使用switch语句或者if / else但是这个问题并不适用于此。

我不确定是否必须使用实现内联编辑器,或者我可以在Intent UI中执行此操作。

由于

1 个答案:

答案 0 :(得分:3)

一般而言 - 将Intent视为捕捉用户可能会说的内容。尽管Intents也有回复,但这并不是他们的主要目的。

根据您正在尝试做的事情,有一些方法。所有这三个都需要履行代码,您可以使用内置编辑器执行,或者(更好)使用更多在您控制下的webhook

如果您想使用Intents来确定如何回复

这不是最好的主意,但它是可能的。在您的履行代码中,您将根据用户的选择对参数进行switch语句。基于此,您将从履行中触发followup event。您的其他意图将使用可能的事件填充事件部分,系统将选择触发哪一个并用于实现/响应。

这可能是你想要的东西。

更新以根据评论中的问题进行澄清。直接发送事件会触发不同的Intent。有时这就是你想要的,但它有点特殊。大多数时候你想使用下面的方法之一。特别是,您应该记住,Intents主要用于表示用户尝试做什么(他们打算做什么),这主要是由他们所说的内容来表示。意图很好地捕捉人们谈话的复杂方式,而不是强迫他们进入类似电话树的对话"。

如果您只想以不同方式回复每个可能的用户回复

您可以使用履行webhook代码来确定应向用户发送的响应。您没有说明您正在使用的库,但通常您会编写代码来确定应根据所选的饮品类型向用户发送哪些消息,并将其作为演讲和/或在response中显示文字。

在这些情况下,你不会使用另一种,饮用特定的Intents。他们没有任何需要。除非...

您希望以不同的方式回复每个用户的回复,后续对话可能会有所不同

请记住 - 意图非常适合指定用户所期望的内容。不是你期望回复的。因此,如果他们选择咖啡(您可能会询问他们想要多少糖)或果汁(您可能会问他们是否需要吸管),您可能会有不同的对话。

在这种情况下,您仍然可以像上一种情况一样(使用您的履行在您的回复中包含定制的消息,可能是为了提示他们提供该信息)并在回复中包含Output Context表明他们的选择。您应该将此作为响应的一部分,而不是在Intent中进行设置,因为您希望为每种饮料类型命名不同。

然后,您可以根据您今天的用户创建特定于每种饮料类型的Intent。对于特定于Coffee的那些,您可以设置输入上下文以要求已设置咖啡上下文。苏打水的情况,如果他们指定苏打水,等等。

更新,因为您在评论中指出这听起来像您感兴趣的大道。

在这种情况下,您按照(几乎)所描述的那样做:

  1. 使用类似

    的代码获取drink参数的值
    const drink = request.body.queryResult.parameters.drink;
    
  2. 根据这个进行切换,并在每个案例的正文中设置我们将回复的内容以及我们应该记住的上下文。像这样的伪代码,可能是:

    switch( drink ){
      case 'coffee':
        context = 'order_coffee';
        msg = 'Do you want sugar with that?';
        break;
      case 'soda':
        context = 'order_soda';
        msg = 'Do you want a bottle or can?';
        break;
      case 'juice':
        context = 'order_juice';
        msg = 'Would you like a straw?';
        break;
    }
    // Format JSON setting the message and context
    
  3. 然后,您将根据两件事的组合触发Intents:

    1. 背景是什么

    2. 用户说了什么

    3. 例如,如果order_coffee上下文处于活动状态并且用户回答了您的问题,您会想要一个上下文(让我们称之为" coffee.black")用"否"或者"只是黑色"或其他有效组合。

      但是,如果order_juice上下文处于活动状态且用户回复了#34;否",那么您需要一个不同的上下文(例如," juice.nostraw")。

      如果用户说'#34;否"那么它根本没有意义。虽然order_soda上下文有效,但您希望尝试将其引导回手头的主题。

      请记住,Intent是针对用户所说的。不是你的配音代理所说的。您的代理人通常不会触发"意图 - 用户根据他们所说的内容触发它。

      在我给出的示例中,可能有其他Intent对每个上下文都有效。例如,你可能有一个" coffee.sugar"对order_coffee上下文有效的意图并回复他们说"是"。另一个他们可能会说" Just cream"。他们可能还会说很多其他的事情,但对于您的代理人而言,他们给您的指示与订购咖啡有关。

      关于你原来的问题......

      (要回答您原来的,现在已编辑的问题:是的,您可以在履行中创建意图。但是,您几乎肯定不想这样做。)