如何在中断Prompt后返回自定义数据?LUIS触发对话框场景
实现LUIS触发的解耦式反馈对话框
我完全理解你想要的效果——让LUIS触发的对话框只专注于返回意图和实体数据,不和业务逻辑耦合,这样业务对话框可以独立处理这些数据,灵活性拉满。下面给你一套具体的实现方案和优化后的代码示例:
核心思路
- 把触发对话框设计成纯数据返回层:它只负责接收LUIS解析后的
args(包含意图、实体),封装成标准化的响应数据,然后直接返回给调用它的业务对话框。 - 通过Bot Framework的
session.endDialogWithResult()方法完成数据传递,这是实现对话框解耦的关键。
完整代码示例
1. 定义LUIS触发的解耦对话框
// 仅负责接收LUIS触发、封装并返回数据的对话框 bot.dialog('NegativeAnswerTriggeredDialog', [ (session, args, next) => { // 从LUIS的args中提取实体和意图相关数据(可根据实际实体名灵活调整) const negativeEntity = args.intent.entities.find(entity => entity.type === "NegativeAnswer"); const response = { type: 'bool', value: false, index: 1, entity: negativeEntity ? negativeEntity.entity : 'No', score: negativeEntity ? negativeEntity.score : 1 }; // 将封装好的数据返回给调用方对话框,结束当前触发对话框 session.endDialogWithResult({ response: response }); } ]).triggerAction({ matches: 'NegativeAnswerIntent', // 绑定LUIS对应的意图 onInterrupted: (session) => { session.send("抱歉,我没太理解你的否定回答,请再试一次?"); } });
2. 业务对话框调用并接收数据
// 业务对话框,独立处理触发对话框返回的数据 bot.dialog('BusinessDialog', [ (session) => { session.send("请问你对这个方案满意吗?"); }, (session, results) => { // 启动触发对话框,等待它返回数据 session.beginDialog('NegativeAnswerTriggeredDialog'); }, (session, results) => { // 拿到触发对话框返回的标准化数据 const feedbackData = results.response; session.send(`收到你的反馈:类型【${feedbackData.type}】,值【${feedbackData.value}】,实体【${feedbackData.entity}】`); // 继续后续业务逻辑... session.endDialog(); } ]);
关键细节说明
- 解耦的核心:
session.endDialogWithResult()方法会把数据传递给上一层对话框(调用它的业务对话框),触发对话框不需要知道任何业务逻辑,只负责数据封装。 - 实体提取的灵活性:如果你的LUIS有多种实体类型,可以在触发对话框里根据
args.intent的内容动态提取对应实体,适配不同的意图场景。 - 错误处理:
onInterrupted回调可以处理用户输入不符合预期的情况,保证触发对话框的鲁棒性。
这样设计之后,触发对话框和业务对话框完全独立——你可以随时修改业务逻辑,或者替换触发对话框的实体解析规则,两边都不会互相影响,完美实现你要的解耦需求。
内容的提问来源于stack exchange,提问作者Victor Lia Fook
相关产品推荐
相关产品推荐

