Bot Framework中Prompt Choice无匹配时如何将用户文本传入LUIS
这个问题我之前也碰到过!其实核心是你找错了获取用户输入的地方——当Choice Prompt收到非选项的输入时,result里的识别结果是失败的,所以拿不到内容,但用户的原始输入其实一直存在于对话上下文里。下面给你两种可行的解决思路:
方法1:在Dialog的Catch块中获取输入并调用LUIS
当用户输入不匹配选项时,Choice Prompt会抛出验证错误,你可以在Dialog的OnCatchAsync方法里拦截这个错误,从对话上下文直接提取用户输入,再传给LUIS处理:
protected override async Task<DialogTurnResult> OnCatchAsync(DialogContext dc, Exception exception, CancellationToken cancellationToken) { // 从对话上下文获取用户的原始输入文本 var userInput = dc.Context.Activity.Text; // 调用LUIS识别意图 var luisResult = await _luisRecognizer.RecognizeAsync(dc.Context, cancellationToken); var topIntent = luisResult.TopIntent().intent; // 根据识别到的意图执行对应逻辑 switch(topIntent) { case "YourCustomIntent1": await dc.Context.SendActivityAsync("我识别到你想触发自定义意图1啦!"); break; case "YourCustomIntent2": await dc.Context.SendActivityAsync("已处理你的自定义意图2请求"); break; default: await dc.Context.SendActivityAsync("我没理解你的意思,请选择Yes、No或者I'm independent哦"); break; } // 重新启动Choice Prompt,让用户继续选择或输入 return await dc.ReplaceDialogAsync(nameof(YourChoicePrompt), cancellationToken); }
方法2:用自定义Prompt验证器提前拦截输入
如果你想在Prompt验证阶段就处理非选项输入,可以给Choice Prompt添加自定义验证器,在验证失败时直接获取用户输入并调用LUIS:
// 初始化Choice Prompt时添加自定义验证器 var choicePrompt = new ChoicePrompt(nameof(ChoicePrompt)) { Validator = async (promptContext, cancellationToken) => { // 如果输入匹配选项,直接通过验证 if (promptContext.Recognized.Succeeded) { return true; } else { // 获取用户输入文本 var userInput = promptContext.Context.Activity.Text; // 调用LUIS识别意图 var luisResult = await _luisRecognizer.RecognizeAsync(promptContext.Context, cancellationToken); var topIntent = luisResult.TopIntent().intent; if (topIntent == "YourTargetIntent") { // 处理识别到的自定义意图 await promptContext.Context.SendActivityAsync("已识别并处理你的意图请求"); // 返回true表示验证通过,结束当前Prompt return true; } else { await promptContext.Context.SendActivityAsync("请选择列表中的选项,或者输入我能识别的内容哦"); // 返回false表示验证失败,Prompt会重新提示用户 return false; } } } };
关键提醒
不管用哪种方法,都不要从await result里拿用户输入——因为当输入不匹配选项时,Prompt的识别结果是失败的,result.Value会是空的。用户的原始输入始终存在于dc.Context.Activity.Text中,直接用这个值调用LUIS就可以了。
内容的提问来源于stack exchange,提问作者Vaasir Nisaar
相关产品推荐
相关产品推荐

