You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:46:38