DialogFlow会话实体和解析为我数据库中的值

时间:2019-03-30 12:51:38

标签: dialogflow actions-on-google dialogflow-fulfillment

这有点难以解释,所以我希望使用示例将是最有效的。

我们正在构建一种服务,该服务允许Parent维护其Children的列表并针对这些Children执行操作。

Parent是用户向DF代理/意图发表言论。

在使用DF之前,Parent通过Web UI(非DF)将其子级(名称)添加到数据库中。

这意味着我们可能具有如下数据库表示形式

父表

ID  Name
1   User A
2   User B     

儿童桌

ID  NAME  PARENT_ID
1   John  1
2   Jon   2
3   Jake  2

意图短语具有以下格式和参数

"Do {ACTION} for {CHILD_NAME}"

我们遇到的问题是如何解决此问题,以便当代理提取参数时,将其传递给带有正确子名称的实现,以便我们可以使用供用户运行验证并为实现提供上下文的名称。

例如,如果用户A 发表以下讲话

"Do {ACTION} for John"

当将参数传递给实现时,我们如何确保代理提取“约翰”而不是“乔恩”?

我看到了关于会话实体的一些建议,甚至通读了City Streets Trivia Example,但是会话实体似乎依赖于会话特定值的概念(在本例中为子名称,链接中提供的示例中的街道名称)是全局维护的,并非特定于任何用户。

我不确定在我的情况下这将如何工作。我不能期望保留所有可能名称的列表,即使可以,我也会有多个 John Jon 条目,而仍然没有代理知道我要使用哪个代理的方式。

也许有一种方法可以根据我们存储在数据库中的值来动态添加每次使用的实体占位符以及该实体的参数的可能值,但这似乎难以维护且不切实际?

在DF中使用对话设计解决此类问题的解决方案是什么?似乎很常见(将项目标记为待办事项列表或购物清单应用程序)。

1 个答案:

答案 0 :(得分:1)

这是一个很长的问题,所以我将主要答复

  

我们如何确保代理在提取代理时提取“约翰”而不是“乔恩”   将参数传递给实现?

这可能太简单了,但是在提取名称之后,可以通过后续问题与用户确认拼写。

User: "Do {ACTION} for John"

Agent: "Ok, I heard, 'Do {ACTION} for John.' Is that correct?"

User: "Yes"

// call updateDatabase()

使用没有屏幕的设备的Google Assistant用户仍然会遇到问题,但是您可以编写其他逻辑来处理response branching for surface capabilities,例如...

const hasScreen =
conv.surface.capabilities.has('actions.capability.SCREEN_OUTPUT');
const hasAudio =
conv.surface.capabilities.has('actions.capability.AUDIO_OUTPUT');
const hasMediaPlayback =
conv.surface.capabilities.has('actions.capability.MEDIA_RESPONSE_AUDIO');
const hasWebBrowser =
conv.surface.capabilities.has('actions.capability.WEB_BROWSER');

如果表面没有屏幕,则可以将名称字符串拆分为数组,然后将每个字符读回用户,例如...

Agent: "Ok, I heard, 'Do {ACTION} for John, spelled 'J', 'O', 'H', 'N'.' Is that correct?"