如何在一个意图中设置上下文和后续事件?
How do I set context and followup event in one intent?
我试图跳转到带有后续事件的随机问题,同时将问题编号存储在上下文中。但是 dialogflow 只跳转到事件而不存储问题编号。有没有一种方法可以执行后续事件并将上下文存储在一个意图中?
app.intent('Quiz - random', (conv) => {
let rand = Math.floor(Math.random() * quiz_len) + 1;
conv.data.current_qns = rand;
conv.followup(`quiz-question${rand}`);
});
不是真的。使用 conv.followup()
的目的是使新 Intent 好像是由用户实际触发的 Intent。请记住 - 意图代表 用户在说什么而不是您回复的内容。您可以在重定向中包含一个参数,我想您可以使用它来发送问题,但这仍然等同于用户发送的参数。
不完全清楚为什么您觉得需要指向不同的 Intent。只是将问题作为答复的一部分提出吗?继续在您所在的 Intent 处理程序中询问它,并将数字直接存储在上下文中。
更新
你在评论中指出你想要构建事物,所以你有一个 "random dispatcher" 然后重定向到一个 Intent 来问一个问题,并且 Intent 有一个接受正确答案的 Followup Intent (可能还有处理错误答案的问题)。
这需要你为所有不同的问题建立很多额外的意图,然后是每个问题的条件。这要求您每次要添加新问题时都重新构建此结构。
Dialogflow 非常适合导航对话的结构 - 因此您无需使用它来导航特定的问题、答案和响应。请记住 - Intents 从广义上模拟用户所说的内容,而不是我们的代理如何响应。
下面是一个可能工作得更好的结构:
- 有一个 Intent 可以处理用户随机提问的问题。 Intent fulfillment 为此(即 - 您的 webhook 中的处理函数)执行以下操作:
- 选择一个问题
- 设置上下文以指示所问的问题
- 将上下文和问题发送给用户
- 还有另一个处理用户响应的 Intent。所有用户响应。如果这是一个多项选择题,您可以设置非常具体的短语,否则您可能需要将其设为具有上面指定的上下文作为输入上下文的后备意图。
- 您的处理程序比较答案。
- 如果正确,请清除上下文,这样说,然后询问他们是否需要另一个问题。 (然后循环到步骤 1 中指定的 Intent。)
- 如果不正确,请确保上下文仍然有效并告诉他们他们错了。可能增加一个计数器,这样你就不会让他们无限期地猜测。
这意味着您只构建了两个处理问题本身的 Intent。您应该再添加一些。以下是一些需要考虑的问题:
- 如果用户什么都不说会怎样? "No Input" 场景的处理方式应不同于错误答案。
- 如果您要问多项选择题,也许您会使用列表并需要处理列表响应。
最后,如果您使用的是列表,您可能想做一些奇特的事情并使用 Dialogflow 的 API 为该问题设置会话实体类型。这允许您为正确和不正确的内容设置您期望的内容(使用一些别名),然后使用 Fallback Intent 作为上下文来说明用户所说的内容没有意义。
我试图跳转到带有后续事件的随机问题,同时将问题编号存储在上下文中。但是 dialogflow 只跳转到事件而不存储问题编号。有没有一种方法可以执行后续事件并将上下文存储在一个意图中?
app.intent('Quiz - random', (conv) => {
let rand = Math.floor(Math.random() * quiz_len) + 1;
conv.data.current_qns = rand;
conv.followup(`quiz-question${rand}`);
});
不是真的。使用 conv.followup()
的目的是使新 Intent 好像是由用户实际触发的 Intent。请记住 - 意图代表 用户在说什么而不是您回复的内容。您可以在重定向中包含一个参数,我想您可以使用它来发送问题,但这仍然等同于用户发送的参数。
不完全清楚为什么您觉得需要指向不同的 Intent。只是将问题作为答复的一部分提出吗?继续在您所在的 Intent 处理程序中询问它,并将数字直接存储在上下文中。
更新
你在评论中指出你想要构建事物,所以你有一个 "random dispatcher" 然后重定向到一个 Intent 来问一个问题,并且 Intent 有一个接受正确答案的 Followup Intent (可能还有处理错误答案的问题)。
这需要你为所有不同的问题建立很多额外的意图,然后是每个问题的条件。这要求您每次要添加新问题时都重新构建此结构。
Dialogflow 非常适合导航对话的结构 - 因此您无需使用它来导航特定的问题、答案和响应。请记住 - Intents 从广义上模拟用户所说的内容,而不是我们的代理如何响应。
下面是一个可能工作得更好的结构:
- 有一个 Intent 可以处理用户随机提问的问题。 Intent fulfillment 为此(即 - 您的 webhook 中的处理函数)执行以下操作:
- 选择一个问题
- 设置上下文以指示所问的问题
- 将上下文和问题发送给用户
- 还有另一个处理用户响应的 Intent。所有用户响应。如果这是一个多项选择题,您可以设置非常具体的短语,否则您可能需要将其设为具有上面指定的上下文作为输入上下文的后备意图。
- 您的处理程序比较答案。
- 如果正确,请清除上下文,这样说,然后询问他们是否需要另一个问题。 (然后循环到步骤 1 中指定的 Intent。)
- 如果不正确,请确保上下文仍然有效并告诉他们他们错了。可能增加一个计数器,这样你就不会让他们无限期地猜测。
这意味着您只构建了两个处理问题本身的 Intent。您应该再添加一些。以下是一些需要考虑的问题:
- 如果用户什么都不说会怎样? "No Input" 场景的处理方式应不同于错误答案。
- 如果您要问多项选择题,也许您会使用列表并需要处理列表响应。
最后,如果您使用的是列表,您可能想做一些奇特的事情并使用 Dialogflow 的 API 为该问题设置会话实体类型。这允许您为正确和不正确的内容设置您期望的内容(使用一些别名),然后使用 Fallback Intent 作为上下文来说明用户所说的内容没有意义。