我正在研究一项Alexa技能,它将具有6个主要目的。在每个意图期间,用户将不得不从动态列表中选择一个项目。我将用类似以下内容提示他们:
假设红色选择1,蓝色选择2,绿色选择3
我目前的计划是要有一个对Select Item {ItemIndex}
做出回应的意图。但是,一旦有了选定的索引,就需要回到最初的意图。对话框将如下所示:
问我的汽车购物者,福特附近有什么存货(由
LookForCarIntentHandler
处理)好的。您要寻找什么颜色?对Kapoor Red说1,对波罗的海绿说2,对白云杉说3
选择第2项(由
SelectItemIntentHandler
处理)太好了。我在距离您3英里内的Silver Spruce中发现了3只福特。您想让我告诉您第一个吗?(来自
LookForCarIntentHandler
的回复)
在这个人为的示例中,颜色非常不寻常,由API驱动,因此我无法真正预先填充广告位值。由于我何时可以设置动态插槽值,因此也很困难。无论哪种方式,在某个时候,我都需要能够按索引进行选择。
到目前为止,我已经考虑了3种选择:
选项1 :向每个意图添加一个{SelectedIndex}
插槽(和话语),并仅使用这些插槽来收集插槽索引。我不喜欢这样做,因为我必须管理很多样板,但至少可以使用。
选项2 :确认原始文档中的索引选择(即使我不是很想),并更新该响应中的意图。也就是说,是否在SelectItemIntentHandler
的回复中使用elicitSlot
指令,并通过提示符“我听说您说项目1 ...是正确的吗?”将处理程序指向原始意图。 / em>然后,这6个顶级意图必须具有Yes/No
插槽类型和用于收集确认值的插槽。我也不很喜欢这个选项。
选项3 :让SelectItemIntentHandler标识先前的意图,并调用该意图的处理程序以返回其结果。感觉并不很棒,但是会在关键时刻达到目的。
选项4 :将逻辑从意图处理程序中完全移除。基本上,构建我自己的状态机来处理意图处理器之外的逻辑。然后,意图处理程序仅负责听取内容并将其放入状态机。例如,我有一个CoffeeBuilder
,一个CarSearchBuilder
和一个BurritoBuilder
。每个处理程序将找出哪个构建器处于活动状态,并将当前状态传递给它。构建器更新状态并返回响应。
然后,什么意图在做什么都没有关系,因为无论如何这些意图都是愚蠢的。因此,根据状态和有效的Builder
,SelectItemIntentHandler
可能会说,“太好了,您要不要炸薯条?” 或”这辆车来了有2扇门或4扇门。您想要几扇门?”
我喜欢这种方法的声音;但是,这很复杂。显然,我真正想做的是说:“好吧,似乎已经选择了一个有效的项目索引,所以OrderCoffeeIntentHandler
,继续并完成对话框。K Thx Bye。”我只是看不到这样做的方法。