0

在下面的屏幕截图中,我遇到了话语冲突,这很明显,因为我在两个话语中都使用了相似的样本模式。

在此处输入图像描述

我的问题是,我正在开发的技能需要在多个话语中使用类似的模式,我不能强迫用户说“是的,我想继续”或“我想存储……”之类的话。

在这种情况下,避免话语冲突以及具有多种相似模式的最佳实践是什么?

我可以使用单个话语并根据用户所说的内容来决定要做什么。

这是我脑海中的一个例子:

用户说反对{note} 在技能中我检查了这一点:

if(this$inputs.note.value === "no") {
  // auto route to stop intent
} else if(this$inputs.note.value === "yes") {
  // stays inside the same intent
} else {
  // does the database stuff and saves the value.
  // then asks the user whether he wants to continue
}

上述循环一直持续到用户说“不”。

但这是正确的方法吗?如果没有,最佳做法是什么?请建议。

4

1 回答 1

1

问题实际上在于,对于这两个意图,您有没有上下文的插槽。我还假设您将这些插槽用作包罗万象的插槽,这意味着您想要捕获该人所说的所有内容。

从经验来看:这很难/令人讨厌,并且不会带来良好的用户体验。

对于HaveMoreNotesIntent您想要做的是有一个单独的YesIntentNoIntent然后根据意图历史记录(又名context)将用户路由到正确的功能/意图。您只需在配置文件中启用此功能。

YesIntent() {
  console.log(this.$user.$context.prev[0].request.intent);
  // Check if last intent was either of the following
  if (
    ['TutorialState.TutorialStartIntent', 'TutorialLearnIntent'].includes(
      this.$user.$context.prev[0].request.intent
    )
  ) {
    return this.toStateIntent('TutorialState', 'TutorialTrainIntent');
  } else {
    return this.toStateIntent('TutorialState', 'TutorialLearnIntent');
  }
}

或者,如果您在某个内,您可以在该州内有“是”和“否”意图,这些意图只能在该州工作。

ISPBuyState: {
  async _buySpecificPack() {
    console.log('_buySpecificPack');
    this.$speech.addText(
      'Right now I have a "sports expansion pack". Would you like to hear more about it?'
    );
    return this.ask(this.$speech);
  },
  async YesIntent() {
    console.log('ISPBuyState.YesIntent');
    this.$session.$data.productReferenceName = 'sports';
    return this.toStatelessIntent('buy_intent');
  },
  async NoIntent() {
    console.log('ISPBuyState.NoIntent');
    return this.toStatelessIntent('LAUNCH');
  },
  async CancelIntent() {
    console.log('ISPBuyState.CancelIntent()');
    return this.toStatelessIntent('LAUNCH');
  }
}

我希望这有帮助!

于 2020-03-31T13:53:11.963 回答