如何使用 Dialogflow 设计有状态对话

How to design stateful conversation with Dialogflow

我正在尝试制作一个应用程序,通过 Google Home 和 Dialogflow 来预订我办公室的会议室。 这是我的计划:

Me: "OK Google, is there any available room now?"
Google Home: "Room 1 is available until 16:00."
Me:  "Book it."
Google Home: "Booked Room 1."

目前的问题是如何让Google首页的响应有状态。在我的计划中,当我说 "Book it" 时,Google 主页必须记住房间 1。但我不知道如何实现它。

我阅读了对话文档 API,但我不明白可以在同一个对话 ID 中保留变量或状态。 https://developers.google.com/actions/reference/v1/conversation

有人知道吗?

将状态保存为用户与你的 Action 进行的对话的一部分是绝对可能的,甚至相当容易。 Dialogflow 使他们所谓的 context 变得特别容易,它以几种方式使用它:

  1. 作为实现的一部分,您可以设置上下文、该上下文适用的生命周期(对话中的步骤数)以及该上下文的任何 parameter/value 对.使用您的示例,当您使用房间号和时间回复 Action 时,您可以使用对 {"room": "1"} 和 {"time": " 设置 "pending_request" 上下文2017-11-15T16:00Z"} 生命周期为 5.

  2. 您可以指示作为 Intent 的一部分,必须设置哪些上下文才能在对话中选择该 Intent。因此,在 "pending_request" 上下文处于活动状态时询问 "Who is available?" 可能会触发一个 Intent,该 Intent 会查看当时有空的人可以在那个房间见面(可能是因为他们在同一栋楼里)。但是,如果上下文未激活,它可能会触发一个 Intent 以查看您现在可以呼叫的可用人员(即使他们在不同的建筑物中)。

  3. 您在Context中设置的参数在调用的Intent中可用。这样您就可以了解为实现 Intent 而设置的空间和时间。

  4. 如果您不更新上下文,它将在选定的交换次数后消失。这意味着在查询房间后,您可以查询今天是否有任何约会(与房间或时间无关的问题)并且短语 "Book it" 仍然可以使用它的上下文。

如果您使用 Google 中的 node.js client library,则可以使用 app.getContext()app.setContext()。如果您在 JSON 中执行此操作,则需要直接在响应中提供上下文信息。

Google 还提供了一个更通用的 app.data 对象,您可以使用 node.js 客户端库为其设置属性,并且这些属性在对话期间保留(尽管不在对话之间).它在幕后使用上下文,尽管它不如上下文强大,因为您不能将它用作意图匹配的一部分。

(顺便说一句 - 您提供的 link 是 API 的第 1 版。该版本已被弃用,将于 2018 年 5 月关闭。它也用于 Actions API 而不是 Dialogflow。等效文档位于 https://developers.google.com/actions/reference/rest/conversation-webhook,但如果您使用的是 Dialogflow,那可能不是您想要的。)