如何在Node.js Bot中实现LUIS与QnA Maker的意图联动场景?
问题解答:LUIS触发意图后调用QnA Maker返回答案的场景完全可行!
你的需求完全可以实现,核心思路就是当LUIS匹配到指定意图(比如你的common_question)时,主动调用QnA Maker的识别逻辑,从知识库中提取对应答案返回给用户。
先看你现有代码的几个小问题:
- IntentDialog的初始化写法有误,
recognizers需要是配置对象的属性,正确格式是{ recognizers: [luisRecognizer, qnarecognizer] } - 你直接写了
session.send('answerEntity.entity'),这只是输出固定字符串,没有实际获取QnA返回的答案数据 - 调用
qnarecognizer.recognize时,需要传入用户的实际提问文本,才能让QnA匹配对应的问答对
下面是修正后的完整示例代码,我会逐段解释:
// 正确初始化IntentDialog,传入LUIS和QnA识别器 var intents = new builder.IntentDialog({ recognizers: [luisRecognizer, qnarecognizer] }); bot.dialog('/', intents); // 处理common_question意图 intents.matches('common_question', function (session, args, next) { session.send('Intent common'); // 调用QnA Maker识别用户当前的提问文本 qnarecognizer.recognize(session.message.text, function (error, result) { // 检查是否有有效结果,同时通过score阈值过滤低匹配度的内容 if (!error && result && result.score > 0.7) { // QnA会返回匹配度从高到低的答案数组,取第一个即可 var qnaAnswer = result.answers[0].answer; session.send(qnaAnswer); } else { // 如果QnA没有匹配到合适的答案,返回兜底回复 session.send("Sorry, I don't have an answer for that right now."); } }); });
关键注意点:
- QnA的匹配精度:建议在你的QnA知识库中,给"who are you?"这个问答对添加更多变体问题,比如"tell me who you are"、"what's your name?"等,这样QnA能更精准匹配用户的不同提问方式。
- 阈值设置:代码里的
result.score > 0.7是自定义的匹配阈值,你可以根据实际需求调整,过滤掉匹配度太低的无效结果。 - LUIS意图优化:如果希望LUIS能更准确识别
common_question意图,也可以在LUIS的该意图下添加更多示例 utterance(比如"tell me who you are"),确保用户的提问能稳定触发这个意图。
这样调整后,当用户提问"Tell me who you are"时,流程就会按你期望的走:LUIS触发common_question意图 → 代码调用QnA Maker识别提问 → 返回对应的"Hi I'm your bot! "答案。
内容的提问来源于stack exchange,提问作者Fraangel
相关产品推荐
相关产品推荐

