1

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

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

Parent用户向 DF 代理/意图发出话语。

Parent使用 DF 之前,通过 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"

我们如何确保代理在将参数传递给履行时提取“John”而不是“Jon”?

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

我不确定在我的情况下这将如何工作。不能指望我维护所有可能名称的列表,即使可以,我也会有多个JohnJon的条目,并且仍然无法让代理知道我会假设使用哪个。

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

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

4

1 回答 1

1

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

我们如何确保代理在将参数传递给履行时提取“John”而不是“Jon”?

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

User: "Do {ACTION} for John"

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

User: "Yes"

// call updateDatabase()

对于使用没有屏幕的设备的 Google 助理用户,您仍然会遇到问题,但您可以编写额外的逻辑来处理表面功能的响应分支,例如...

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?"
于 2019-04-01T18:07:04.987 回答