如果在 Dialogflow / Api.ai 中遇到超时限制(5 秒),如何管理对话流?
How to manage the conversation flow if face timeout limit (5 seconds) in Dialogflow / Api.ai?
我正在使用 Fulfillment 在 Dialogflow 上制作一个机器人。考虑到 DialogFlow 中给定的严格 5 秒 window,我得到 [empty response] 作为响应。
我想解决这个问题,但是我的网络服务需要超过 9 秒才能执行。
我正在考虑以这样一种方式重新设计对话流程,即我们将开始流式传输音频直到响应被处理。
Example:
User Question: xx xxx xxx xxxx xxxxx?
Response: a). We'll play fixed audio to keep the user engaged for few seconds till it finds a response text in the back end;
b).
Receive answers from the web service and save them in the session to
display further.
我怎样才能做到这一点以及如何处理超时问题?
您的方向是正确的,但还有许多其他事项需要考虑。
但是,首先请记住,任何试图“避免”5 秒超时的行为都表明设计存在一些问题。等待 10 秒的回复是相当长的时间,对于像语音这样的交互式东西!即使是 5 秒,也就是超时,也是很长的时间。 (并且无法更改此超时。)
因此,您可能想要做的第一件事是考虑是否有 better/faster 方法来完成您想要的事情。
如果没有,粗略的做法是这样的:
- 获取用户请求。
- 跟踪与用户相关或与会话相关的唯一标识符。您将使用它作为某种数据库或数据存储的密钥。
- 作为异步请求的一部分或在另一个线程中启动 API 调用。
- 立即回复您正在以用户将发送另一个请求的方式处理它。 (有关此问题,请参见下文。)您需要确保将 ID 作为此会话的一部分进行维护 - 因此您需要将其保存为会话数据的一部分。
此时 - 您基本上是在同时做两件事。
当 API 调用完成时,它需要根据标识符将结果保存在数据存储中。 (它无法将其保存在会话本身中 - 该响应已发送回智能助理。)
您也在等待用户的回复。当它进来时:
- 查看您是否已为本次会话保存回复。
- 如果没有,则返回第 4 步。(您可能想跟踪您到达此处并在某个时刻放弃的次数。)
- 如果您确实有结果,请用信息回复用户。
您在第 4 步中的回复方式存在问题,因为您想做的事情可以保证您从期待答案的人那里再次请求。有几种可能的方法:
最直接的方法是发回媒体响应以播放几秒钟的“暂停音乐”。这样做的好处是,当音乐停止时,它会向 Dialogflow 发送一个事件,您可以将其捕获为 Intent,然后继续执行步骤 5。
但是有一些问题:
- 并非所有版本的智能助理都支持媒体响应。在使用之前,您需要检查以确认该功能是否受支持,如果不支持,请使用其他方法(见下文)。
- 某些智能助理上显示的媒体播放器允许用户停止播放,或者在某些情况下音频停止时不会正确发送事件。所以你可能永远不会在这个会话中收到另一个请求。
另一种方法涉及一些更高级的对话设计技巧,因此可能并不总是适合您的对话。您的回复可以说您正在查找结果,但随后会向用户询问一个问题——可能是与您需要的其他信息相关的问题。通过他们的回复,您可以收集这些信息(如果您需要),然后查看是否有结果。
在某些对话中 - 这非常有效。例如,如果您正在查找飞往某个地方的航班,在查找时您可能会问他们是否需要旅馆或租车,无论如何您都可能会问。
其他的对话,却不会轻易出现这样的问题。在这些情况下,您可能需要在拖延时间时问一些不相关的问题。
我正在使用 Fulfillment 在 Dialogflow 上制作一个机器人。考虑到 DialogFlow 中给定的严格 5 秒 window,我得到 [empty response] 作为响应。
我想解决这个问题,但是我的网络服务需要超过 9 秒才能执行。
我正在考虑以这样一种方式重新设计对话流程,即我们将开始流式传输音频直到响应被处理。
Example:
User Question: xx xxx xxx xxxx xxxxx?
Response: a). We'll play fixed audio to keep the user engaged for few seconds till it finds a response text in the back end;
b). Receive answers from the web service and save them in the session to display further.
我怎样才能做到这一点以及如何处理超时问题?
您的方向是正确的,但还有许多其他事项需要考虑。
但是,首先请记住,任何试图“避免”5 秒超时的行为都表明设计存在一些问题。等待 10 秒的回复是相当长的时间,对于像语音这样的交互式东西!即使是 5 秒,也就是超时,也是很长的时间。 (并且无法更改此超时。)
因此,您可能想要做的第一件事是考虑是否有 better/faster 方法来完成您想要的事情。
如果没有,粗略的做法是这样的:
- 获取用户请求。
- 跟踪与用户相关或与会话相关的唯一标识符。您将使用它作为某种数据库或数据存储的密钥。
- 作为异步请求的一部分或在另一个线程中启动 API 调用。
- 立即回复您正在以用户将发送另一个请求的方式处理它。 (有关此问题,请参见下文。)您需要确保将 ID 作为此会话的一部分进行维护 - 因此您需要将其保存为会话数据的一部分。
此时 - 您基本上是在同时做两件事。
当 API 调用完成时,它需要根据标识符将结果保存在数据存储中。 (它无法将其保存在会话本身中 - 该响应已发送回智能助理。)
您也在等待用户的回复。当它进来时:
- 查看您是否已为本次会话保存回复。
- 如果没有,则返回第 4 步。(您可能想跟踪您到达此处并在某个时刻放弃的次数。)
- 如果您确实有结果,请用信息回复用户。
您在第 4 步中的回复方式存在问题,因为您想做的事情可以保证您从期待答案的人那里再次请求。有几种可能的方法:
最直接的方法是发回媒体响应以播放几秒钟的“暂停音乐”。这样做的好处是,当音乐停止时,它会向 Dialogflow 发送一个事件,您可以将其捕获为 Intent,然后继续执行步骤 5。
但是有一些问题:
- 并非所有版本的智能助理都支持媒体响应。在使用之前,您需要检查以确认该功能是否受支持,如果不支持,请使用其他方法(见下文)。
- 某些智能助理上显示的媒体播放器允许用户停止播放,或者在某些情况下音频停止时不会正确发送事件。所以你可能永远不会在这个会话中收到另一个请求。
另一种方法涉及一些更高级的对话设计技巧,因此可能并不总是适合您的对话。您的回复可以说您正在查找结果,但随后会向用户询问一个问题——可能是与您需要的其他信息相关的问题。通过他们的回复,您可以收集这些信息(如果您需要),然后查看是否有结果。
在某些对话中 - 这非常有效。例如,如果您正在查找飞往某个地方的航班,在查找时您可能会问他们是否需要旅馆或租车,无论如何您都可能会问。
其他的对话,却不会轻易出现这样的问题。在这些情况下,您可能需要在拖延时间时问一些不相关的问题。