如何让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
相关产品推荐
相关产品推荐

