2

我正在使用 Dialogflow 和 Dialogflow 的内联编辑器(用于云函数和 Firebase 数据库“实时数据库”)创建一个聊天机器人。我会将这个聊天机器人与 Google Assistant 集成。

我必须从数据库中读取一个列表,其中列表有几个孩子,其中很少有子孩子,很少有子孩子有子子孩子。因为输出是一个列表并且包含长文本,所以一次说出所有数据需要很长时间。所以我想从列表中输出一个孩子并请求用户许可(是/否)“你想阅读下一个吗?”。如果用户说“是”,我将继续阅读直到最后。如果用户说“不”,我会触发一个事件。在读一个孩子,甚至是sub-child,甚至是sub-sub-child之前,请求用户的许可是真实的。

我采用的方法包括在每个用户第一次请求列表时为他们创建一个单独的数据库记录,以跟踪他们在列表中的位置。当用户说是时,从数据库中获取用户当前的项目 id,获取列表中的下一个项目(通过 将其返回给用户agent.add),然后将用户的数据库记录更新为下一个项目的 id,依此类推,直到用户到达列表的末尾。之后agent.add(),请求用户的许可agent.setFollowupEvent()。如果用户说不,只需重置/删除该用户的数据库记录。

我想问几个问题:

  • 我将如何将每个用户识别为个人:通过某个 id、会话或其他方式?
  • 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. 
4

1 回答 1

2

除了您正在处理的问题之外,您还有一些要在此处提出的问题。看着每一个:

如何停止setFollowupEvent()覆盖我设置的消息?

你没有。的全部意义setFollowupEvent()在于切换到不同的 Intent,而不是当前正在处理的 Intent。

大多数时候你认为你想要setFollowupEvent(),但你可能不想要。不要使用它。

那么如何在我所说的末尾添加问题呢?

就问吧。

真的,就是这么容易。

您可以将它包含在要发送到的字符串中agent.add(),或​​者(取决于详细信息),您可以add()在提示符下做一秒钟。

但是我不需要触发 Intent 来获得答案吗?

不,这不是 Intent 的用途。

意图捕捉用户在说什么,而不是你在问什么或你的代理在做什么。您的履行会根据触发的 Intent 以及您了解的有关对话的其他状态来执行某些操作。但意图只是其中的一部分信息。

你提到了用户状态。如何在对话期间跟踪用户状态?

由于看起来您正在使用该dialogflow-fulfillment库,因此最简单的方法是将您的状态存储在具有很长生命周期(或者您不断更新)的Context中的参数中。

因此,第一次触发您的履行时,您可以检查上下文。如果上下文或 ID 不存在,那么您将生成一个随机用户 ID 并将其存储在上下文中。随后,您将使用此 ID 在实时数据库中查找用户信息。

如果我在做这项工作,我需要数据库吗?

没有!如果您只是存储关于用户的一点点信息,并且这些信息只会持续对话的生命周期,那么您可以将所有这些信息直接存储在 Context 参数中。您确实需要确保这些参数名称不会与您的 Intent 具有的任何参数冲突,否则这些参数名称将持续与 Context 一样长。

如果您需要在对话之间存储有关此人的信息,那么您将需要研究其他方法。有一个可用于操作的用户 ID,但已弃用并计划将其删除。助手还提供了会话存储和用户存储字段,但如果您不需要它们,使用 dialogflow-fulfillment 库会有点棘手。

于 2018-12-11T14:37:42.877 回答