Bluemix Conversation,推进对话
Bluemix Conversation, advancing the conversation
我定义了两个对话节点。第一个在 conversation_start 上触发并询问用户的姓名。第二个将来自 input.text 的用户名存储在上下文变量中,并询问用户是否想进行简短调查或做其他事情。第二个永远不会执行。为了推进对话,第二个触发器应该是什么?尚未设置意图或条件。基本上,我只想遵循一个珍珠串模式,在这个模式中,每个问题都会被询问,并让用户选择退出一些问题。
有两种主要方法可以实现这一点。我推荐的方法是为每种可能的方式创建一个意图。例如,您可以创建一个名为 #affirmative
的意图,其值为 "Yes"、"Yeah"、"Sure"、"Ok" 等。您所要做的就是创建意图,然后在条件字段中使用它。
但您也可以使用 input.text
直接检查用户的输入。例如,您可以使用 input.text.toLowerCase() == 'yes'
作为条件。请记住,只有在您控制输入并且只允许几个可能的值时才应该使用它。如果没有,请使用意图并让 Watson Conversation 为您处理输入解析。
Watson Conversation 提供的另一个非常酷的功能可以让您受益,即拥有一个具有 intents[0].confidence < 0.6
条件和 "Sorry, I didn't get that" 响应的节点。这样你就可以确保你的流程只会触发对意图有很高信心的条件。
希望对您有所帮助!
您可以使用 jump to
函数将系统路由到任意 dialog_node - 这非常适合创建定向对话框。因此,每当您想继续下一个问题(用户回答了上一个问题)时,您可以使用跳转到处理上一个问题答案的节点来向用户提出另一个问题(跳转到下一个对话节点的正文部分问新问题)。
现在,对于 "get name" 用例,您希望第二个节点从挂在 conversation_start 节点上的用户输入中收集名称。如果对话遇到一个有子节点的节点,下一轮对话的处理将从该对话节点的第一个子节点开始 - 这样上下文对话就在对话中定义了。
Bluemix Conversation 可以被认为是一个状态机。每个转换都在工具中用图表表示,但每个节点只能由条件触发。因此,如果您在一个节点上提问,并且返回的答案不会触发其中一个子节点,则状态不会转换为子节点。输入到节点中的答案由 Watson 处理,Watson 提供 "intents",这些基本上是在他刚刚分析的句子中找到的关键字。因此,推进对话的一种方法是使用 # 前缀将 named "intents" 匹配到子节点中的触发器。另一种使用 @ 前缀匹配命名 "entities" 的方法,尽管不太清楚 Watson 如何构建实体。第三种方法是使用 $ 前缀和简单的条件运算符(例如 ==)来匹配上下文变量。上下文变量完全由您(开发人员)管理。您可以在每个节点设置一个上下文变量。然后你可以用它来触发一个子节点。这似乎是管理我想要实现的对话类型的好方法。第四种方法是使用前一个父节点的输入值和简单的条件运算符。
我定义了两个对话节点。第一个在 conversation_start 上触发并询问用户的姓名。第二个将来自 input.text 的用户名存储在上下文变量中,并询问用户是否想进行简短调查或做其他事情。第二个永远不会执行。为了推进对话,第二个触发器应该是什么?尚未设置意图或条件。基本上,我只想遵循一个珍珠串模式,在这个模式中,每个问题都会被询问,并让用户选择退出一些问题。
有两种主要方法可以实现这一点。我推荐的方法是为每种可能的方式创建一个意图。例如,您可以创建一个名为 #affirmative
的意图,其值为 "Yes"、"Yeah"、"Sure"、"Ok" 等。您所要做的就是创建意图,然后在条件字段中使用它。
但您也可以使用 input.text
直接检查用户的输入。例如,您可以使用 input.text.toLowerCase() == 'yes'
作为条件。请记住,只有在您控制输入并且只允许几个可能的值时才应该使用它。如果没有,请使用意图并让 Watson Conversation 为您处理输入解析。
Watson Conversation 提供的另一个非常酷的功能可以让您受益,即拥有一个具有 intents[0].confidence < 0.6
条件和 "Sorry, I didn't get that" 响应的节点。这样你就可以确保你的流程只会触发对意图有很高信心的条件。
希望对您有所帮助!
您可以使用 jump to
函数将系统路由到任意 dialog_node - 这非常适合创建定向对话框。因此,每当您想继续下一个问题(用户回答了上一个问题)时,您可以使用跳转到处理上一个问题答案的节点来向用户提出另一个问题(跳转到下一个对话节点的正文部分问新问题)。
现在,对于 "get name" 用例,您希望第二个节点从挂在 conversation_start 节点上的用户输入中收集名称。如果对话遇到一个有子节点的节点,下一轮对话的处理将从该对话节点的第一个子节点开始 - 这样上下文对话就在对话中定义了。
Bluemix Conversation 可以被认为是一个状态机。每个转换都在工具中用图表表示,但每个节点只能由条件触发。因此,如果您在一个节点上提问,并且返回的答案不会触发其中一个子节点,则状态不会转换为子节点。输入到节点中的答案由 Watson 处理,Watson 提供 "intents",这些基本上是在他刚刚分析的句子中找到的关键字。因此,推进对话的一种方法是使用 # 前缀将 named "intents" 匹配到子节点中的触发器。另一种使用 @ 前缀匹配命名 "entities" 的方法,尽管不太清楚 Watson 如何构建实体。第三种方法是使用 $ 前缀和简单的条件运算符(例如 ==)来匹配上下文变量。上下文变量完全由您(开发人员)管理。您可以在每个节点设置一个上下文变量。然后你可以用它来触发一个子节点。这似乎是管理我想要实现的对话类型的好方法。第四种方法是使用前一个父节点的输入值和简单的条件运算符。