Dialogflow 在三次交互后返回一条 "Sorry I can't help" 消息

Dialogflow returning a "Sorry I can't help" message after three interactions

这个问题从今天早上(2019 年 6 月 21 日)开始,影响了我们所有的对话流代理。以前他们一直工作正常,虽然我们在过去一个月里偶尔观察到这种行为,但发现很难重现。

现在我们可以可靠地重现它,它已经敲响了我们所有的语音工作。

我们的 webhook returns 一段 json 像这样触发一个事件将用户移动到下一个意图:

"followupEventInput": {
    "name": "Textbox",
    "languageCode": "en-AU"
}

问题是如果我们在初始触发后使用事件超过两次,用户只会收到一条消息 "Sorry, I can't help" 并且代理会被强制关闭。

Example conversation:
"Talk to Foobar Toys"
  "Welcome to Foobar Toys. How can I help you?" (Start app)
"I'd like to know about Lego"
  "Do you want to know about Technic, or Star Wars lego?" (Invocation started)
"Technic"
  "Are you interested in sets or minifigs?" (Interaction 1)
"sets"
  "What kind of sets?" (Interaction 2)
"cars"
  "Sorry, I can't help." (Failure after interaction 2.)

这与我们一直在使用默认回退意图的行为非常相似,但我们不是。

交互都是事件触发的intent。

如果我们碰巧触发了回退意图或帮助文本,计数器会重置,我们可以继续前进,直到我们下一次点击它。

我们的很多工作流程都涉及超过 2 个交互。所以这是一件大事。任何建议表示赞赏。我花了一两天的时间试图找出一种情况,在这种情况下,如果我们运气不好,这种情况就不会发生。

所以,我们已经找出了造成这种情况的原因,并设法解决了这个问题。

我们的 Agent 由多个意图组成,每个意图都有一个名为 "input." 的必需输入参数 通过我们的 webhook 触发意图是通过使用 follow-up 事件(有时)完成的。在 FireBase 中,这是通过使用如下语句实现的:

agent.setFollowupEvent('message');

其中 "message" 是与您的意图关联的事件的名称。

似乎通过将工作流从 dialogFlow 核心手中夺走,我们以某种方式触发它认为它无法匹配任何意图,即使我们的代码有效地告诉它发送哪个意图对话至。

我们目前的解决方法是有一个匹配 sys.any 的单一意图,不再传回后续事件。

如果有人感兴趣,我有一个非常简单的工作流+firebase 可以重现这个问题。

稍后添加 - 来自 Google

的回复

"it seems that the cause of the issue is the slot filling using @sys.any as an entity. Please don't use @sys.any on slot filing as to this is not a standard practice on using @sys.any."

这是我的设置和我的 hacky 修复:

intent1,由事件 "eventIntent1" 触发,参数 'value' 类型为 @sys.number。 Intent 获取一个数字,将其存储在对话上下文中。如果它还没有四个号码,它通过 followup("eventIntent1") 调用自己来获得另一个号码。

想要的对话:

assistant: "give me a number"
user: "1"
assistant: "give me a number"
user: "2"
assistant: "give me a number"
user: "3"
assistant: "give me a number"
user: "4"
assistant: "You gave me 1 2 3 4"

实际对话:

assistant: "give me a number"
user: "1"
assistant: "give me a number"
user: "2"
assistant: "give me a number"
user: "3"
assistant: "Sorry, I can't help"

修复:

解决方法是设置另一个名为 "intent2" 的意图,该意图由事件 "eventIntent2" 触发。它们的插槽填充是相同的(上面的逻辑),除了 intent1 调用 "eventIntent2" 进行跟进,而 "intent2" 调用 "eventIntent1" 进行跟进。这会欺骗它,使其不会连续多次调用相同的意图。它允许我记录无限数量的值。