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

如何让QnA Maker返回匹配搜索关键词的多组问答对?

解决QnA Maker返回所有匹配问答对的问题

我来帮你搞定这个问题!其实QnA Maker本身支持返回多个匹配结果,只是默认配置通常只返回Top 1,结合你的场景,你可以通过以下步骤实现需求:

1. 调整QnA Maker查询的Top参数

首先,你需要在调用QnA Maker服务时,将Top参数设置为一个足够大的值(比如5或10),这样服务就会返回所有匹配度较高的结果,而不是仅第一组。同时建议设置ScoreThreshold过滤低匹配度结果,避免无关内容干扰用户:

var qnaOptions = new QnAMakerOptions
{
    Top = 5, // 设置返回最多5个匹配结果
    ScoreThreshold = 0.5 // 过滤匹配度低于50%的结果
};

var response = await _qnaMaker.GetAnswersAsync(turnContext, qnaOptions);

2. 重写RespondFromQnAMakerResultAsync处理多结果逻辑

接下来在自定义的QnAMakerDialog中重写该方法,当检测到多个匹配结果时,生成交互式选项让用户选择具体问题:

protected override async Task RespondFromQnAMakerResultAsync(ITurnContext turnContext, QnAMakerResult result, CancellationToken cancellationToken)
{
    if (result.Answers.Count > 1)
    {
        // 提取所有匹配的问题文本作为选项
        var questionOptions = result.Answers.Select(answer => answer.Questions.First()).ToList();
        
        // 创建选择提示组件
        var choicePrompt = new ChoicePrompt(nameof(ChoicePrompt));
        choicePrompt.Choices = questionOptions.Select(q => new Choice { Value = q }).ToList();
        
        await turnContext.SendActivityAsync("我找到多个相关问题,请选择你想了解的:", cancellationToken: cancellationToken);
        await DialogContext.PromptAsync(nameof(ChoicePrompt), new PromptOptions { Prompt = MessageFactory.Text("请选择:") }, cancellationToken);
    }
    else if (result.Answers.Count == 1)
    {
        // 仅一个匹配结果时直接返回答案
        await turnContext.SendActivityAsync(result.Answers.First().Answer, cancellationToken: cancellationToken);
    }
    else
    {
        // 无匹配结果时的友好提示
        await turnContext.SendActivityAsync("抱歉,我没找到相关内容。", cancellationToken: cancellationToken);
    }
}

3. 处理用户选择后的逻辑

在对话框的后续步骤中,根据用户选择的问题找到对应答案并返回:

private async Task<DialogTurnResult> OnUserChoiceAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var selectedQuestion = ((FoundChoice)stepContext.Result).Value;
    // 从之前的QnA结果中匹配用户选择的问题
    var qnaResult = stepContext.Options as QnAMakerResult;
    var targetAnswer = qnaResult.Answers.First(answer => answer.Questions.Contains(selectedQuestion));
    
    await stepContext.Context.SendActivityAsync(targetAnswer.Answer, cancellationToken: cancellationToken);
    return await stepContext.EndDialogAsync(cancellationToken: cancellationToken);
}

这样设置后,当用户输入flexible working时,机器人会列出所有匹配的问题("What is flexible working?"和"How to avail flexible working?"),让用户选择后再返回对应的答案。

内容的提问来源于stack exchange,提问作者Souvik Ghosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:34:12