在测验中,我如何代替“说 A、B 或 C”让用户使用三个响应词之一?

问题描述

VIA 操作控制台,而不是 Dialogflow!
几天后,我终于完成了一个像这样工作的测验。
Google Mini 说:“法国的首都是哪里?A)罗马,B)柏林还是 C)巴黎?”

在我的场景中,我有两个条件。

scene.slots.status == "FINAL" && intent.params.choosenABC.original == session.params.antwort

AND

!(scene.slots.status == "FINAL" && intent.params.choosenABC.original == session.params.antwort)

所以在这里,这些条件检查用户是否说出了来自会话参数“antwort”的正确字母。 只要用户说“A”、“B”或“C”,一切都会顺利进行。

但是我如何将条件与用户所说的进行比较?
在上面的示例中,我希望用户能够说出“罗马”或“柏林”或“巴黎”以及检查这些条目的条件。

提前致谢!

解决方法

里面有很多问题,让我们来看看每个问题。

input.params.original 是否存在?

简而言之,是的。您可以看到 documentation of the request Intent object 并且您会看到有 intent.params.*name*.original。您的问题似乎表明这也适用。

还有 intent.params.*name*.resolved 包含您考虑类型别名后的值。

我在 Dialogflow 论坛上发现了一些变量...

这些只有在您使用 Dialogflow 时才有效,而在您查看 Action Builder 时没有任何意义。

如何匹配

您没有显示 session.params.antwort 的可能值或您如何设置 antwort。但听起来你在处理程序中设置它是有道理的。因此,您可以做的一件事是将 antwort 设置为城市名称(或任何完整的单词答案)并将 letter 设置为带有有效回复的字母。然后针对 original 测试两者以查看是否匹配。

但是,说实话,这开始变得有些混乱。

您也没有说明 Intent 是如何设置的,或者您是否使用实体类型来捕获答案。然而,处理这个问题的一个好方法是创建一个可以表示答案的类型,并使用 runtime type override 来设置该值的可能值和别名。然后,您可以准确控制要用于比较的有效值是什么。

例如,如果您创建一个名为“Answer”的类型,那么在您提出问题时,您可以使用类似的内容为此设置可能的值

conv.session.typeOverrides = [{
    name: 'Answer',mode: 'TYPE_REPLACE',synonym: {
      entries: [
        {
          name: 'A',synonyms: ['A','Rome']
        },{
          name: 'B',synonyms: ['B','Berlin']
       },{
          name: 'C',synonyms: ['C','Paris']
       }
    ]
  }
}];

如果您有一个带有 Answer 类型参数且名称为 answer 的 Intent,那么您可以测试 intent.parameter.answer.resolved 是否包含预期的字母。

添加可视化界面

如果您还决定添加对 visual selection response(例如列表)的支持,则使用运行时类型覆盖特别有用。视觉响应建立在运行时类型覆盖的基础上,以添加用户可以在适当设备上选择的视觉别名。但是,当您收到回复时,它会被视为他们说出了条目名称。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...