首页 > 解决方案 > DialogFlow 跟进触发空响应

问题描述

我有一个 DialogFlow 意图跟进,但我很难处理。这是我主要意图的唯一后续行动,我遇到的问题是,当incidents.data数组为空时,它不会conv.ask在 else 情况下触发语句,并导致 DialogFlow 抛出空语音响应错误。代码看起来像这样:

app.intent('metro_timetable - yes', async (conv: any) => {
  const incidents = await serviceIncidents.getIncidents();
  if (incidents.data.length > 0) {
    conv.ask('I have incidents')
  } else {
    conv.ask(
      `I wasn't able to understand your request, could you please say that again?`
    );
  }
});

incidents.data存储在全局范围内,并设置在metro_timetable意图的深处。它存储事件以供跟进。因为所有yes响应都会触发跟进,所以我设置了一个 else 案例,所以如果有人说yes什么时候metro_timetable不理解他们的原始请求并要求他们重复它,它就会捕获它。如果incidents.data确实有信息可以正确共享对话框,则会正确触发并I have incidents正确读取给用户。

在 DialogFlow 中,它看起来像这样。我在哪里错了?

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

标签: dialogflow-esactions-on-google

解决方案


您的描述实际上是如何设置的有点令人费解incidents.data,但听起来可能不是将其设置为空数组,而是根本没有设置。在这种情况下,我怀疑发生了以下情况:

  1. incidents.data将是未定义的
  2. 试图评估incidents.data.length会导致错误
  3. 由于程序崩溃,您的 webhook 不会返回结果。由于您可能没有在 UI 中为意图设置结果,因此返回了一个空结果。

你可以通过做一个测试来解决这个问题,例如(例如)

incidents && incidents.data && incidents.data.length > 0

但是,您的另一个问题似乎是您为实际上不希望将其作为后续的场景设置了后续意图。这是您可能不应该使用后续意图的原因之一,而是仅在您发送一个上下文有意义的响应时设置一个上下文,并在您定义的上下文中查找“是”响应。然后,当metro_timetable不理解请求时,您不设置上下文并给出错误。

为此,您将从metro_timetable-followup两个 Intent 中删除自动生成的上下文。您将创建自己的上下文,我将timetable为此示例命名。

metro_timetableIntent 的实现中,如果您以需要确认的内容进行响应(即 - 当“是”将是用户所说的内容时),您可以timetable使用类似的内容设置上下文

conv.contexts.set('timetable',2);
conv.ask('Are you sure?');

然后,您可以创建一个 Intent 来检查timetable传入上下文并具有与“是”等效的训练短语。在那个意图中,你会做你需要做的事情并做出回应。


推荐阅读