BotBuilder Python - 处理多个对话和意图

Posted

技术标签:

【中文标题】BotBuilder Python - 处理多个对话和意图【英文标题】:BotBuilder Python - Handling multiple dialog and intent 【发布时间】: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
        )

问题

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

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

任何帮助将不胜感激!

【问题讨论】:

请查看我对您的 Github 问题的回答。一旦我们在那里缩小了您的问题,我将在此处发布答案。 @moustacheman 你能解决这个问题吗?我检查了 Wailes 在 Github 上的解决方案,并想了解您是否有任何添加可以使其正常工作。 @Vijay 我最后只有一个对话框MainDialog,请在下面查看我的答案。 @moustacheman 我没有看到你的答案!!! @Vijay 抱歉耽搁了,现在看看。 【参考方案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 工具根据意图确定执行单个对话框。请在这里找到我的答案 - ***.com/questions/62655197/…

以上是关于BotBuilder Python - 处理多个对话和意图的主要内容,如果未能解决你的问题,请参考以下文章

从 Viber bot 向 botbuilder-viber 发送消息时出现错误 ERR_INVALID_ARG_TYPE

Microsoft BotBuilder Bot State API 已弃用。 , 在理解新架构方面需要帮助

MS BotBuilder:机器人如何在网络聊天开始时接收参数并发起对话

python——对图像进行卷积操作,使用多个滤波器

Python 在不同的日志级别记录到多个处理程序?

如何用python把多个csv文件数据处理后汇总到新csv文件