Bot Framework SDK瀑布对话框如何保留首步数据并获取消歧用户回复
解决方案
核心原理
你遇到的问题是Bot Framework瀑布流对话框的标准机制导致的:
- 当你调用
step.prompt()后,当前步骤会直接结束,你写在prompt后的return step.next(step.result)是死代码,永远不会执行 - prompt触发后,用户的应答内容会作为下一个步骤的
step.result直接传入,原本首步传递的数据会被覆盖 - 瀑布流内置的
step.values属性是同个对话框内各步骤共享的临时存储区,专门用来解决跨步骤数据传递问题
修改后的代码
消歧步骤修改
async disambiguationStep(step) { logger.info(`FinalAnswer Dialog: disambiguationStep`); // 优先存储首步所有数据,避免后续丢失 step.values.firstStepData = step.result; if (step.result.result.disambiguation) { logger.info("需要消歧"); let disambiguation_options = step.result.result.disambiguation; const message_text = "请问你需要办理哪项业务?"; const data = [ { "title": disambiguation_options[0], "value": disambiguation_options[0] }, { "title": disambiguation_options[1], "value": disambiguation_options[1] }, ] let buttons = data.map(function (d) { return { type: ActionTypes.PostBack, title: d.title, value: d.value } }); const msg = MessageFactory.suggestedActions(buttons, message_text); return await step.prompt(TEXT_PROMPT, { prompt: msg }); } else { logger.info("无需消歧"); return step.next(step.result); } }
应答步骤修改
async answerStep(step) { logger.info(`FinalAnswer Dialog: answerStep`); let model_dispatch, result; // 判断是否走了消歧流程 if (step.values.firstStepData) { // 从共享存储取首步数据,step.result为用户选择的意图 model_dispatch = step.values.firstStepData.model_dispatch; result = step.values.firstStepData.result; // 将用户选择的意图覆盖到识别结果,兼容原有业务逻辑 result.topIntent = step.result; } else { // 未消歧直接使用首步传递的数据 model_dispatch = step.result.model_dispatch; result = step.result.result; } // 原有应答逻辑无需修改 return await step.endDialog(); }
关键改动说明
- 新增
step.values.firstStepData存储首步全量数据,从根源解决数据丢失问题 - 删除了prompt后的无效死代码
- 修复了原代码中变量名拼写错误(
disambiguation_option缺少s) - 应答步骤兼容两种业务场景,无需修改原有后续应答逻辑
内容的提问来源于stack exchange,提问作者Adrián
相关产品推荐
相关产品推荐

