我正在使用Dialogflow和Dialogflow的内联编辑器(适用于Cloud函数和Firebase数据库“实时数据库”)创建聊天机器人。我将把这个聊天机器人与Google Assistant集成在一起。
我必须从数据库中读取一个列表,其中该列表有几个孩子,其中有几个子孩子,很少有子孩子有子孩子。因为输出是一个列表并且包含长文本,所以一次讲所有数据将花费很长时间。因此,我想从列表中输出一个孩子,并向用户寻求许可(“是/否”)为“是否要阅读下一个?”。如果用户说“是”,我将继续阅读直到结尾。如果用户说“否”,我将触发一个事件。在阅读子级甚至子级甚至子级子级之前,向用户请求许可是正确的。
我采用的方法包括在每个用户第一次请求列表时为他们创建一个单独的数据库记录,以跟踪他们在列表中的位置。当用户说是时,从数据库中获取用户的当前项目ID,获取列表中的下一个项目(通过agent.add
将其返回给用户),然后将用户的数据库记录更新为下一个项目的ID,依此类推。直到用户到达列表的末尾。在agent.add()
之后,请agent.setFollowupEvent()
向用户请求权限。如果用户拒绝,则只需重置/删除该用户的数据库记录。
我想问的几个问题:
return
云函数中运行以下代码时,agent.add
被agent.setFollowupEvent
覆盖。我该如何停止?agent.add('I will print the list here!');
agent.setFollowupEvent('SOME_EVENT'); //invoking an intent to ask for the permission.
答案 0 :(得分:1)
除了您要处理的问题之外,您还想在这里提出一些问题。看着每个:
如何阻止setFollowupEvent()
覆盖已设置的消息?
你不知道。 setFollowupEvent()
的重点是切换到其他Intent,而不是当前正在处理的Intent。
大多数时候,您认为自己想要setFollowupEvent()
,但您可能不需要。不要使用它。
那我该如何在说的末尾添加问题?
问一下。
真的,就是这么简单。
您可以将其包含在要发送到agent.add()
的字符串中,或者(根据详细信息)可以在提示符下再进行一次add()
。
但是我不需要触发意图来获得答案吗?
不。那不是目的。
意图捕获用户在说什么,而不是您在问什么或您的代理在做什么。您的成就感会基于触发的Intent以及您知道的有关对话的其余状态来执行某些操作。但是意图只是这些信息的一小部分。
您提到了用户状态。在对话过程中如何跟踪用户状态?
因为看起来您正在使用dialogflow-fulfillment
库,所以最简单的方法是将状态存储在Context中的参数中,并且使用寿命很长(或者您会不断更新)。
因此,第一次触发您的实现时,您可以检查上下文。如果上下文或ID不存在,那么您将生成一个随机用户ID并将其存储在上下文中。随后,您将使用此ID在实时数据库中查找用户信息。
如果我正在从事这项工作,是否需要数据库?
不!如果您只是存储有关用户的一点信息,而该信息将持续对话的整个寿命,则可以将所有信息直接存储在Context参数中。您确实需要确保这些参数名称与您的Intent所具有的任何参数都不会冲突,否则,它们将持续至少与Context一样长。
如果您需要在两次对话之间存储有关此人的信息,则需要研究其他方法。有一个用户ID可用于操作,但已弃用该ID,并计划将其删除。助手还提供了会话存储和用户存储字段,但是如果不需要它们,可以使用dialogflow-fillfillment库使用这些技巧。