对话流在三次交互后返回"对不起,我帮不上忙"消息



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

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

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

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

问题是,如果我们在初始触发后使用事件两次以上,用户只会收到一条消息"对不起,我帮不上忙",并且代理会被强制关闭。

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.)

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

交互都是由事件触发的意图。

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

我们的许多工作流程涉及 2 次以上的交互。所以这是一件大事。任何建议表示赞赏。我花了一两天的时间试图找出一个场景,在这种情况下,这种情况不会发生在我们身上,根本没有运气。

因此,我们已经找出了导致这种情况的原因,并设法解决了它。

我们的代理由几个意图组成,每个意图都有一个称为"input"的必需输入参数。通过我们的 webhook 触发意图(有时)是通过使用后续事件完成的。在 FireBase 中,这是通过使用如下语句来实现的:

agent.setFollowupEvent('message');

其中"消息"是链接到您的意图的事件的名称。

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

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

如果有人感兴趣,我有一个非常简单的工作流程+火力库来重现这个问题。

稍后添加 - 来自谷歌的回应

"问题的原因似乎是使用@sys.any作为实体填充插槽。请不要在插槽归档中使用@sys.any,因为这不是使用@sys.any的标准做法。

这是我的设置和我的黑客修复:

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"

修复:

修复是设置另一个由事件"eventIntent2"触发的名为"intent2"的意图。它们的插槽填充是相同的(上面的逻辑),除了 intent1 调用"eventIntent2"进行跟进,而"intent2"调用"eventIntent1"进行跟进。这会诱使它没有连续调用时间的相同意图。它允许我记录无限数量的值。

最新更新