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")
)
main_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 已弃用。 , 在理解新架构方面需要帮助