【问题标题】:How to loop through a question Microsoft Azure如何遍历一个问题 Microsoft Azure
【发布时间】:2021-10-09 14:17:22
【问题描述】:

我是 Microsoft 服务的新手,并且已经通过向其提供包含问题和答案的 excel 文件构建了我的 QnAMaker。发布 QnA Maker 后,我下载了代码并在 Bot Framework Emulator 上对其进行了测试。该文件包含作为答案的产品名称和作为问题的产品描述。当用户给出产品描述时,如果它与文件中的描述之一匹配,产品名称将作为答案生成。 该机器人要求用户提供有关产品的一些详细信息,然后它会查找一些触发 QnA 答案的关键字。但是如果机器人找不到任何答案,我希望它再次询问用户(至少 3 次),如果 3 次后没有任何问题,它应该只说“对不起......”。

谁能指导我如何做循环部分。是否应该在代码中完成?

namespace Microsoft.BotBuilderSamples.Dialog
{
/// <summary>
/// QnAMaker action builder class
/// </summary>
public class QnAMakerBaseDialog : QnAMakerDialog
{
    // Dialog Options parameters
    public const string DefaultNoAnswer = "Sorry, I couldn't find any 
match. Could you please give me more details?";
    public const string DefaultCardTitle = "Did you mean:";
    public const string DefaultCardNoMatchText = "None of the 
above.";
    public const string DefaultCardNoMatchResponse = "Thanks for the 
feedback.";

    private readonly IBotServices _services;
    private readonly IConfiguration _configuration;

    /// <summary>
    /// Initializes a new instance of the <see 
cref="QnAMakerBaseDialog"/> class.
    /// Dialog helper to generate dialogs.
    /// </summary>
    /// <param name="services">Bot Services.</param>
    public QnAMakerBaseDialog(IBotServices services, IConfiguration 
configuration) : base()
    {
        this._services = services;
        this._configuration = configuration;
    }

    protected async override Task<IQnAMakerClient> 
GetQnAMakerClientAsync(DialogContext dc)
    {
        return this._services?.QnAMakerService;
    }

    protected override Task<QnAMakerOptions> 
GetQnAMakerOptionsAsync(DialogContext dc)
    {
        return Task.FromResult(new QnAMakerOptions
        {
            ScoreThreshold = DefaultThreshold,
            Top = DefaultTopN,
            QnAId = 0,
            RankerType = "Default",
            IsTest = false
        });
    }

    protected async override Task<QnADialogResponseOptions> 
GetQnAResponseOptionsAsync(DialogContext dc)
    {
        var noAnswer = (Activity)Activity.CreateMessageActivity();
        noAnswer.Text = this._configuration["DefaultAnswer"] ?? 
 DefaultNoAnswer;

        var cardNoMatchResponse = 
 (Activity)MessageFactory.Text(DefaultCardNoMatchResponse);

        var responseOptions = new QnADialogResponseOptions
        {
            ActiveLearningCardTitle = DefaultCardTitle,
            CardNoMatchText = DefaultCardNoMatchText,
            NoAnswer = noAnswer,
            CardNoMatchResponse = cardNoMatchResponse,
        };

        return responseOptions;
    }
}

}

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 不确定你面临什么问题和你尝试了什么,在bot框架中浏览对话框提示和瀑布对话框的概念。根据情况,您可以在聊天机器人中使用此对话框。
  • 所以首先我在 QnAMaker 中创建了一个 KB,包括多轮对话。然后我用 C# 发布并下载了源代码。我在我的知识库中创建了一个问题,要求用户对他/她正在寻找的产品进行一些描述。如果找到匹配项,机器人将给出结果。但如果机器人找不到任何匹配项,我希望它要求用户提供更多详细信息。现在,机器人一直在说,当用户输入错误时,它一遍又一遍地找不到匹配项。我希望它在 3 次尝试后停止。我应该在哪里做?提前致谢。
  • 我不知道您的机器人是如何设置的,但通常是的,您会在代码中执行此操作。每次 QnA Maker 返回默认答案时,您都可以增加一个状态变量(对话状态最有意义)。然后对您的输出活动设置一个条件,即如果您的“noAnswer”变量 > 3,则执行其他操作。如果您能展示一些您的特定代码,我或许可以帮助您将一些特定于您的设计的东西放在一起。
  • 遗憾的是,我同时使用了 nodejs,而且我相信一种较旧的问答方法。这与我的实现完全不同。我可以尝试根据我在回答中的方法提供一些指导,但它不会是您的应用程序的 1:1 解决方案。

标签: azure azure-web-app-service botframework qnamaker


【解决方案1】:

我使用的问答方法略有不同,而且我使用的是 nodejs,所以这可能不是 100% 适用于您,但这是我将用于此类功能的方法,因此希望对您有所帮助你或其他人试图完成同样的事情。

添加状态跟踪的一般算法是这样的:

  1. 使用输入活动查询 QnA Maker 服务
  2. 检查答案的置信度分数
  3. 如果分数高于阈值,请重置“无答案计数器”并发送带有答案的活动(或将其返回到根对话框)
  4. 如果分数低于阈值,则增加“无应答计数器”。如果“无应答计数器”低于阈值,则重新提示用户。如果“无应答计数器”高于阈值,请回复“抱歉...”消息。

这是我将如何在 nodejs 中实现它。在我的情况下,我只将答案活动返回到根对话框。但看起来您在 QnAMakerDialog 中传递了 DialogContext,因此您可以直接发送活动。您确实需要确保将您的 conversationState 对象传递给对话框,我假设并分别将其命名为 conversationStatedialogState 用于状态对象和状态访问器。

const conversationData = await this.dialogState.get(dc, {});
var outputActivity = null;
var repromptAnswer = `Text or card if no answer found`
var defaultAnswer = `Text or card if no answer found after threshold met`
var qnaResult = await QnAServiceHelper.queryQnAService(context.activity.text, oldState);
if (qnaResult[0].score > MINIMUM_SCORE) {
  outputActivity = MessageFactory.text(qnaAnswer);
  conversationData.noAnswerCounter = 0;
} else {
  conversationData.noAnswerCounter = conversationData.noAnswerCounter+1 || 1;
  if (conversationData.noAnswerCounter <= 3) {
    outputActivity = repromptAnswer;
  } else {
    outputActivity = defaultAnswer;
}
await this.conversationState.saveChanges(dc);
return outputActivity;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-25
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多