【问题标题】:BotBuilder Python - Handling multiple dialog and intentBotBuilder Python - 处理多个对话和意图
【发布时间】:2020-09-12 07:42:59
【问题描述】:

我有以下代码来处理多个意图,

代码

async def on_message_activity(self, turn_context: TurnContext):
    recognizer_result = await self.luis.recognize(self.recognizer, turn_context)
    intent = self.luis.get_top_intent(recognizer_result)
    await self.process_intent(turn_context, recognizer_result, intent)

async def process_intent(self, turn_context: TurnContext, recognizer_result, intent):
    if intent == 'Greeting_Wishes':
        await greeting_wishes(turn_context, user_info)
    elif intent == 'Greeting_Question':
        await greeting_question(turn_context)
    elif intent == 'Movement':
        dialog = Movement(recognizer_result)
        await DialogHelper.run_dialog(
            dialog,
            turn_context,
            self.dialog_state
        )

问题

  1. 问候意图运行良好
  2. 移动意图正确地进入配置的对话框,但在向用户询问了几个输入之后,当用户输入他们的值时,它要么返回问候意图,要么无处可去,因为意图是 None

有人可以帮助如何通过对话框处理多个意图吗?

任何帮助将不胜感激!

【问题讨论】:

  • 请查看我对您的 Github 问题的回答。一旦我们在那里缩小了您的问题,我将在此处发布答案。
  • @moustacheman 你能解决这个问题吗?我检查了 Wailes 在 Github 上的解决方案,并想了解您是否有任何添加可以使其正常工作。
  • @Vijay 我最后只有一个对话框MainDialog,请在下面查看我的答案。
  • @moustacheman 我没有看到你的答案!!!
  • @Vijay 抱歉耽搁了,现在看看。

标签: python botframework bots azure-language-understanding


【解决方案1】:

我最终拥有了一个主对话框,并根据其他意图扩展了其他对话框。看看下面的代码示例,

async def on_message_activity(self, turn_context: TurnContext):
    recognizer_result = await self.luis.recognize(self.recognizer, turn_context)
    intent = self.luis.get_top_intent(recognizer_result)
    await self.process_intent(turn_context, recognizer_result, intent)

async def process_intent(self, turn_context: TurnContext, recognizer_result, intent):
    if intent == "Greeting_Wishes" and not entity:
        await greeting_wishes(turn_context, user_info)
        return

    if intent == "Greeting_Question" and not entity:
        await greeting_question(turn_context)
        return

    dialog = MainDialog(self.luis, intent, recognizer_result)
    await DialogHelper.run_dialog(
        dialog,
        turn_context,
        self.conversation_state.create_property("DialogState")
    )

ma​​in_dialog.py

在主对话框中,我将检查意图并开始相应的对话框。

class MainDialog(ComponentDialog):
    def __init__(self, luis, intent, recognizer_result):
        super(MainDialog, self).__init__(MainDialog.__name__)

        self.luis = luis
        self.intent = intent
        self.recognizer_result = recognizer_result

        self.add_dialog(SampleDialog1())
        self.add_dialog(SampleDialog2())
        self.add_dialog(
            WaterfallDialog(
                "main_dialog_id", [self.main_step]
            )
        )

        self.initial_dialog_id = "main_dialog_id"

    async def main_step(self, step_context: WaterfallStepContext) -> DialogTurnResult:
        dialog_detail = self.luis.get_entities(self.intent, self.recognizer_result)
        if self.intent == "one":
            return await step_context.begin_dialog(SampleDialog1.__name__, dialog_detail)
        elif self.intent == "two":
            return await step_context.begin_dialog(SampleDialog2.__name__, dialog_detail)

【讨论】:

  • 这很好。但是,当用户从 SampleDialog1 向第一个问题发送输入时(假设它有多个需要用户输入的问题),最终会产生不同的意图。这不会是个问题吗?
  • 谢谢@moustacheman。我刚刚测试过,效果很好。我上面评论的原因是,如果我没有意图,我希望它被定向到 QnA 而不是进入 Dialog。这也可以从主对话框内部实现,但我最终在 DialogTurnStatus.Waiting 上出现属性错误。得到 QnA 的答复后,我将立即结束对话,但它仍然以错误告终。
  • 我能够使用 Dispatch 工具根据意图确定执行单个对话框。请在这里找到我的答案 - stackoverflow.com/questions/62655197/…
猜你喜欢
  • 1970-01-01
  • 2017-11-19
  • 2017-08-07
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多