Amazon Lex中的标记验证/解析

时间:2019-05-10 22:35:38

标签: python amazon-lex

我想做一个简单的报价机器人,它需要了解地址和尺寸。目前,我已经与python状态机和rasa NLU一起入侵了意图对象,尽管数据的性质意味着大多数实体可以通过手工更好地提取。

例如,一个开始的句子可能是“我想从A邮政编码A向B邮政编码B发送4个盒子,它们分别是3 x 3 x 3m”。这些地址需要进行验证,可能涉及来回验证(您是指该邮政编码还是该状态?这不是有效的匹配项,请从此列表中进行选择,等等...)。

此外,验证的顺序可能很奇怪。例如,可能有一个郊区,邮政编码和is_valid插槽。有几种可能:他们可以输入有效的S + P,仅输入S,仅输入无效的S,分别有效但不匹配的有效S和P等。在某些情况下,我想推迟验证以使用其他信息,例如,如果给出了无效的郊区但有效的邮政编码,我将使用该邮政编码来告知有关正确郊区的建议。但是,如果给出了无效的郊区但没有邮政编码,那么就没有必要要求邮政编码了,因为我想先获得一个有效的郊区。这样,按照我所知,插槽排序为“郊区”,“邮政编码”,“ is_valid”并不能完全削减。

我想对郊区和邮政编码的验证调用只能拥有自己的一组switch语句,这些语句可以查看可能同时填充的其他插槽?似乎有点鸡蛋和鸡蛋,同样也需要等待它们的验证,并且可能最终需要从Lambda内部调用Lambda。例如,如果验证失败,则漫游器会要求提供更多信息,但是验证 信息可能需要与原始输入不同的 进程/ lambda

也可能是它们没有包含有关该对象的任何详细信息,在这种情况下,需要在地址内容全部整理完后再提示它。例如,如果他们未能包含有关尺寸的信息,我想问“尺寸是多少”,并允许它们仅包含度量值或重量和数量-我将其理解为标准插槽填充。

所以我的问题是:在Lambda中进行验证调用实际上导致对话中的旁路有多困难/合理?以前我在插槽填充设置中通过在整个位置放置“ is_valid”插槽来完成类似的操作(特别是如果我不想简单地抛出“无效”错误并自动重新询问原始问题) ')。有更好的方法吗?

此外,一个人如何管理“中断”意图?也就是说,一组意图将触发“您要重新启动吗?”一种问题,如果用户回答“否”,它将返回到原始状态;理想情况下,如果用户回答“是”,则可以返回到对话中的特定点(我想这可以通过将适当的广告位重置为空来实现) )

此外,不拘泥于Amazon Lex的想法,任何减少模板代码数量的预先罐头案例也是不错的选择。

道歉。

1 个答案:

答案 0 :(得分:0)

哇,好的,这就是我能提供的:

1。验证困难

  

在Lambda中进行验证调用实际上导致对话中出现小路有多困难/合理?

构建复杂的验证和对话算法是服务机器人Lex开发人员的标准做法。因此,可以预期必须自己在Lambda或其他地方进行操作,而只是将Lambda用作中间对象,这是非常合理的。因此,困难就在您手中,也许您可​​以找到可用于验证地址和邮政编码(例如Google Maps)的API,以简化该部分。

2。 'is_valid'插槽

  

以前,我是在插槽填充设置中通过在整个位置放置“ is_valid”插槽来完成类似的操作(尤其是如果我不想简单地抛出“无效”错误并自动重新询问)原始问题”)。有更好的方法吗?

Lex确实有更好的方法:sessionAttributes!一个好的做法是仅创建用于容纳实现每个意图所需值的插槽。对于其他任何方面,您都可以愉快地依靠sessionAttributes来跟踪会话路径,插槽有效性,插槽历史记录,意图历史记录,中断意图等,等等,等等。你可以想象。如何组织机器人逻辑并跟踪其中convo的当前和过去状态完全取决于您。

例如:您可能有广告位:postalCodeA
并且在sessionAttributes中还具有:postalCodeA_validpostalCodeA_confirmedpostalCodeA_attempts等。

并使用这些sessionAttributes值确定逻辑中的对话路径。如果发现插槽无效,则可以将该值保存在..._attempts的{​​{1}}或..._history列表中,然后将sessionAttributes设置为..._valid,然后重置插入false的广告位,然后使用说明原因的信息重新引出该广告位,或者尝试引出地址而不是邮政编码的广告位。

3。中断意图

  

此外,一个人如何管理“中断”意图?也就是说,一组意图将触发“您要重新启动吗?”这类问题

正如我之前暗示的那样,答案也是null!当您的用户处于一个意图(intentA)内时,Lex会首先尝试使用其输入来填充当前引发的插槽,但是如果不匹配,Lex还将检查输入是否与其他意图的话语相匹配。因此,您可能会有一个中断意图(intentB),并带有诸如“让我们重新开始”,“没关系”,“备份”之类的话语。然后,在所有常规意图中,您都将该意图的插槽值保留在{{ 1}},以及类似sessionAttributes之类的信息,以防用户以前在哪里发生变化。

这将允许您处理如下的中断意图:

  1. 用户输入intentA
  2. intentA填充了一些插槽,并将其备份到sessionAttribtues
  3. 用户说“让重新开始”触发intentB
  4. intentB要求确认取消intentA

(是),intentB在从last_intent删除intentA值之后实现了意图,并让用户以sessionAttributes开始并询问“我还能为您提供什么帮助?”

(否)intentB将用户传递回intentA(您知道这是因为您跟踪了sessionAttributes),并通过elicitIntent发送了确认继续使用intentA的确认:“好的,我仍然记得在哪里我们退出了,您要继续进行{intentA action}吗?” (响应将发送到intentA,您可以在其中进行处理)。

  1. (如果用户希望继续使用intentA),则intentA会填充sessionAttributes.last_intent中的新空插槽,并使用其他confirmIntent值继续执行算法直至算法停止运行,从而得出相同的结果。它最后一次打开的插槽,并且您的机器人的智能给用户留下了深刻的印象。 =)