我有一个Dialogflow代理,它将为不同的场所(大学校园的房间)提供指示。我定义了一个“场地”实体,其中预先填充了所有各个场地的名称。
在大多数情况下,这可以正常工作。如果我问“如何到达Beyer大楼”之类的问题,它会发现意图和会场实体(“ Beyer大楼”)。
但是,如果会场名称中包含数字或人名(例如“我如何到达Alan Turing G.107”),则无法发现实体(即使“ Alan Turing G.107”是其中之一)我的预定义实体值)。
相反,它发现了两个系统定义的实体:
当它应该被发现时:
一旦我在一个特定的示例上对其进行了训练,它就可以继续工作……但是有数百种可能的值需要训练。当然Dialogflow应该可以找到预定义的实体名称吗?
有什么办法可以让它“偏爱”用户定义的实体而不是系统定义的实体?
答案 0 :(得分:1)
这是Dialogflows默认方法效果不佳且实际上存在更好的解决方案,但积极劝阻的情况之一。
训练短语有两种模式:Example mode and template mode。示例模式是默认模式,似乎是您一直在使用的模式。使用它,您可以指定完整的训练短语,就像用户说的一样("how can i get to the beyer building"
。然后,Dialogflow尝试解析和注释实体,从而确实偏爱其系统实体。
但是,您可以通过在模板模式下指定短语来解决此问题。使用它,您可以在短语("how can i get to @venue:venue"
中包含实体类型,从而避免Dialogflows自动注释。
唯一的问题是模板模式实际上已被弃用,并且似乎不再可以通过控制台使用(它仍然可以通过API来使用)。
从技术上讲,您实际上并不需要模板模式,您可以通过API通过将短语作为TrainingPhrase
对象发送来手动执行Dialogflow在示例模式下自动执行的完全相同的操作。但是,为此,您必须将短语中的每个短语解析为将实体与语音其余部分分开的部分数组。如果这样做,请不要忘记在零件之间添加空格,因为Dialogflow不会自动这样做。
为什么他们这样做是个谜。实体注释是与意图匹配完全不同的服务,应该是可选的。是因为他们喜欢获取所有这些用户注释的数据吗?谁知道,但这正在使高质量Google Assistant应用的开发比原本更加困难。